在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?
答案 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;获取item0
和item1
不同,但结果相同。
// set data
items.setItem(0, item)
items[0] = item
// get data
item = items[0]
item = items.getItem(0)