V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
kekeones
V2EX  ›  Go 编程语言

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

  •  
  •   kekeones · 2023-07-08 00:17:15 +08:00 · 2025 次点击
    这是一个创建于 523 天前的主题,其中的信息可能已经有所发展或是发生改变。
    // 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)
    }
    

    123

    12 条回复    2023-07-10 00:19:30 +08:00
    HankLu
        1
    HankLu  
       2023-07-08 00:38:16 +08:00
    vscode 有这些提示吗?怎么弄出来?
    nopdan
        2
    nopdan  
       2023-07-08 01:05:54 +08:00
    谁教你这么用的。。。
    popbones
        3
    popbones  
       2023-07-08 01:25:08 +08:00 via iPhone
    在手机上凭直觉这个应该写成

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

    或者

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

    第二种我没确认

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

    https://github.com/popbones/goo
    Trim21
        4
    Trim21  
       2023-07-08 04:16:15 +08:00 via Android
    go 的 any 只是空 interface 的别名,并不是真正的双向禁用类型检查的“真 any”。

    这里不如说 impl[any] 和 impl[int] 就是两个不兼容的 interface 。
    Trim21
        5
    Trim21  
       2023-07-08 04:16:41 +08:00 via Android
    @Trim21 这里比如说*
    sbsz
        6
    sbsz  
       2023-07-08 07:34:38 +08:00 via Android
    @HankLu 很显然是 goland
    fzdwx
        7
    fzdwx  
       2023-07-08 09:02:29 +08:00
    `var arr []impl[any]` 这个里面的 any 就指定了类型只能是 any , 而 any 在 golang 里面是 `interface{}` 的别名
    jorneyr
        8
    jorneyr  
       2023-07-08 09:37:41 +08:00
    以前也遇到过这个问题,没解决,Go 的泛型还没有像 Java 的 ?这种。
    lrh3321
        9
    lrh3321  
       2023-07-08 09:55:55 +08:00
    arr 已经是 []impl[any] 类型了,它是 impl[any] 的切片 , 所以 add 函数就不应该是个泛型函数
    lrh3321
        10
    lrh3321  
       2023-07-08 09:59:31 +08:00
    // 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
        11
    lasuar  
       2023-07-08 10:10:29 +08:00
    #7 #9 说的没错,你只需把 (s impl[T]) 改为 (s impl[any]) 即可
    kekeones
        12
    kekeones  
    OP
       2023-07-10 00:19:30 +08:00
    @popbones @Trim21 @fzdwx @lrh3321 感谢,确实 Go 范型还不是很好用。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5508 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 471ms · UTC 01:58 · PVG 09:58 · LAX 17:58 · JFK 20:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.