Go语言如何创建并初始化可适配多类型的泛型结构体
Go 泛型 SafeSet 实现方案
你现有代码的问题有两处:
- Go 泛型的类型参数声明不需要额外加
type关键字前缀 - 作为 map 键的泛型类型必须添加
comparable约束(map 要求键类型支持相等/不等比较)
正确的结构体定义
type SafeSet[T comparable] struct { Values map[T]bool }
初始化写法
你需要在结构体名后显式指定具体的类型参数,即可实现不同类型的初始化:
// 键为 net.Conn 类型 SafeSet[net.Conn]{ Values: make(map[net.Conn]bool) } // 键为 string 类型 SafeSet[string]{ Values: make(map[string]bool) } // 键为 int 类型 SafeSet[int]{ Values: make(map[int]bool) }
简化初始化的可选方案
可以额外实现一个泛型构造函数,减少重复代码:
func NewSafeSet[T comparable]() SafeSet[T] { return SafeSet[T]{ Values: make(map[T]bool), } }
使用时可以直接调用构造函数,部分场景下编译器还能自动完成类型推断:
// 显式指定类型 intSet := NewSafeSet[int]() // 赋值给带类型的变量时可省略类型参数,由编译器推断 var connSet SafeSet[net.Conn] = NewSafeSet()
内容的提问来源于stack exchange,提问作者Sebastian Nielsen
相关产品推荐
相关产品推荐

