导入包
1 2 3 4 5 6
| import ( "fmt" "math/rand" ) import "fmt" import "math"
|
导出名
如果一个名字以大写字母开头,那么它就是已导出的
变量
1 2 3 4
| var x int = 3 x := 3 x, y := 1, 2 const Pi = 3.14
|
函数
1 2 3 4 5 6 7 8 9
| func add(x, y int) int { return x + y } func test() (x, y int) { x = 1 y = 2 return } test := func() {}
|
类型
- 整数:
int int8~int16 uint uint8~uint64
- 浮点数:
float32 float64
- 复数:
complex64 complex128
- 字符串:
string
- 布尔值:
bool
- 字符:
byte(一个字节,等于uint8) rune(一个Unicode字符,等于int32)
类型转换:var i int = 42 var f float64 = float64(i)
循环
1 2 3 4 5
| for i := 0; i < 10; i++ { } for i < 10 {} for {}
|
条件判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| if i = 1; i < 10 {}
switch i = 1; i { case 1 + 1 : fmt.Printf(3) case 1: fmt.Printf(1) fallthrough case 2: fmt.Printf(2) default: fmt.Printf(0) }
switch { case t.Hour() < 12: fmt.Println("早上好!") case t.Hour() < 17: fmt.Println("下午好!") default: fmt.Println("晚上好!") }
|
defer 延迟执行
1 2 3 4 5 6 7
| func main() { defer fmt.Println("world1") defer fmt.Println("world2")
fmt.Println("hello") }
|
可以用于 资源释放 释放锁 关闭文件 处理错误等
指针
1 2 3 4 5
| var p *int i := 42 p = &i fmt.Println(*p) *p = 21
|
结构体
1 2 3 4 5 6 7 8 9
| type Vertex struct { X int Y int }
var v = Vertex{1, 2} fmt.Println(v.X, v.Y) p := &v fmt.Println(p.X)
|
数组和切片
1 2 3 4 5 6 7 8 9 10 11 12
| var a [10]int var s [] int
s2 = make([]int, 1, 2)
len(s2) cap(s2)
s3 = append(s2, 1, 2, 3)
for i, v := range s3 {} for _, _ := range s2 {}
|
切片的容量会根据数据动态的变化,头部被删会导致容量变小
切片可以包含任意类型
Map
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| var m map[string]int = {"a": 1} m := make(map[string]int)
type Vertex struct { Lat, Long float64 }
var m = map[string]Vertex{ "Bell Labs": Vertex{40.68433, -74.39967}, "Google": {37.42202, -122.08408}, }
m["a"] = 2 b := m["a"] delete(m, "a") elem, is_exist = m["a"]
|
方法
go 中没有类,但是可以使用方法更灵活的实现类的功能
1 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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
func (接收者变量 变量类型) 方法名(参数列表) 返回值 { }
type TestStruct struct { elem int } func (t TestStruct) get() int { return t.elem } func (t *TestStruct) SetElem(newElem int) int { t.elem = newElem }
t := TestStruct fmt.Printf(t.get()) t.SetElem(2)
type Shape interface { Area() float64 }
type Circle struct { Radius float64 }
func (c Circle) Area() float64 { return 3.14 * c.Radius * c.Radius } var s Shape
s = Circle{Radius: 5} fmt.Println("Circle Area:", s.Area())
|