Merge branch 'master' of https://github.com/astaxie/build-web-application-with-golang
Conflicts: 2.2.md 2.3.md genepub.sh
This commit is contained in:
36
2.2.md
36
2.2.md
@@ -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)的文章,大家可以看到这些基础类型底层都是分配了一块内存,然后存储了相应的值。
|
||||
|
||||

|
||||
|
||||
##一些技巧
|
||||
## 一些技巧
|
||||
|
||||
###分组声明
|
||||
### 分组声明
|
||||
|
||||
在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、slice和map
|
||||
## array、slice、map
|
||||
|
||||
###array
|
||||
### array
|
||||
`array`就是数组,它的定义方式如下:
|
||||
|
||||
var arr [n]type
|
||||
@@ -276,7 +276,7 @@ Go之所以会那么简洁,是因为它有一些默认的行为:
|
||||

|
||||
|
||||
|
||||
###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`用于各种类型的内存分配。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user