抱歉标题模棱两可。
我正在阅读这本书http://algs4.cs.princeton.edu/home/,我认为在 Go 中实现示例作为学习练习会很好,但是这本书使用 Java 作为其语言来描述代码.
前几章中的一章讨论了设置一些核心数据类型/容器样式类以供以后重用,但我在尝试将它们融入 Go 设置时遇到了麻烦,主要是因为这些数据类型似乎很喜欢使用 Java 泛型。
例如,我编写了以下代码
package bag
type T interface{}
type Bag []T
func (a *Bag) Add(t T) {
*a = append(*a, t)
}
func (a *Bag) IsEmpty() bool {
return len(*a) == 0
}
func (a *Bag) Size() int {
return len(*a)
}
这在原则上有效,因为我可以将项目添加到 aBag
并检查它的大小和所有内容。然而这也意味着下面的代码是合法的
a := make(bag.Bag,0,0)
a.Add(1)
a.Add("Hello world!")
a.Add(5.6)
a.Add(time.Now())
我只是想知道是否有任何方法可以强制执行该类型,使其符合类似于
Bag<T> bagOfMyType = new Bag<T>()
例如
Bag<Integer> bagOfInts = new Bag<Integer>()
我知道 Go 没有泛型,它们也不是真正的 Go Way,但我只是想知道是否有可能在编译时“强制”任何东西(可能不是)
对不起,很长的帖子
编辑:好的,所以我一直在进一步研究这个问题,我几乎已经放弃了泛型方面的事情(我知道这不在 Go 的路线图上)所以我正在考虑做类似的事情具有接口的 Haskell 类型类,例如
type T interface{}
type Bag interface {
Add(t T)
IsEmpty() bool
Size() int
}
type IntSlice []int
func (i *IntSlice) Add(t T) {
*i = append(*i, t.(int)) // will throw runtime exception if user attempts to add anything other than int
}
func (i *IntSlice) IsEmpty() bool {
return len(*i) == 0
}
func (i *IntSlice) Size() int {
return len(*i)
}
问题在于类型强制仅在运行时强制执行。
有人知道如何改进吗?