指针声明
var p *int
或者
i := 2
p = &i
*p 表示取内容
但是对于数组/结构,可以直接通过p[1]/p.X来访问
结构的定义有点类似与C
type Vertex struct {
X int
Y int
}
初始化可以使用
v := Vertex{1, 2}
v.X = 4
其他几种定义方式
var (
v1 = Vertex{1, 2} // has type Vertex
v2 = Vertex{X: 1} // Y:0 is implicit
v3 = Vertex{} // X:0 and Y:0
p = &Vertex{1, 2} // has type *Vertex
)
数组的定义
var a [10]int
Slices是一个类似与数组的东西,它以一个数组为基础加上了长度信息。这里有详细的介绍http://blog.csdn.net/wuwenxiang91322/article/details/9072449
var a [10]int
s := a[1:5]
此时slice的长度为4,容量为10
同时s的初始化既可以s := []int{2, 3, 5, 7, 11, 13} 也可以 s := [12]int{2, 3, 5, 7, 11, 13} 二者只是cap(s)不同,len(s)相同
s可以进行切片,比如s[1:2]
同时s也可以使用make:
s := make([]int, 0, 5) 其中len = 0, cap = 5
slice也可以使用append添加元素
a = append(a, 2, 3, 4)
但是添加涉及到len 和 cap的不同增加,还需后续研究
元素历遍
var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}
func main() {
for i, v := range pow {
fmt.Printf("2**%d = %d\n", i, v)
}
}
i代表index, 从0开始,也可以使用for _, value := range pow{}忽略index
map的声明,初始化和赋值
var m map[string]int
func main() {
m = make(map[string]int)
m["Bell Labs"] = 2
fmt.Println(m["Bell Labs"])
}
也可以一次性声明加初始化
m := map[string]int{
"Bell Labs": 1,
"Google": 2,
}
注意1上面的2后面必须有逗号,而是:=只能用于函数内,外部必须用var
使用delete(m, "Answer")可以删除元素。但是访问m["Answer"] 返回 0, 这是需要使用
elem, ok = m[key]
如果为空则ok==false
func也可以赋给变量
hypot := func(x, y float64) float64 {
return math.Sqrt(x*x + y*y)
}
fmt.Println(hypot(3, 4))
同时go语言支持闭包,可以在函数内定义函数并返回
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}