没有安装Go环境的,可以先参阅下面文章:Go语言零基础入门,从安装到运行代码 安装好了之后,想快速了解Go语言的可以先看下面两篇文章:
Go语言零基础入门,捕获错误、slice切片、for循环、testhttps://blog.csdn.net/weixin_41896770/article/details/127510535
Go语言进阶,闭包、指针、并发https://blog.csdn.net/weixin_41896770/article/details/127547900
make
make函数属于内置函数,类似于C++中的malloc申请内存空间的功能,但是有个很大的区别是make出来的数组,变量表示的是整个数组,而我们熟知的C语言是指向第一个元素的指针,这个需要注意。
我们这里先看个示例:
x := make([]string, 13)
fmt.Printf("%v",x) //[ ]
y := make([]int, 5)
fmt.Printf("%v", y) //[0 0 0 0 0]
z := make([]bool, 4)
fmt.Printf("%v", z) //[false false false false]
分别创建长度为13的字符串数组,默认是空字符串;长度为5的整型数组,默认是0;长度为4的布尔型数组,默认是false。如果不使用make的话,比如:
var x []string
fmt.Println(x==nil)//true
我们知道这个零值就是nil,当然也没有长度了,长度为0
除了创建指定长度的数组外,还可以指定它们的容量:
fmt.Printf("长度:%d,容量:%d,值:%v", len(a), cap(a), a)// 长度:2,容量:5,值:[0 0]
也可以通过切片来更改,注意长度与容量的区别:
i := []int{1, 3, 5, 7, 9}
i = i[:0]
fmt.Printf("长度:%d,容量:%d,值:%v", len(i), cap(i), i) // 长度:0,容量:5,值:[]
当然也可以通过切片来扩容:
i=i[:2]
fmt.Printf("长度:%d,容量:%d,值:%v", len(i), cap(i), i) // 长度:2,容量:5,值:[1 3]
append
append很常见的一个内置函数,在末尾添加新的切片元素,数组小了,它会自动分配一个更大的数组,返回的切片会指向这个新分配的数组。跟Python有点语法细节的区别,如下:
package mainimport "fmt"func main() {var s []intprintSlice(s)// 添加一个空切片s = append(s, 0)printSlice(s)// 这个切片会按需增长s = append(s, 1)printSlice(s)// 可以一次性添加多个元素s = append(s, 2, 3, 4)printSlice(s)
}func printSlice(s []int) {fmt.Printf("长度:%d,容量:%d,值:%v\n", len(s), cap(s), s)
}/*
长度:0,容量:0,值:[]
长度:1,容量:1,值:[0]
长度:2,容量:2,值:[0 1]
长度:5,容量:6,值:[0 1 2 3 4]
*/
可以看出这个容量是大于等于长度的,就是分配的内存空间,而长度就是实际值的个数。
struct结构体
结构体是一种很常见的自定义类型,比如常见的二叉树结构,双向链表等,前面有熟悉过 Go语言模拟康威生命游戏Conway‘s Game of Life
Go语言并发比较二叉树(Binary Tree)
那对于结构体就显得非常简单了,这里主要是结合map映射来熟悉下用法。
比如定义“人”的结构体,显示身高和体重:
type Person struct {height, weight float64
}
然后我们通过上面的make来申请内存空间,这里使用map映射
package mainimport "fmt"type Person struct {height, weight float64
}var p map[string]Personfunc main() {p = make(map[string]Person)p["Tony"] = Person{173.5, 70,}fmt.Println(p["Tony"], p["Tony"].height)
}
// {173.5 70} 173.5
或者直接初始化也可以,如下:
func main() {p = map[string]Person{"Tony": Person{173.5, 70},"姚明": Person{226, 140.6},}fmt.Println(p, p["姚明"].weight)
}
// map[Tony:{173.5 70} 姚明:{226 140.6}] 140.6
如果定义类型只是一个类型名,还可以使用省略的写法:
func main() {p = map[string]Person{"Tony": {173.5, 70},"姚明": {226, 140.6},}fmt.Println(p, p["姚明"].weight)
}
这种键值对,看起来就显得更简洁了。
另外需要了解双赋值的概念,这个可以检测某个键是否存在:
func main() {m := make(map[string]int)m["hi"] = 100m["hello"] = 110fmt.Println(m) // map[hello:110 hi:100]delete(m, "hi")fmt.Println(m) // map[hello:110]v1, ok1 := m["hello"]fmt.Println(v1, ok1) //110 truev2, ok2 := m["hi"]fmt.Println(v2, ok2) // 0 false
}
删除了键为hi之后,我们看到ok2是false,可以通过这个布尔值来检测是否存在这个键。