Go 是否支持 map 和 slice 等内置类型的运算符重载?

在 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?


一只斗牛犬
浏览 179回答 2
2回答

皈依舞

不,运算符重载不是 Go 的特性。引用官方常见问题解答来解释原因:如果不需要进行类型匹配,则方法分派会得到简化。使用其他语言的经验告诉我们,拥有多种名称相同但签名不同的方法有时很有用,但在实践中也可能会令人困惑和脆弱。仅按名称匹配并要求类型的一致性是 Go 类型系统中一个主要的简化决定。关于运算符重载,它似乎更方便而不是绝对要求。同样,没有它,事情会更简单。

慕仙森

你可以使用map类型做类似的事情。这是示例。type MyItem struct {    name string}type MySlice map[int]MyItemfunc (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 dataitems.setItem(0, item)items[0] = item// get dataitem = items[0]item = items.getItem(0)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go