Go基础语法
数组
定义数组需要定义其名称、大小和类型
var name[size] type
其中数组大小也可以通过[…]让程序自动去识别数组内有多少元素。
如下分别定义了三个一维数组和一个二维数组。
var arr1 [5]intarr2:=[3]int{1,3,5}arr3:=[...]int{2,11,43,52,67,32}var grid [4][5]intfmt.Println(arr1)fmt.Println(arr2)fmt.Println(arr3)fmt.Println(grid)
结果为
[0 0 0 0 0] [1 3 5] [2 11 43 52 67 32] [[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]
其次,我们对定义的数组还可以分别对其值和索引号进行遍历。
for i,v :=range arr3 {fmt.Println(i,v)}
我们对arr3其中的值和索引进行遍历,得到结果
0 2 1 11 2 43 3 52 4 67 5 32
但如果我们需要单独使用索引或者值是,用刚才那种方法也是可以的。例如我们对数组遍历求和,就不需要用到索引,只需要用到值。
因为定义了的变量就必须使用,所以索引号我们用_来接收就可以不用使用到它
sum:=0for _,v :=range arr3{sum+=v}println(sum)
得到结果`207
数组的调用是使用的值传递
func change(arr [6]int) {arr[0]=100fmt.Println(arr)}func main() {arr:=[...]int{2,11,43,52,67,32}change(arr)fmt.Println(\"after \\n\",arr)}
其中我们定义了一个函数,将数组的第一位改为100,再在主函数中定义了一个数组,调用数组,得到的结果是
[100 11 43 52 67 32]after[2 11 43 52 67 32]
可以看到,原数组只是将值拷贝了给函数,而它自己本身是没有变化的。
指针
指针是指向一个值的内存地址,定义方法如下。
var name *type
var x int =10var P *intP = &xfmt.Println(\"x的内存地址\",&x)fmt.Println(\"P的指针地址\",P)fmt.Println(\"P的值\",*P)
定义了一个x,P指向x的地址,然后输出。
x的内存地址 0xc0000a0098P的指针地址 0xc0000a0098P的值 10
使用指针进行变量交换
func swap(a,b *int){*b,*a=*a,*b}func main() {a, b :=3,4swap(&a,&b)fmt.Println(a,b)}
swap函数传进来的是两个地址,b的指针指向a,a的指针指向b,从而实现交换。
得到结果
4 3
切片
先定义了一个数组,切片就是选择其中多少的值,比如[2:6]就是选择从下标为2到5的数据数组下标从0
func main() {arr:=[...]int{0,1,2,3,4,5,6,7}fmt.Println(\"arr[2:6]\",arr[2:6])fmt.Println(\"arr[:6]\",arr[:6])fmt.Println(\"arr[2:]\",arr[2:])fmt.Println(\"arr[:]\",arr[:])}
得到结果
arr[2:6] [2 3 4 5]arr[:6] [0 1 2 3 4 5]arr[2:] [2 3 4 5 6 7]arr[:] [0 1 2 3 4 5 6 7]
我们对切片后的数组进行修改,原始的数组值也会发生改变。如下,我们定义一个切片s1它从2到5,我们把它第一个位置改为100,而它第一个位置对应了原数组的第三个位置,所以也做了一定的修改。
arr:=[...]int{0,1,2,3,4,5,6,7}s1 := arr[2:6]s1[0]=100fmt.Println(s1)fmt.Println(arr)
结果为
[100 3 4 5][0 1 100 3 4 5 6 7]
使用append函数对数组后添加元素,在原数组也会进行修改,但如果越界就不会更改了。
func main() {arr:=[...]int{0,1,2,3,4,5,6,7}arr1:=arr[2:6]arr2:=append(arr1,10)arr3:=append(arr2,11)arr4:=append(arr3,12)fmt.Println(\"arr1\",arr1)fmt.Println(\"arr2\",arr2)fmt.Println(\"arr3\",arr3)fmt.Println(\"arr4\",arr4)fmt.Println(\"arr\",arr)}
得到结果
arr1 [2 3 4 5]arr2 [2 3 4 5 10]arr3 [2 3 4 5 10 11]arr4 [2 3 4 5 10 11 12]arr [0 1 2 3 4 5 10 11]
使用Copy对切片进行复制操作。
func main() {array:=[...]int{2,4,6,8,10,12,14,16,18}s1:=array[0:4]s2:=make([]int,16)fmt.Println(s2)copy(s2,s1)fmt.Println(s2)}
得到结果为
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0][2 4 6 8 0 0 0 0 0 0 0 0 0 0 0 0]
Map
Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
可以通过两种方式来创建它。如下,创建了一个都是字符型的map和一个空map。
m1:=map[string]string{\"name\":\"张三\",\"age\":\"18\",\"course\":\"golang\",}m2:=make(map[string]int)fmt.Println(m1)fmt.Println(m2)
结果为
map[age:18 course:golang name:张三]map[]
map也可以通过遍历
for k,v:=range m1{fmt.Println(k,v)
得到结果
name 张三age 18course golang
也可以通过访问name去得到它的值
name:=m1[\"name\"]
但如果我们输错了它会得到什么情况呢
还是像上边一样,我们先输入正确的值。
name,ok:=m1[\"name\"]fmt.Println(name,ok)
得到结果
张三 true
再输入一个错误的
age,ok:=m1[\"agg\"]fmt.Println(age,ok)
然后就会得到
false
使用delete可以删除其中的值,这里就把name里面的值删除了。
delete(m1,\"name\")
除了slice,map,function的内建类型都可以作为key