在学习 Go 泛型时,我遇到了一个似乎无法解决的错误。我把它归结为最简单的代码:
type opStack[T any] []T
func main() {
t := make(opStack)
// t := new(opStack)
t = append(t, 0)
fmt.Println(t[0])
}
Run Code Online (Sandbox Code Playgroud)
在操场上,这会在调用时(以及在注释掉的调用make()上类似)出现问题,并显示以下错误消息:new
无法在没有实例化的情况下使用泛型类型 opStack[T any]
但是make()是一个实例化函数。所以,我希望我错过了一些语法上的微妙之处。Go 抱怨什么以及需要纠正什么?
我一直在玩Go有点制作一些数据结构库,我有一个大问题.我希望数据结构能够包含任何类型,但是我没有看到任何方法在Go中执行此操作,因为您无法声明void指针,并且它们没有像NSObject这样的类,所有内容都继承自.我如何在Go中实现相同的功能?
我知道Go没有传统OOP意义上的类,但是Go确实提供了一个接口概念,允许你做大部分你想要做的OOP事情.
但是,Go是否允许创建模板类?例如,我正在阅读容器/列表包的源代码.它定义了一个列表和列表的相关方法.但是在所有方法中,列表中包含的值都是类型interface{}- 因此,任何类型.有没有办法创建一个仅限于保存特定类型值的列表?int,string,Fruit ......等等.
如何构建通用结构?
我试过:
type SafeSet[type T] struct {
Values map[T]bool
}
Run Code Online (Sandbox Code Playgroud)
我希望能够做到例如
SafeSet{ Values: make(map[net.Conn]bool) }
SafeSet{ Values: make(map[string] bool) }
SafeSet{ Values: make(map[int] bool) }
Run Code Online (Sandbox Code Playgroud) 我尝试从设计草案(泛型的下一步)中 运行示例go2go.playground
type Pair(type T) struct { f1, f2 T }
Run Code Online (Sandbox Code Playgroud)
,但得到一个错误
prog.go2:14:11: expected type, found 'type' (and 1 more errors)
Run Code Online (Sandbox Code Playgroud)
我在哪里可以找到实际的go generics design draft?
以下代码在Go中实现了一个int列表:
package main
import "fmt"
type List struct {
Head int
Tail *List
}
func tail(list List) *List {
return list.Tail
}
func main() {
list := List{Head: 1, Tail:
&List{Head: 2, Tail:
&List{Head: 3, Tail:
nil}}}
fmt.Println(tail(list).Head)
}
Run Code Online (Sandbox Code Playgroud)
问题是这只适用于int.如果我想要一个列表strings,我需要再次重新实现每个列表方法(例如tail)!这显然不实用,所以,这可以通过使用空接口来解决:
type List struct {
Head interface{} // Now works for any type!
Tail *List
}
Run Code Online (Sandbox Code Playgroud)
问题是,1.由于类型转换,这似乎要慢得多,2.它抛弃了类型安全,允许人们键入任何东西:
// This type-checks!
func main() {
list := List{Head: 123456789 , Tail:
&List{Head: "covfefe" , Tail: …Run Code Online (Sandbox Code Playgroud)