diff --git a/README.md b/README.md index c68e337..18808d4 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,10 @@ - 内存数据库,前一段时间Google开发的groupcache,couchbase的部分组建 - 云平台,目前国外很多云平台在采用Go开发 +### 更新日志 + +[更新日志](https://github.com/zoeminghong/go-library/blob/master/更新日志.md) + ### 目录 [chapter1环境配置](https://github.com/zoeminghong/go-library/blob/master/chapter1%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.md) @@ -52,10 +56,18 @@ [chapter18错误处理](https://github.com/zoeminghong/go-library/blob/master/chapter18%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86.md) +[chapter19自定义类型](https://github.com/zoeminghong/go-library/blob/master/chapter19自定义类型.md) + 该教程主要是针对想要Go入门学习的,够用就好 如果想要进一步学习可能不是特别合适 +欢迎关注我微信公众号,第一时间通知你,更新内容 + +![http://7xp64w.com1.z0.glb.clouddn.com/qrcode_for_gh_3e33976a25c9_258.jpg](http://7xp64w.com1.z0.glb.clouddn.com/qrcode_for_gh_3e33976a25c9_258.jpg) + +也可以通过新浪微博:**@迹_Jason** 与我交流 + ![https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png](https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png) 本文基于署名-非商业性使用-相同方式共享 4.0许可协议发布,欢迎转载、使用、重新发布,但务必保留文章署名迹_Jason(包含链接:https://github.com/zoeminghong/go-library ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请[微博](http://weibo.com/jasongoo123)与我联系 diff --git a/chapter13Map.md b/chapter13Map.md index 6314c34..d404ef1 100644 --- a/chapter13Map.md +++ b/chapter13Map.md @@ -114,6 +114,35 @@ Capital of Japan is Tokyo Capital of India is New Delhi ``` +**ok-idiom** + +使用ok-idiom获取值,可知道key/value是否存在 + +```go +package main + +import ( + "fmt" +) + +func main() { + m := make(map[string]int) + m["a"] = 1 + x, ok := m["b"] + fmt.Println(x, ok) + x, ok = m["a"] + fmt.Println(x, ok) +} + +``` + +`结果` + +```go +0 false +1 true +``` + **make、new操作** make用于内建类型(map、slice 和channel)的内存分配。new用于各种类型的内存分配 diff --git "a/chapter19\350\207\252\345\256\232\344\271\211\347\261\273\345\236\213.md" "b/chapter19\350\207\252\345\256\232\344\271\211\347\261\273\345\236\213.md" new file mode 100644 index 0000000..cfdeef7 --- /dev/null +++ "b/chapter19\350\207\252\345\256\232\344\271\211\347\261\273\345\236\213.md" @@ -0,0 +1,112 @@ +### 自定义类型 + +使用关键字type就可以开始自定义类型,包括基于现有基础类型创建,或者是结构体、函数类型等 + +```go +type name int8 +``` + +多个type还可以合成一个组 + +```go +package main + +import ( + "fmt" +) + +type ( + user struct { + name string + age uint8 + } + event func(string) bool +) + +func main() { + u := user{"Jason", 20} + fmt.Println(u) + var f event = func(s string) bool { + fmt.Println(s) + return s != "" + } + f("abc") + +} + +``` + +`结果` + +```go +{Jason 20} +abc +``` + +注意 + +```go +package main + +import ( + "fmt" +) + +type data int + +func main() { + var d data = 10 + var x int = d + fmt.Println(x) + fmt.Println(d == x) + +} +``` + +> d虽然底层的数据类型是int,但其与int是两个不同的概念,不能作为相同的数据类型看待 + +**未命名类型** + +与有明确标识符的bool、int、string等类型相比,数组、切片、字典、通道等类型与具体元素类型或长度等属性有关,故称作未命名类型。当然,可用type为其提供具体的名称,将其改变为命名类型 + +- 具有相同基类型的指针 +- 具有相同元素类型和长度的数组 +- 具有相同元素类型的切片 +- 具有相同键值类型的字典 +- 具有相同数据类型及操作方向的通道 +- 具有相同字段序列(字段名、字段类型、标签、以及字段顺序)的结构体 +- 具有相同签名(参数的返回值列表,不包括参数名)的函数 +- 具有相同方法集(方法名、方法签名、不包括顺序)的接口 + +未命名类型转换规则 + +- 所属类型相同 +- 基础类型相同,且其中一个是未命名类型 +- 数据类型相同,将双向通道给单向通道,且其中一个为未命名类型 +- 将默认值nil赋值给切片、字典、通道、指针、函数或接口 +- 对象实现了目标接口 + +```go +package main + +import ( + "fmt" +) + +type data [2]int + +func main() { + var d data = [2]int{1, 2} + fmt.Println(d) + a := make(chan int, 2) + var b chan<- int = a + b <- 2 + +} +``` + +`结果` + +```go +[1 2] +``` \ No newline at end of file diff --git "a/chapter3\345\217\230\351\207\217\344\270\216\345\270\270\351\207\217.md" "b/chapter3\345\217\230\351\207\217\344\270\216\345\270\270\351\207\217.md" index 4913cff..8138444 100644 --- "a/chapter3\345\217\230\351\207\217\344\270\216\345\270\270\351\207\217.md" +++ "b/chapter3\345\217\230\351\207\217\344\270\216\345\270\270\351\207\217.md" @@ -94,6 +94,33 @@ func main() { 此外,单纯地给 a 赋值也是不够的,这个值必须被使用,所以使用 +在同一个作用域中,已存在同名的变量,则之后的声明初始化,则退化为赋值操作。但这个前提是,最少要有一个新的变量被定义,且在同一作用域,例如,下面的y就是新定义的变量 + +```go +package main + +import ( + "fmt" +) + +func main() { + x := 140 + fmt.Println(&x) + x, y := 200, "abc" + fmt.Println(&x, x) + fmt.Print(y) +} + +``` + +`结果` + +```go +0xc04200a2b0 +0xc04200a2b0 200 +abc +``` + **空白标识符 _ 也被用于抛弃值**,如值 5 在:_, b = 5, 7 中被抛弃 _ 实际上是一个只写变量,你不能得到它的值。这样做是因为 Go 语言中你必须使用所有被声明的变量,但有时你并不需要使用从一个函数得到的所有返回值 @@ -106,6 +133,10 @@ _ 实际上是一个只写变量,你不能得到它的值。这样做是因为 常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型 +不曾使用的常量,在编译的时候,是不会报错的 + +显示指定类型的时候,必须确保常量左右值类型一致,需要时可做显示类型转换。这与变量就不一样了,变量是可以是不同的类型值 + ```go const identifier [type] = value ``` @@ -149,6 +180,34 @@ const ( Male = 2 ) ``` +常量组中如不指定类型和初始化值,则与上一行非空常量右值相同 + +```go +package main + +import ( + "fmt" +) + +func main() { + const ( + x uint16 = 16 + y + s = "abc" + z + ) + fmt.Printf("%T,%v\n", y, y) + fmt.Printf("%T,%v\n", z, z) +} +``` + +`结果` + +```go +uint16,16 +string,abc +``` + ### iota iota,特殊常量,可以认为是一个可以被编译器修改的常量 @@ -203,3 +262,9 @@ func main() { ``` 0 1 2 ha ha 100 100 7 8 ``` + +如果中断iota自增,则必须显式恢复。且后续自增值按行序递增 + +自增默认是int类型,可以自行进行显示指定类型 + +数字常量不会分配存储空间,无须像变量那样通过内存寻址来取值,因此无法获取地址 \ No newline at end of file diff --git "a/chapter5\346\235\241\344\273\266\350\257\255\345\217\245.md" "b/chapter5\346\235\241\344\273\266\350\257\255\345\217\245.md" index b3d0427..d60251f 100644 --- "a/chapter5\346\235\241\344\273\266\350\257\255\345\217\245.md" +++ "b/chapter5\346\235\241\344\273\266\350\257\255\345\217\245.md" @@ -92,6 +92,42 @@ func main() { } ``` +如需贯通后续的case,就添加fallthrough + +```go +package main + +import ( + "fmt" +) + +type data [2]int + +func main() { + switch x := 5; x { + default: + fmt.Println(x) + case 5: + x += 10 + fmt.Println(x) + fallthrough + case 6: + x += 20 + fmt.Println(x) + + } + +} + +``` + +`结果` + +```go +15 +35 +``` + #### Type Switch switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型。 diff --git "a/\346\233\264\346\226\260\346\227\245\345\277\227.md" "b/\346\233\264\346\226\260\346\227\245\345\277\227.md" new file mode 100644 index 0000000..ba26599 --- /dev/null +++ "b/\346\233\264\346\226\260\346\227\245\345\277\227.md" @@ -0,0 +1,9 @@ +### 更新日志 + +##### 2016/11/27 + +优化变量和常量部分内容 + +增加map类型内容 + +新增自定义类型 \ No newline at end of file