指针
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)