Golang泛型代码问题求助
Golang泛型代码问题求助 下面的代码出现了以下错误。对于我做错了什么,有什么想法吗?
./main.go:22:20: cannot convert *val (variable of type parameter T constrained by StringType) to string
./main.go:23:18: cannot convert strings.TrimSpace(str) (value of type string) to T
package main
import "strings"
func main() {
var msg = "Hello"
var _ = NewStringField(&msg)
}
type StringType interface {
~string
}
type StringField[T StringType] struct {
val *T
}
func NewStringField[T StringType](val *T) *StringField[T] {
if val == nil {
return nil
}
var str = string(*val)
var newVal = T(strings.TrimSpace(str))
return &StringField[T]{
val: &newVal,
}
}
更多关于Golang泛型代码问题求助的实战教程也可以访问 https://www.itying.com/category-94-b0.html
4 回复
抱歉,我不使用 Go 2。也许这里的其他人可以帮助你。
更多关于Golang泛型代码问题求助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我认为go2go playground已经不再与最新的泛型提案保持同步。我正在使用golang的主分支。
我尝试将你的代码复制粘贴到 Go 2 游乐场中,但遇到了一个错误:
prog.go:11:2: illegal character U+007E '~'

你能确认你上传的代码就是你正在测试的代码吗?如果是,你能提供你构建它所遵循的步骤吗?
问题在于Go泛型中类型参数不能直接与具体类型进行转换,即使类型参数被约束为~string。需要显式类型转换或使用接口方法。
修改后的代码:
package main
import "strings"
func main() {
var msg = "Hello"
var _ = NewStringField(&msg)
}
type StringType interface {
~string
}
type StringField[T StringType] struct {
val *T
}
func NewStringField[T StringType](val *T) *StringField[T] {
if val == nil {
return nil
}
// 使用类型断言或显式转换
str := string(*val)
trimmed := strings.TrimSpace(str)
// 方法1:通过中间变量转换
newVal := T(trimmed)
return &StringField[T]{
val: &newVal,
}
}
如果仍然遇到问题,可以尝试更明确的转换方式:
func NewStringField[T StringType](val *T) *StringField[T] {
if val == nil {
return nil
}
// 先将*T转换为string
var str string
switch v := any(*val).(type) {
case string:
str = v
default:
// 对于自定义的string类型
str = string(v)
}
trimmed := strings.TrimSpace(str)
newVal := T(trimmed)
return &StringField[T]{
val: &newVal,
}
}
主要问题在于Go编译器在泛型上下文中需要更明确的类型转换指示。第一种方法应该能解决你的编译错误。

