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

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

在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 := 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!每种操作类型都必须给出不必要的详细操作函数名。除此之外,命名约定没有强制执行。这真是一团糟。