Conflicts:
	2.2.md
	2.3.md
	genepub.sh
This commit is contained in:
chenwenli
2012-10-29 17:24:07 +08:00
61 changed files with 312 additions and 291 deletions

36
2.2.md
View File

@@ -1,8 +1,8 @@
#2.2 Go基础
# 2.2 Go基础
这小节我们将要介绍如何定义变量、常量、Go内置类型以及Go程序设计中的一些技巧。
##定义变量
## 定义变量
Go语言里面定义变量有多种方式。
@@ -61,7 +61,7 @@ Go对于已声明但未使用的变量会在编译阶段报错比如下面的
var i int
}
##常量
## 常量
所谓常量也就是在程序编译阶段就确定下来的值而程序在运行时则无法改变该值。在Go程序中常量可定义为数值、布尔值或字符串等类型。
@@ -79,9 +79,9 @@ Go对于已声明但未使用的变量会在编译阶段报错比如下面的
const prefix = "astaxie_"
##内置基础类型
## 内置基础类型
###Boolean
### Boolean
在Go中布尔值的类型为`bool`,值是`true``false`,默认为`false`
@@ -95,7 +95,7 @@ Go对于已声明但未使用的变量会在编译阶段报错比如下面的
}
###数值类型
### 数值类型
整数类型有无符号和带符号两种。Go同时支持`int``uint`这两种类型的长度相同但具体长度取决于不同编译器的实现。当前的gcc和gccgo编译器在32位和64位平台上都使用32位来表示`int``uint`但未来在64位平台上可能增加到64位。Go里面也有直接定义好位数的类型`rune`, `int8`, `int16`, `int32`, `int64``byte`, `uint8`, `uint16`, `uint32`, `uint64`。其中`rune``int32`的别称,`byte``uint8`的别称。
@@ -118,7 +118,7 @@ Go对于已声明但未使用的变量会在编译阶段报错比如下面的
fmt.Printf("Value is: %v", c)
###字符串
### 字符串
我们在上一节中讲过Go中的字符串都是采用`UTF-8`字符集编码。字符串是用一对双引号(`""`)或反引号(`` ` `` `` ` ``)括起来定义,它的类型是`string`。
@@ -166,7 +166,7 @@ Go中可以使用`+`操作符来连接两个字符串:
`` ` `` 括起的字符串为Raw字符串即字符串在代码中的形式就是打印时的形式它没有字符转义换行也将原样输出。
###错误类型
### 错误类型
Go内置有一个`error`类型专门用来处理错误信息Go的`package`里面还专门有一个包`errors`来处理错误:
err := errors.New("emit macho dwarf: elf header corrupted")
@@ -174,15 +174,15 @@ Go内置有一个`error`类型专门用来处理错误信息Go的`package`
fmt.Print(err)
}
###Go数据底层的存储
### Go数据底层的存储
下面这张图来源于[Russ Cox Blog](http://research.swtch.com/)中一篇介绍[Go数据结构](http://research.swtch.com/godata)的文章,大家可以看到这些基础类型底层都是分配了一块内存,然后存储了相应的值。
![](images/2.2.basic.png?raw=true)
##一些技巧
## 一些技巧
###分组声明
### 分组声明
在Go语言中同时声明多个常量、变量或者导入多个包时可采用分组的方式进行声明。
@@ -220,7 +220,7 @@ Go内置有一个`error`类型专门用来处理错误信息Go的`package`
>除非被显式设置为其它值或`iota`,每个`const`分组的第一个常量被默认设置为它的0值第二及后续的常量被默认设置为它前面那个常量的值如果前面那个常量的值是`iota`,则它也被设置为`iota`。
###iota枚举
### iota枚举
Go里面有一个关键字`iota`,这个关键字用来声明`enum`的时候采用它默认开始值是0每调用一次加1
@@ -233,14 +233,14 @@ Go里面有一个关键字`iota`,这个关键字用来声明`enum`的时候采
const v = iota // 每遇到一个const关键字iota就会重置此时v == 0
###Go程序设计的一些规则
### Go程序设计的一些规则
Go之所以会那么简洁是因为它有一些默认的行为
- 大写字母开头的变量是可导出的,也就是其它包可以读取的,是公用变量;小写字母开头的就是不可导出的,是私有变量。
- 大写字母开头的函数也是一样,相当于`class`中的带`public`关键词的公有函数;小写字母开头的就是有`private`关键词的私有函数。
##array、slicemap
## array、slicemap
###array
### array
`array`就是数组,它的定义方式如下:
var arr [n]type
@@ -276,7 +276,7 @@ Go之所以会那么简洁是因为它有一些默认的行为
![](images/2.2.array.png?raw=true)
###slice
### slice
在很多应用场景中数组并不能满足我们的需求。在初始定义数组时我们并不知道需要多大的数组因此我们就需要“动态数组”。在Go里面这种数据结构叫`slice`
@@ -360,7 +360,7 @@ slice有一些简便的操作
注:`append`函数会改变`slice`所引用的数组的内容,从而影响到引用同一数组的其它`slice`。
但当`slice`中没有剩余空间(即`(cap-len) == 0`)时,此时将动态分配新的数组空间。返回的`slice`数组指针将指向这个空间,而原数组的内容将保持不变;其它引用此数组的`slice`则不受影响。
###map
### map
`map`也就是Python中字典的概念它的格式为`map[keyType]valueType`
@@ -410,7 +410,7 @@ slice有一些简便的操作
m1["Hello"] = "Salut" // 现在m["hello"]的值已经是Salut了
###make、new操作
### make、new操作
`make`用于内建类型(`map`、`slice` 和`channel`)的内存分配。`new`用于各种类型的内存分配。