go语言切片多种定义方式 go语言的切片( 二 )


fmt.Println("\n~~~~~~元素遍历~~~~~~")
for _, ele := range slice0 {
fmt.Print(ele, " ")
ele = "7"
}
fmt.Println("\n~~~~~~索引遍历~~~~~~")
for index := range slice0 {
fmt.Print(slice0[index], " ")
}
fmt.Println("\n~~~~~~元素索引共同使用~~~~~~")
for index, ele := range slice0 {
fmt.Print(ele, slice0[index], " ")
}
fmt.Println("\n~~~~~~修改~~~~~~")
for index := range slice0 {
slice0[index] = "9"
}
fmt.Println(slice0)
}
如上,前三种循环使用了不同的for range循环,当for后面 , range前面有2个元素时 , 第一个元素代表索引,第二个元素代表元素值 , 使用 “_” 则表示忽略,因为go语言中,未使用的值会导致编译错误 。
只有一个元素时 , 该元素代表索引 。
只有用索引才能修改元素 。如在第一个遍历中,赋值ele为7,结果没有作用 。因为在元素遍历中,ele是值传递,ele是该切片元素的副本,修改它不会影响原本值 , 而在第四个遍历——索引遍历中,修改的是该切片元素引用的值,所以可以修改 。
结果为:
~~~~~~元素遍历~~~~~~
a b c d e
~~~~~~索引遍历~~~~~~
a b c d e
~~~~~~元素索引共同使用~~~~~~
aa bb cc dd ee
~~~~~~修改~~~~~~
[9 9 9 9 9]
(4)、追加、复制切片:
复制代码代码如下:
func test11() {
slice := []int32{}
fmt.Printf("slice的长度为:%d,slice为:%v\n", len(slice), slice)
slice = append(slice, 12, 11, 10, 9)
fmt.Printf("追加后,slice的长度为:%d,slice为:%v\n", len(slice), slice)
slicecp := make([]int32, (len(slice)))
fmt.Printf("slicecp的长度为:%d,slicecp为:%v\n", len(slicecp), slicecp)
copy(slicecp, slice)
fmt.Printf("复制赋值后,slicecp的长度为:%d,slicecp为:%v\n", len(slicecp), slicecp)
}
追加、复制切片,用的是内置函数append和copy,copy函数返回的是最后所复制的元素的数量 。
(5)、内置函数append
内置函数append可以向一个切片后追加一个或多个同类型的其他值 。如果追加的元素数量超过了原切片容量 , 那么最后返回的是一个全新数组中的全新切片 。如果没有超过 , 那么最后返回的是原数组中的全新切片 。无论如何,append对原切片无任何影响 。如下示例:
复制代码代码如下:
func test12() {
slice := []int32{1, 2, 3, 4, 5, 6}
slice2 := slice[:2]
_ = append(slice2, 50, 60, 70, 80, 90)
fmt.Printf("slice为:%v\n", slice)
fmt.Printf("操作的切片:%v\n", slice2)
_ = append(slice2, 50, 60)
fmt.Printf("slice为:%v\n", slice)
fmt.Printf("操作的切片:%v\n", slice2)
}
如上,append方法用了2次,结果返回的结果完全不同,原因是第二次append方法追加的元素数量没有超过 slice 的容量 。而无论怎样,原切片slice2都无影响 。结果:
slice为:[1 2 3 4 5 6]
操作的切片:[1 2]
slice为:[1 2 50 60 5 6]
操作的切片:[1 2]
Go小知识新解1、值接收者和指针接收者
所谓指针接收者和值接收者这两个概念 , 用GO写了一阵子代码的人都了解了,这里只做简要说明一下,也就是对于一个给定结构,咱们对结构进行方法包装的时候,固定必传的参数 , 用来指向这个对象结构自身的一个参数,在go中也就是形式如下:
我们对结构体testStruct进行了包装 , 提供了两个方法,sum和modify , 其中sum的方法接收者为a testStruct,这个就是值接收者,而modify的接收者为a *testStruct就是指针接收者,也就是说固定对象指针,一个传递的是指针地址,而另外一个直接传递的是结构值拷贝了