指针
func swap(a, b *int) {
*a, *b = *b, *a
}
函数只有值传递,没有引用
交换值
func main() {
a, b := 3, 4
a, b = swap(a, b)
fmt.Println(a, b)
}
func swap(a, b int) (int,int){
return b,a
}
数组定义
func main() {
var arr1 [3]int
arr2 := [3]int{1, 2, 3}
arr3 := [...]int{1, 2, 3}
fmt.Println(arr1, arr2, arr3)
}
:= 必须有初始值
遍历数组
func traversalArr() {
arr4 := [...]int{1, 2, 3, 4, 5}
for i := 0; i < len(arr4); i++ {
fmt.Println(arr4[i])
}
}
利用range获得数组下标
arr5 := [...]int{1, 2, 3, 4, 5}
for i := range arr5 {
fmt.Println(arr5[i])
}
利用range直接获得数组元素
for _, v := range arr5 {
fmt.Println(v)
}
数组是值类型
func printArr(arr [3]int) {
for _, v := range arr {
fmt.Println(v)
}
}
- 在形参时,会拷贝一份。
- [3]int, [5]int是不同的类型
- 在GO语言中一般不直接使用数组
切片定义
func main() {
arr := [...]int{0, 1, 2, 3, 4, 5, 6}
fmt.Println("arr[1:5]:", arr[1:5])
fmt.Println("arr[:5]:", arr[:5])
fmt.Println("arr[1:]:", arr[1:])
fmt.Println("arr[:]:", arr[:])
}
切片是数组的视图
func updateArr(arr []int) {
arr[0] = 100
}
func main() {
arr := [...]int{0, 1, 2, 3, 4, 5, 6}
fmt.Println(arr)
updateArr(arr[:])
fmt.Println("After arr:")
fmt.Println(arr)
}
切片本身是没有数据的,是对数组的一个view
Slice扩展
arr := [...]int{0, 1, 2, 3, 4, 5, 6}
s1 := arr[2:4]
s2 := s1[1:3]
fmt.Printf("s1= %v,len(s1)= %d,cap(s1)= %d\n", s1, len(s1), cap(s1))
fmt.Printf("s2= %v,len(s2)= %d,cap(s2)= %d", s2, len(s2), cap(s2))
- Slice 可以向后扩展,不可以向前扩展
- s[i]不可以超过len(s),向后扩展不可以超过底层数组cap(s)