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 '~'

image

你能确认你上传的代码就是你正在测试的代码吗?如果是,你能提供你构建它所遵循的步骤吗?

问题在于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编译器在泛型上下文中需要更明确的类型转换指示。第一种方法应该能解决你的编译错误。

回到顶部