我有一個Foo帶有方法的結構print:type Foo struct { Bar string}func (f Foo) print() { fmt.Println(f.Bar)}如果我想打印一片Foo,規范的方法可能是寫一個for循環,并有一個函數來封裝它:func printFoos(fs []Foo) { for _, f := range fs { f.print() }}printFoos([]Foo{})來自 OOP 背景,我覺得這種方法有點不吸引人。我想做的是printFoos與[]Foo:// Invalid Go codefunc (fs []Foo) print() { for _, f := range fs { f.print() }}上述方法不起作用,因為在 Go 中,不能將未命名類型用作方法接收器,如此 Google Group thread中所述。為了規避它,可以寫:type Foos []Foofunc (fs Foos) print() { for _, f := range fs { f.print() }}要使用它,我必須將類型顯式聲明為Foos,所以我仍然不能使用printon[]Foofs := []Foo{}fs.print() // errorvar fss Foos = fsfss.print()我感到困惑的是,在上面的代碼中,fss并且fs顯然屬于同一類型,因為我可以毫無錯誤地分配fs給它fss。但是,我們不能簡單地使用fs.print()Go 并讓 Go 智能轉換。為什么會這樣?
1 回答

四季花海
TA貢獻1811條經驗 獲得超5個贊
我感到困惑的是,在上面的代碼中,
fss
并且fs
顯然屬于同一類型,因為我可以毫無錯誤地分配fs
給它fss
。
你跳到錯誤的結論。具有相同的類型并不是可分配性的必須要求。
fss
有 type Foos
,并且fs
有 type []Foo
,一個未命名的切片類型。確實,它們具有相同的基礎類型,這就是您可以分配fs
到的原因fss
,這在此可分配性規則中有所涵蓋:
如果以下條件之一適用,則值
x
可分配給類型的變量T
(“x
可分配給”):T
方法綁定到具體類型。因此,該Foos.print()
方法不適用于其他類型的值,包括[]Foo
.
但是您不需要創建變量來調用該方法,您可以簡單地使用類型轉換:
Foos(fs).print()
這種轉換不改變內存布局,只改變類型,因此安全高效。我們僅使用它來訪問具有相同基礎類型的類型的方法。
- 1 回答
- 0 關注
- 136 瀏覽
添加回答
舉報
0/150
提交
取消