AI智能
改变未来

Go基础语法(2)


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

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Go基础语法(2)