# 包
1. Packages
每个go程序都有一个包名。 例如:
package main
2. Imports 导入程序需要的包,以下是推荐方式。
import (
	"fmt"
	"math"
)
2
3
4
# 数据类型、变量和常量
1. 数据类型(Types)
下面是go语言常见的一些数据类型。
bool 布尔类型 Numeric Types 数字类型
- int8, int16, int32, int64, int
- uint8, uint16, uint32, uint64, uint
- float32, float64
string 字符串
2.变量声明
在函数里,我们可以使用:=方式进行变量赋值。
var i, j int = 1, 2
k := 3
2
3.常量(Constants)
常量声明类始于变量声明,但需要加上const 关键字。 常量可以是character, string, boolean或者numeric。 不能使用 := 语法进行常量赋值。
const World = "世界"
const Truth = true
2
# 复杂数据类型(Array、Slices、Structs和Maps)
1.Arrays
数组 [n]T代表有n个值的T 数据类型的数组。数组的长度无法改变。
var a [3]int //int array with length 3
a := [3]int{12, 78, 50} // short hand declaration to create array
2
数组长度是将数组作为len函数的参数。
package main
import "fmt"
func main() {
    a := [...]float64{67.7, 89.8, 21, 78}
    fmt.Println("length of a is",len(a))
}
2
3
4
5
6
7
8
2.Slices
数组一个固定长度的数组,而Slices是一个动态数组。实践中Slices比数组更常用。
s := []int{2, 3, 5, 7, 11, 13}
Slices有长度length和容量capacity两个函数。length是slices里包含的元素数量,capacity是slices的容量。
package main
import (
    "fmt"
)
func main() {
    fruitarray := [...]string{"apple", "orange", "grape", "mango", "water melon", "pine apple", "chikoo"}
    fruitslice := fruitarray[1:3]
    fmt.Printf("length of slice %d capacity %d", len(fruitslice), cap(fruitslice)) //length of fruitslice is 2 and capacity is 6
}
2
3
4
5
6
7
8
9
10
11
多维slices。如同数组一样,Slices可以包含任何类型,包含Slices。
package main
import (
	"fmt"
	"strings"
)
func main() {
	// Create a tic-tac-toe board.
	board := [][]string{
		[]string{"_", "_", "_"},
		[]string{"_", "_", "_"},
		[]string{"_", "_", "_"},
	}
	// The players take turns.
	board[0][0] = "X"
	board[2][2] = "O"
	board[1][2] = "X"
	board[1][0] = "O"
	board[0][2] = "X"
	for i := 0; i < len(board); i++ {
		fmt.Printf("%s\n", strings.Join(board[i], "  "))
	}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
3.structs
go语言没有提供类,使用structs来代表对象。Structs可以被用来存储一个对象,而不是维护一些单独的数据。
type Employee struct {
    firstName string
    lastName  string
    age       int
}
2
3
4
5
package main
import (
    "fmt"
)
type Employee struct {
    firstName, lastName string
    age, salary         int
}
func main() {
    //creating structure using field names
    emp1 := Employee{
        firstName: "Sam",
        age:       25,
        salary:    500,
        lastName:  "Anderson",
    }
    //creating structure without using field names
    emp2 := Employee{"Thomas", "Paul", 29, 800}
    fmt.Println("Employee 1", emp1)
    fmt.Println("Employee 2", emp2)
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
在上面的例子中,我们定义一个Employee结构体,使用两种方式进行赋值。第一种方式指定了结构体的字段名,因此不用考虑顺序;第二方式忽略了结构体的字段名,这种情况下一定要按照字段顺序进行赋值。
匿名结构体。在匿名结构体中只是创建了一个emp3的结构体,但是没有定义一个新的结构体类型。
package main
import (
    "fmt"
)
func main() {
    emp3 := struct {
        firstName, lastName string
        age, salary         int
    }{
        firstName: "Andreah",
        lastName:  "Nikola",
        age:       31,
        salary:    5000,
    }
    fmt.Println("Employee 3", emp3)
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
4.Maps
Map包含了健值对,可以通过key获取对应的value。
type Vertex struct {
	Lat, Long float64
}
var m = map[string]Vertex{
	"Bell Labs": {40.68433, -74.39967},
	"Google":    {37.42202, -122.08408},
}
2
3
4
5
6
7
8
使用make创建map。
package main
import (
    "fmt"
)
func main() {
    personSalary := make(map[string]int)
    personSalary["steve"] = 12000
    personSalary["jamie"] = 15000
    personSalary["mike"] = 9000
    fmt.Println("personSalary map contents:", personSalary)
    elem1, ok1 := personSalary["steve"]
    fmt.Println("Value:" ,elem1," boolean:" ,ok1)
    elem2, ok2 := personSalary["eric"]
    fmt.Println("Value:" ,elem2," boolean:" ,ok2)
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
当key存在于map中时, personSalary["steve"]返回的是对应的值和true,当key不存在时,personSalary["eric"]返回的是0和false。

图 5-02_01 Map
← Golang核心知识 函数 →