实现泛型列表
Go 本身不支持泛型,但它提供了一个使用名为 Any 的空接口类型的替代方法。此接口用作任何数据类型的占位符。
type Any interface{}
要检查 Any 值是否为零,您可以使用 Reflect 包检查其基础类型。
if reflect.ValueOf(value).IsNil() { // Value is nil }
设计代数数据类型
代数数据类型,例如提供了类似 Haskell 的示例,可以使用接口在 Go 中实现。例如,要表示一个链表:
type List[T Any] interface { Head() T Tail() List[T] } // Nil list type Nil[T Any] struct{} // Cons list type Cons[T Any] struct { head T tail List[T] }
具有特定字段类型的对象的容器
Go 不像 Scala 那样支持类型参数。但是,您可以创建一个类型来保证特定字段类型的存在。
type Animal interface { SuitableFood() string } type GrassEatingAnimal struct { SuitableFood func() string }
您可以通过使用通用映射来实现类似的功能:
type AnimalMap[K Comparable, V Animal] map[K]V
以上是在没有原生支持的情况下,Go 如何模仿泛型和代数数据类型?的详细内容。更多信息请关注PHP中文网其他相关文章!