亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

切片與類型別名作為方法接收器

切片與類型別名作為方法接收器

Go
一只甜甜圈 2022-05-18 14:06:02
我有一個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

  • ...

  • x的類型V,并且T具有相同的基礎類型,并且至少有一個VT不是定義的類型。

方法綁定到具體類型。因此,該Foos.print()方法不適用于其他類型的值,包括[]Foo.

但是您不需要創建變量來調用該方法,您可以簡單地使用類型轉換

Foos(fs).print()

這種轉換不改變內存布局,只改變類型,因此安全高效。我們僅使用它來訪問具有相同基礎類型的類型的方法。


查看完整回答
反對 回復 2022-05-18
  • 1 回答
  • 0 關注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號