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

Go Spec 看完了,算是个笔记,欢迎提意见,(请忽略括号内容: V2EX 的机制真心的)

  •  
  •   pluson · 2016-08-06 16:33:01 +08:00 · 2046 次点击
    这是一个创建于 3064 天前的主题,其中的信息可能已经有所发展或是发生改变。

    几天前,说读一下 Go Spec 原文的链接在 这里,刚刚浏览完了第一遍,作一下总结

    一些费话

    认识了两个很不错的同学。
    基中一个刚在群里说,写了个 V2EX 的 客户端, 我拿来装一下。
    另外一个,基础非常扎实,细节非常好,思路也很开阔,关键是才大二,虽然没经过他允许,还是特别想在 V2EX 推荐一下他,如果你在武汉有非常好的实习机会,欢迎联系我。

    下面是我们的讨论的一些总结,不是全部,有些讨论会比较分散。

    单引号,双引号,反向的引号

    单引号是 Rune , int32 的别称,双引号跟反向引号都代表 String ,但是双引号会解析其中的字符串例如:"\u65e5\u672c\u8a9e",反向的引号输出的是字符原来的值。另外如果是多行的话只能用反向的单引号。

    在读这个的时候花一了些时间了解了 uncoide 跟 utf-8, utf-16 之间的关系,可以看一下这篇文章。字符编码

    interface (接口)

    interface 的组成是由一个静态类型,一个动态类型,但是值是存在静态类型的。其中动态类型在运行时是可以改变的,我觉得这算是 Golang 的一个动态特性。

    Method sets (方法集)

    其中 t 作为 T 的实例跟 *T 能接收的方法是不同的,其中 *T 的实例可以接收所有的方法,但是 T 的实例只能接收 T 的方法集。

    String (字符串)

    字符串是不可变的 (immutable),一旦生成,内容就不会再变了。

    Struct (结构)

    在 struct 里,有一个 tag 的选项,它的类型是 StructTag ,实际上也是一个 String ,但是它可以做一些其它的事情。比如:

    var tag StructTag = 'species:"gopher" color:"blue"'
    tag.Get("color") // output "gopher"
    tag.Get("species") // output "blue"
    

    Make

    make 可以指定 map 的初始化空间,但是它的长度( len )依旧是 0 ,这两个是不同的。比如:m := make(map[string]int 100)len(m) 实际上是 0 。
    但是 slice 不是这样,s := make([]int, 10)len(s) 等于 10 。

    Array (数组)

    数组的长度可以用 ... 来指定,比如: [...]String{"Sat", "Sun"},这时候 ... 相当于 2 。
    数组可以指定 index ,比如:

    vowels := [128]bool{'a': true, 'e': true, 'i': true, 'o': true, 'u': true, 'y': true}
    

    Method (方法)

    这个不太好描述,简单点说,实例调用方法,另外的一种形式,把实例当做第一个参数调用。直接举例子:

    t.Mv(7)
    T.Mv(t, 7)
    (T).Mv(t, 7)
    f1 := T.Mv; f1(t, 7)
    f2 := (T).Mv; f2(t, 7)
    

    For

    Go 里面的 for 的用法相对于 Java 来讲是比较灵活的,当跟 range 配合的时候时,如果 range 的对象是一个字符串,那么需要注意: index 是 utf8 码点序列的值,而 value 是 Unicode 的码点值。举个例子:

    for i, v := range "中国人" {
    	log.Println(i, v)
    }
    	
    // output:
    0 20013
    3 22269
    6 20154
    

    Defer

    我非常喜欢的 Go 的其中一个特点,它的执行是在 return 之后,并且可以改变返回值。

    Copy

    Copy 里面有一点,需要注意,它能改变的是目标跟源之间的最中值,如果 dst := []int{},所以 dst 永远都是空的。

    另外整个过程中,我也分享了一些在 twitter,欢迎关注,内容不仅限于 Go 。

    8 条回复    2016-08-08 01:13:27 +08:00
    1023k
        1
    1023k  
       2016-08-06 18:54:50 +08:00
    更建议去看 runtime 包与 relect 包,比如 make map 长度为什么是 0 , string 、 slice 的结构, interface 与 struct 怎么转换,然后你列出这些一目了然了
    1023k
        2
    1023k  
       2016-08-06 18:57:05 +08:00
    推荐 深入解析 go 这本书
    pluson
        3
    pluson  
    OP
       2016-08-06 21:35:14 +08:00
    @1023k 谢谢建议
    mengzhuo
        4
    mengzhuo  
       2016-08-07 01:19:29 +08:00 via iPhone
    楼主你要搞清楚啊 spec 和内建函数不是一回事啊!
    pluson
        5
    pluson  
    OP
       2016-08-07 08:50:54 +08:00
    @mengzhuo 不是特别明白你的意思,哪里说这是一回事了?内建函数是在那 spec 里面看到的。
    mengzhuo
        6
    mengzhuo  
       2016-08-07 10:05:55 +08:00 via iPhone
    @pluson
    spec 是 specfication
    就拿函数来说
    应该是研究它的语法规范,而不是怎么用和例子,否则就是文不对题。
    你应该去解读这段:

    Method expressions

    If M is in the method set of type T, T.M is a function that is callable as a regular function with the same arguments as M prefixed by an additional argument that is the receiver of the method.

    MethodExpr = ReceiverType "." MethodName .
    ReceiverType = TypeName | "(" "*" TypeName ")" | "(" ReceiverType ")" .
    pluson
        7
    pluson  
    OP
       2016-08-07 11:15:00 +08:00
    @mengzhuo 了解你的意思了,证明我研究的还不够透彻,需要多看几遍。例子是用来辅助的,能让我更好的理解规范。
    ibigbug
        8
    ibigbug  
       2016-08-08 01:13:27 +08:00
    @mengzhuo 楼主写得挺好的。你这个说的也没错。只不过 grammer 只能算呢 spec 的一部分了, behavior 也是很重要的一部分。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4114 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 05:30 · PVG 13:30 · LAX 21:30 · JFK 00:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.