V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
viktor123
V2EX  ›  程序员

Golang 泛型:[type T],为啥要用中括号呢。。。

  •  1
     
  •   viktor123 · 2020-08-04 19:08:35 +08:00 · 3949 次点击
    这是一个创建于 1557 天前的主题,其中的信息可能已经有所发展或是发生改变。

    传送门: https://blog.golang.org/generics-next-step

    官方示例:

    package main
    
    import (
    	"fmt"
    )
    
    // The playground now supports parentheses or square brackets (only one at
    // a time) for generic type and function declarations and instantiations.
    // By default, parentheses are expected. To switch to square brackets,
    // the first generic declaration in the source must use square brackets.
    
    func Print[type T](s []T) {
    	for _, v := range s {
    		fmt.Print(v)
    	}
    }
    
    func main() {
    	Print([]string{"Hello, ", "playground\n"})
    }
    
    

    High Level Overview:

    • Functions can have an additional type parameter list introduced by the keyword type: func F(type T)(p T) { ... }.
    • These type parameters can be used by the regular parameters and in the function body.
    • Types can also have a type parameter list: type M(type T) []T.
    • Each type parameter can have an optional type constraint: func F(type T Constraint)(p T) { ... }
    • Type constraints are interface types.
    • Interface types used as type constraints can have a list of predeclared types; only types whose underlying type is - one of those types can implement the interface.
    • Using a generic function or type requires passing type arguments.
    • Type inference permits omitting the type arguments in common cases.
    • If a type parameter has a type constraint its type argument must implement the interface.
    • Generic functions may only use operations permitted by the type constraint.
    22 条回复    2020-08-05 18:35:13 +08:00
    cmdOptionKana
        1
    cmdOptionKana  
       2020-08-04 19:20:23 +08:00
    盲猜因为初始方案是小括号,被说小括号太多。而小于号大于号本质上不是括号,可能会影响编译速度(或语法分析的复杂性),官方好像一开始就讨厌尖括号。所以折中一下就是中括号了。
    TypeError
        2
    TypeError  
       2020-08-04 19:24:04 +08:00
    看起来还好,能和圆括号分清就行
    mind3x
        3
    mind3x  
       2020-08-04 19:29:09 +08:00   ❤️ 1
    很好,迈出了走向 Scala 的第一步 [并没有]
    janxin
        4
    janxin  
       2020-08-04 19:31:35 +08:00
    因为不想用<>,因为不少额外有工作量,()有语法歧义
    Fitz
        5
    Fitz  
       2020-08-04 19:34:45 +08:00
    唉, 什么时候改成方括号了, 记得 6 月份的时候不是圆括号吗
    so1n
        6
    so1n  
       2020-08-04 19:35:38 +08:00 via Android
    好像跟 python 不用<>的理由一样
    Fitz
        7
    Fitz  
       2020-08-04 19:38:21 +08:00
    6 月份的帖子还在呢 https://v2ex.com/t/682238#r_9129287
    viktor123
        8
    viktor123  
    OP
       2020-08-04 20:27:55 +08:00
    @Fitz thx bro.
    aloxaf
        9
    aloxaf  
       2020-08-04 20:36:09 +08:00
    看着比小括号舒服多了……
    allenhu
        10
    allenhu  
       2020-08-04 21:33:40 +08:00 via Android
    恕我一眼看不懂
    iyear
        11
    iyear  
       2020-08-04 21:36:39 +08:00
    比尖尖的舒服多了。。。
    zhuangzhuang1988
        12
    zhuangzhuang1988  
       2020-08-04 21:52:52 +08:00
    Scala 也是[]
    <> 是留给 xml 用的
    tolerance
        13
    tolerance  
       2020-08-04 22:45:52 +08:00
    等正式发布再说
    someonedeng
        14
    someonedeng  
       2020-08-05 09:22:39 +08:00
    其实看起来还不错
    yrj
        15
    yrj  
       2020-08-05 09:33:39 +08:00 via iPad
    我记得上一稿方案是小括号,还是中括号舒服
    fengjianxinghun
        17
    fengjianxinghun  
       2020-08-05 10:48:24 +08:00
    欢迎,[]()()() 比 ()()()()至少强了一分钱。
    lithbitren
        18
    lithbitren  
       2020-08-05 11:08:04 +08:00
    比小括号要更好
    fengjianxinghun
        19
    fengjianxinghun  
       2020-08-05 11:11:56 +08:00
    ```go

    package main

    import (
    "fmt"
    )


    // The playground now supports parentheses or square brackets (only one at
    // a time) for generic type and function declarations and instantiations.
    // By default, parentheses are expected. To switch to square brackets,
    // the first generic declaration in the source must use square brackets.


    type primitive interface {
    type string, int, uint, float32
    }

    func Print[type T primitive](s []T) {
    for _, v := range s {
    fmt.Print(v)
    }
    fmt.Print("\n")
    }

    func main() {
    Print([]string{"Hello, ", "playground"})
    Print([]int{1,2,3,4,5})
    Print([]float32{1.0})
    }


    ```
    Mohanson
        20
    Mohanson  
       2020-08-05 13:20:39 +08:00   ❤️ 1
    Golang 语法树解析的复杂度是 LR(1), 得益于其 Token 的 parser 是 context free 的. 按照 Go 的性格来说, 它不可能使用 <> , 因为一旦加上这个符号就会出现歧义, 要联系上下文去"猜"这个 Token 的含义, 复杂度会变成 LR(无穷). 括号内的数字和上下文的大小成正比.

    编译速度在 Golang 看来是很重要的.
    fengjianxinghun
        21
    fengjianxinghun  
       2020-08-05 15:09:23 +08:00
    @Mohanson 这点前端 parse 的开销基本微乎其微。
    Sasasu
        22
    Sasasu  
       2020-08-05 18:35:13 +08:00
    LR(1) 并不是复杂度
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2564 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 15:33 · PVG 23:33 · LAX 07:33 · JFK 10:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.