1 go语言在参数传递中只有值传递一种方式
package main
import "fmt"
func swap(a, b int) (int, int) {
return b, a
}
func main() {
a, b := 3, 4 //赋值
a, b = swap(a, b) //接住返回的值
fmt.Println(a, b)
}
输出结果为: 4 3
上面的函数 swap也可以写成以下形式:
func sawp(a,b *int) {
*a,*b = *b,*a
}
调用形式为:
a,b := 3,4
swap(&a,&b)
fmt.Println(a,b)
2 go语言与数组表示:
package main
import "fmt"
func main() {
var arr1 [5]int // 定义数组时需要做到名字和声明长度在前,类型在后
arr2 := [3]int{1, 2, 3}
arr3 := [5]int{2, 4, 6, 8, 10}
var grid [4][5]int /*这里是二维数组,需要注意的是表达式不能写作: grid:= [4][5] int .程序会报错*/
fmt.Println(arr1, arr2, arr3, grid)
for _, v := range arr3 {
fmt.Println(v)
/*注意range的用法,range 是一个关键字,可以用来遍历数组,这里的下划线表示省略一个变量比如本来是写做 for i,v := range arr3{ fmt.Println(i,v)}的,现在我不想用i了,便可以用_来代替。就如同该式*/
}
}
输出结果见 jc22.go
3 .slice
package main
import "fmt"
func main() {
arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
s := arr[2:6]
/*在这里[2:6]的形式表示slice(切片),其中计算机语言里的[。。。]一般表示左闭右开*/
fmt.Println("arr[2:6]=", s)
}
故该程序输出结果为:arr[2,6]=2,3,4,5
基本概念:slice可以理解为是一个数据结构,它可以理解为是对下层数组的一个view,举一个程序例子如下:
其输出结果如下:
我们作出以下解释:现在的s1=[2,3,4,5,6,7],我们在s1的基础上进行updateSlice函数后,里面的s[0]变为100,注意这时原来的2的位置也变为100了,故s1=[100,3,4,5,6,7],再对s2进行同样的操作,这时s2=[100,1, 100,3,4,5,6,7].而原数组也变为[100,1,100,3,4,5,6,7]
我们再来看reslice操作,经过再一次reslice,s2=[100,1,100,3,4],在经过一次reclice,变为[100,3,4].
现在我们再加深一下对slice的理解
从图中我们可以看到阴影部分为slice隐藏的数据,再一次slice时如果没有超出阴影的长度(你切多了)我们就可以取到那里的值。
例子:
输出结果为:
我们在这里加入了Extending slice,并把值变回最初的样子,以便我们观察:
s1=[2,3,4,5],再s1基础上进行切片得到s2=[5,6].。但是这里s1只显示了[2,3,4,5],没有显示的部分是s[4]=6,s[5]=7,在S2切片时,可以切到后面(也就是图中阴影部分)的值。
网友评论