Go是否支持内置类型(如map和slice)的运算符重载?
在python中,我可以通过定义Go是否支持内置类型(如map和slice)的运算符重载?,go,overloading,built-in,Go,Overloading,Built In,在python中,我可以通过定义\uuu getitem\uuuu()来定义覆盖列表项访问和dict值访问的类型。我可以在围棋中做类似的动作吗 // What I mean is: type MySlice []MyItem // Definition of MySlice ...... func (s MySlice) getItem(i int) MyItem { } ...... // Access is overrided with calling getItem() item := m
\uuu getitem\uuuu()
来定义覆盖列表项访问和dict值访问的类型。我可以在围棋中做类似的动作吗
// 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?
您可以使用
map
type执行类似的操作。这是一个例子
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)
不,运算符重载不是Go的功能 引用原文解释原因: 如果方法分派也不需要进行类型匹配,则可以简化方法分派。使用其他语言的经验告诉我们,拥有各种名称相同但签名不同的方法有时是有用的,但在实践中也可能令人困惑和脆弱。在Go的类型系统中,仅按名称匹配并要求类型一致性是一个主要的简化决策 关于运算符重载,它似乎更方便,而不是绝对要求。同样,没有它,事情会变得更简单
我说的
override
是指当item=items[0]
时,它实际上是在调用getItem
,但在您的代码中不是这样。我真的不同意最后一句话。例如,我希望时间对象有+和-操作符可以根据持续时间进行调整。有.Add
和Sub
方法。好的,听起来不错,对吗?其实不是。你猜怎么着?Add表示持续时间,Sub表示时间。至于比较,有之后和之前两种,但你如何将两者相等?。您必须使用obj和arg翻转来否定.Before或.After!每种操作类型都必须给出不必要的详细操作函数名。除此之外,命名约定没有强制执行。这真是一团糟。