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

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

Go 是否支持 map 和 slice 等內置類型的運算符重載?

Go 是否支持 map 和 slice 等內置類型的運算符重載?

Go
一只斗牛犬 2021-11-15 17:13:50
在 python 中,我可以通過定義__getitem__(). 我可以在 Go 中做類似的事情嗎?// What I mean is:type MySlice []MyItem// Definition of MySlice......func (s MySlice) getItem(i int) MyItem {}......// Access is overrided with calling getItem()item := ms[0] //calling ms.getItem(0)// Is this doable?
查看完整描述

2 回答

?
皈依舞

TA貢獻1851條經驗 獲得超3個贊

不,運算符重載不是 Go 的特性。

引用官方常見問題解答來解釋原因

如果不需要進行類型匹配,則方法分派會得到簡化。使用其他語言的經驗告訴我們,擁有多種名稱相同但簽名不同的方法有時很有用,但在實踐中也可能會令人困惑和脆弱。僅按名稱匹配并要求類型的一致性是 Go 類型系統中一個主要的簡化決定。

關于運算符重載,它似乎更方便而不是絕對要求。同樣,沒有它,事情會更簡單。


查看完整回答
反對 回復 2021-11-15
?
慕仙森

TA貢獻1827條經驗 獲得超8個贊

你可以使用map類型做類似的事情。這是示例。


type MyItem struct {

    name string

}


type MySlice map[int]MyItem


func (m MySlice) getItem(i int) MyItem {

    return m[i]

}


func (m MySlice) setItem(i int, item MyItem) {

    m[i] = item

}


func main() {

    var items = MySlice{}

    items.setItem(0, MyItem{"john"})

    items[1] = MyItem{"doe"}


    var item0 = items[0]

    fmt.Println(item0.name)


    var item1 = items.getItem(1)

    fmt.Println(item1.name)

}

正如我們可以看到,該方式來設置和獲取item0和item1不同,但結果是一樣的。


// set data

items.setItem(0, item)

items[0] = item


// get data

item = items[0]

item = items.getItem(0)


查看完整回答
反對 回復 2021-11-15
  • 2 回答
  • 0 關注
  • 212 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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