3 回答

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊
這是兩種不同的情況,一種是方法屬于Product實(shí)例,一種是全局函數(shù)屬于products包。
type Product struct {
Title string
Brand string
Model string
}
// This method add value to a field in Product
func (p *Product) Add(field, value string) {
switch field {
case "Title":
p.Title = value
case "Brand":
p.Brand = value
case "Model":
p.Model = value
}
}
上面提供了一個(gè)方法來(lái)給自己添加值作為 的一個(gè)實(shí)例Product,即
product1 := &Product{}
product1.Add("Title", "first_title")
第二種情況是從product包中公開(kāi)的公共函數(shù)。在這種情況下,Product必須提供a 的實(shí)例(或指針)作為參數(shù)。
package products
func Add(p *Product, field, value string) {
// Same switch-case as above
}
Add 函數(shù)然后可以從任何其他包中使用。
package main
import (
"path/to/products"
)
type Product struct {
// ...
}
func main() {
product1 := &Product{}
products.Add(product1, "Title", "first_title")
通常在您的場(chǎng)景中,首選第一種方法,因?yàn)樗庋b了管理其自身屬性的功能。
第二種情況可能被視為“類(lèi)方法方法”(對(duì)于那些來(lái)自像 Python 或 Java 之類(lèi)的 OOP 的方法),其中包類(lèi)似于類(lèi),公開(kāi)的函數(shù)類(lèi)似于類(lèi)方法,這些方法更通用,可用于多種類(lèi)型實(shí)現(xiàn)相同的接口,如下所示:
package products
// where p is a Product interface
func Add(p Product, field, value string) {
// Same switch-case as above
}
type Product interface {
someMethod()
}
從另一個(gè)包中:
package main
import (
"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")
}

TA貢獻(xiàn)1911條經(jīng)驗(yàn) 獲得超7個(gè)贊
這是按照規(guī)范預(yù)期的:
方法的類(lèi)型是以接收者為第一個(gè)參數(shù)的函數(shù)的類(lèi)型。
見(jiàn)https://golang.org/ref/spec#Method_declarations
因此,當(dāng)您在Add
on 上聲明方法時(shí)Product
,您會(huì)得到一個(gè)函數(shù),該函數(shù)接受一個(gè)指向 a 的指針Product
作為其第一個(gè)參數(shù)。所以你最終得到
func (p *Product) Add()
被翻譯成
func Add(p *Product)
所以你的兩個(gè)電話都是有效的,最終會(huì)做同樣的事情

TA貢獻(xiàn)1841條經(jīng)驗(yàn) 獲得超3個(gè)贊
擴(kuò)展@Danilo 的精彩回答:
package main
import "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()的類(lèi)型是以func F(t *T)接收者(t *T)為第一個(gè)參數(shù)的函數(shù)的類(lèi)型。
- 3 回答
- 0 關(guān)注
- 184 瀏覽
添加回答
舉報(bào)