几天前,说读一下 Go Spec 原文的链接在 这里,刚刚浏览完了第一遍,作一下总结
认识了两个很不错的同学。
基中一个刚在群里说,写了个 V2EX 的 客户端, 我拿来装一下。
另外一个,基础非常扎实,细节非常好,思路也很开阔,关键是才大二,虽然没经过他允许,还是特别想在 V2EX 推荐一下他,如果你在武汉有非常好的实习机会,欢迎联系我。
下面是我们的讨论的一些总结,不是全部,有些讨论会比较分散。
单引号是 Rune , int32 的别称,双引号跟反向引号都代表 String ,但是双引号会解析其中的字符串例如:"\u65e5\u672c\u8a9e",反向的引号输出的是字符原来的值。另外如果是多行的话只能用反向的单引号。
在读这个的时候花一了些时间了解了 uncoide 跟 utf-8, utf-16 之间的关系,可以看一下这篇文章。字符编码
interface 的组成是由一个静态类型,一个动态类型,但是值是存在静态类型的。其中动态类型在运行时是可以改变的,我觉得这算是 Golang 的一个动态特性。
其中 t 作为 T 的实例跟 *T 能接收的方法是不同的,其中 *T 的实例可以接收所有的方法,但是 T 的实例只能接收 T 的方法集。
字符串是不可变的 (immutable),一旦生成,内容就不会再变了。
在 struct 里,有一个 tag 的选项,它的类型是 StructTag ,实际上也是一个 String ,但是它可以做一些其它的事情。比如:
var tag StructTag = 'species:"gopher" color:"blue"'
tag.Get("color") // output "gopher"
tag.Get("species") // output "blue"
make 可以指定 map 的初始化空间,但是它的长度( len )依旧是 0 ,这两个是不同的。比如:m := make(map[string]int 100)
,len(m)
实际上是 0 。
但是 slice 不是这样,s := make([]int, 10)
,len(s)
等于 10 。
数组的长度可以用 ... 来指定,比如: [...]String{"Sat", "Sun"}
,这时候 ... 相当于 2 。
数组可以指定 index ,比如:
vowels := [128]bool{'a': true, 'e': true, 'i': true, 'o': true, 'u': true, 'y': true}
这个不太好描述,简单点说,实例调用方法,另外的一种形式,把实例当做第一个参数调用。直接举例子:
t.Mv(7)
T.Mv(t, 7)
(T).Mv(t, 7)
f1 := T.Mv; f1(t, 7)
f2 := (T).Mv; f2(t, 7)
Go 里面的 for 的用法相对于 Java 来讲是比较灵活的,当跟 range 配合的时候时,如果 range 的对象是一个字符串,那么需要注意: index 是 utf8 码点序列的值,而 value 是 Unicode 的码点值。举个例子:
for i, v := range "中国人" {
log.Println(i, v)
}
// output:
0 20013
3 22269
6 20154
我非常喜欢的 Go 的其中一个特点,它的执行是在 return 之后,并且可以改变返回值。
Copy 里面有一点,需要注意,它能改变的是目标跟源之间的最中值,如果 dst := []int{},所以 dst 永远都是空的。
另外整个过程中,我也分享了一些在 twitter,欢迎关注,内容不仅限于 Go 。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.