Go语言切片
Go语言切片(slice)相当于动态数组,可以随意扩展元素。但是我们在使用过程中,还是要稍微注意该语言与其他语言不同的地方的,比如slice如果是截取一个数组的话,实际上是一个指向该数组的指针,其实际容量会受原数组的影响,对slice重新赋值时,有可能影响被截取的数组内容,这在其他语言里是没有的。
以下是一些代码示例 use_slice.go
package main
import "fmt"
func main() {
arrStr := [...]string{"java", "c","c++","python","c#","basic"}
sliceStr := arrStr[1:4:5] //下标一表示起始位置,下标二表示结束位置(不包含该位置元素),下标三表示cap容量 cap=len+1,容量可以设置大于len+1
fmt.Println("len(arrStr),cap(arrStr)", len(arrStr), cap(arrStr))
fmt.Println(arrStr)
fmt.Println("len(sliceStr),cap(sliceStr)", len(sliceStr), cap(sliceStr))
fmt.Println(sliceStr)
sliceStr[0] = "Go"
fmt.Println("after assigning slice, arrStr:")
sliceStr = append(sliceStr, "ruby")
fmt.Println(arrStr) //不超容量重新赋值后之前的数组会跟着改变
fmt.Println("len(sliceStr),cap(sliceStr)", len(sliceStr), cap(sliceStr))
fmt.Println(sliceStr)
sliceStr2 := arrStr[1:4]
fmt.Println("after assigning slice again")
sliceStr2 = append(sliceStr2, "ruby", "php", "javascript", "pl-sql")
fmt.Println(arrStr) //超容量重新赋值后之前的数组不会跟着改变
fmt.Println("len(sliceStr2),cap(sliceStr2)", len(sliceStr2), cap(sliceStr2))
fmt.Println(sliceStr2)
sliceStr3 := []string{"are","you","ok"}
var sliceStr4 = make([]string ,3)
copy(sliceStr4, sliceStr3) //copy会复制原有切片的值,修改时不影响原有元素。
var sliceStr5 = make([]string,5,10)
sliceStr4[0] = "how"
sliceStr4[1] = "are"
sliceStr4 = append(sliceStr4, "you")
sliceStr5 = sliceStr3[0:3]
sliceStr5 = append(sliceStr5, "do","not")
fmt.Println(sliceStr3)
fmt.Println(sliceStr4)
fmt.Println(sliceStr5)
}
最终运行结果
len(arrStr),cap(arrStr) 6 6
[java c c++ python c# basic]
len(sliceStr),cap(sliceStr) 3 4
[c c++ python]
after assigning slice, arrStr:
[java Go c++ python ruby basic]
len(sliceStr),cap(sliceStr) 4 4
[Go c++ python ruby]
after assigning slice again
[java Go c++ python ruby basic]
len(sliceStr2),cap(sliceStr2) 7 10
[Go c++ python ruby php javascript pl-sql]
[are you ok]
[how are ok you]
[are you ok do not]