Go 范型问题使用问题求解。

307 天前
 kekeones
// interface
type impl[T any] interface {
	Print(t T) error
}

var arr []impl[any]

func add[T any](s impl[T]) {
	arr = append(arr, s)
}

1770 次点击
所在节点    Go 编程语言
12 条回复
HankLu
307 天前
vscode 有这些提示吗?怎么弄出来?
nopdan
307 天前
谁教你这么用的。。。
popbones
307 天前
在手机上凭直觉这个应该写成

`func add[T any, M impl[T]](s M)`

或者

`func add[T impl[any]](s T)`

第二种我没确认

这里有写简单的范型代码示例:

https://github.com/popbones/goo
Trim21
306 天前
go 的 any 只是空 interface 的别名,并不是真正的双向禁用类型检查的“真 any”。

这里不如说 impl[any] 和 impl[int] 就是两个不兼容的 interface 。
Trim21
306 天前
@Trim21 这里比如说*
sbsz
306 天前
@HankLu 很显然是 goland
fzdwx
306 天前
`var arr []impl[any]` 这个里面的 any 就指定了类型只能是 any , 而 any 在 golang 里面是 `interface{}` 的别名
jorneyr
306 天前
以前也遇到过这个问题,没解决,Go 的泛型还没有像 Java 的 ?这种。
lrh3321
306 天前
arr 已经是 []impl[any] 类型了,它是 impl[any] 的切片 , 所以 add 函数就不应该是个泛型函数
lrh3321
306 天前
// interface
type impl[T any] interface {
Print(t T) error
}

type implSlice[T any] []impl[T]

func (arr *implSlice[T]) add(s impl[T]) {
*arr = append(*arr, s)
}

var arr implSlice[any]


这样貌似是可以的
lasuar
306 天前
#7 #9 说的没错,你只需把 (s impl[T]) 改为 (s impl[any]) 即可
kekeones
305 天前
@popbones @Trim21 @fzdwx @lrh3321 感谢,确实 Go 范型还不是很好用。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/955011

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX