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

时间:2015-10-19 01:58:35

标签: go overloading built-in

在python中,我可以通过定义__getitem__()来定义覆盖列表项访问和dict值访问的类型。我可以在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 个答案:

答案 0 :(得分:4)

不,运营商重载不是Go的功能。

引用official FAQ解释为什么

  

如果不需要进行类型匹配,则简化方法调度。使用其他语言的经验告诉我们,使用具有相同名称但签名不同的各种方法偶尔会有用,但在实践中它也可能令人困惑和脆弱。仅按名称匹配并要求在类型中保持一致性是Go类型系统中的主要简化决策。

     

关于运算符重载,它似乎比绝对要求更方便。如果没有它,事情会更简单。

答案 1 :(得分:0)

您可以使用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)
}

正如我们所看到的,设置& amp;获取item0item1不同,但结果相同。

// set data
items.setItem(0, item)
items[0] = item

// get data
item = items[0]
item = items.getItem(0)