猿问

方法 vs 函数用法 golang

我知道 func 和 method 之间的区别。但我对以下之间的用法感到困惑:


prod:=Product{"title","brand","model"}

prod.Add()

或者:


prod:=Product{"title","brand","model"}

products.Add(&prod) // products is package


炎炎设计
浏览 141回答 3
3回答

SMILET

这是两种不同的情况,一种是方法属于Product实例,一种是全局函数属于products包。type Product struct {        Title string        Brand string        Model string}// This method add value to a field in Productfunc (p *Product) Add(field, value string) {        switch field {        case "Title":                p.Title = value        case "Brand":                p.Brand = value        case "Model":                p.Model = value        }}上面提供了一个方法来给自己添加值作为 的一个实例Product,即product1 := &Product{}product1.Add("Title", "first_title")第二种情况是从product包中公开的公共函数。在这种情况下,Product必须提供a 的实例(或指针)作为参数。package productsfunc Add(p *Product, field, value string) {        // Same switch-case as above}Add 函数然后可以从任何其他包中使用。package mainimport (        "path/to/products")type Product struct {        // ...}func main() {        product1 := &Product{}        products.Add(product1, "Title", "first_title")通常在您的场景中,首选第一种方法,因为它封装了管理其自身属性的功能。第二种情况可能被视为“类方法方法”(对于那些来自像 Python 或 Java 之类的 OOP 的方法),其中包类似于类,公开的函数类似于类方法,这些方法更通用,可用于多种类型实现相同的接口,如下所示:package products// where p is a Product interfacefunc Add(p Product, field, value string) {        // Same switch-case as above}type Product interface {        someMethod()}从另一个包中:package mainimport (        "path/to/products")type Car struct {        Title string        Brand string        Model string}type Ship struct {        // ...}type Airplane struct {        // ...}// All types implement `Product` and can be used in `products.Add`func (c *Car) someMethod() {}func (s *Ship) someMethod() {}func (a *Airplane) someMethod() {}func main() {       plane := &Airplane{}       products.Add(plane, "Model", "Boeing-747")}

Smart猫小萌

这是按照规范预期的:方法的类型是以接收者为第一个参数的函数的类型。见https://golang.org/ref/spec#Method_declarations因此,当您在Addon 上声明方法时Product,您会得到一个函数,该函数接受一个指向 a 的指针Product作为其第一个参数。所以你最终得到func (p *Product) Add()被翻译成func Add(p *Product)所以你的两个电话都是有效的,最终会做同样的事情

偶然的你

扩展@Danilo 的精彩回答:package mainimport "fmt"type T struct {    i int}func (t *T) F() {    t = &T{1}    fmt.Println(t.i)}func F(t *T) {    fmt.Println(t.i)}func main() {    t := T{2}    (&t).F()    F(&t)}方法func (t *T) F()的类型是以func F(t *T)接收者(t *T)为第一个参数的函数的类型。
随时随地看视频慕课网APP

相关分类

Go
我要回答