为了账号安全,请及时绑定邮箱和手机立即绑定

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条经验 获得超7个赞

你可以使用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 关注
  • 178 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信