(一)指针:
1.每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置
B = 10
A := &B
总结: 取地址操作符&
和取值操作符*
是一对互补操作符,&
取出地址,*
根据地址取出地址指向的值。
2.指针传值
func mod1(x int) {
x = 5
}//未传值
func mod2(y *int) {
*y = 10
}//传值
func main() {
a := 1
mod1(a)
fmt.Println(a) // 1
mod2(&a)
fmt.Println(a) // 10
}
(二)切片:
1.基本语法声:
var name []T
name:变量名
T:切片类型
func main() {
var (
x = []bool{false, true} //声明一个布尔切片并初始化
y []string //声明一个字符串切片
z = []int{} //声明了一个整型切片并初始化
)
fmt.Println(x) //[false true]
fmt.Println(y) //[]
fmt.Println(z) //[]
fmt.Println(x == nil) //false
fmt.Println(y == nil) //true
fmt.Println(z == nil) //false
//fmt.Println(x==y)//切片是引用类型,不支持直接比较,只能和nil比较
}
切片可以通过使用内置的len()
函数求长度,cap()
函数求切片的容量。
2.切片赋值拷贝
下面的代码中演示了拷贝前后两个变量共享底层数组,对一个切片的修改会影响另一个
切片的内容,这点需要特别注意。
func main() {
s1 := make([]int, 3) //[0 0 0]
s2 := s1 //将s1直接赋值给s2,s1和s2共用一个底层数组
s2[0] = 100
fmt.Println(s1) //[100 0 0]
fmt.Println(s2) //[100 0 0]
}
3.切片遍历
切片的遍历方式和数组是一致的,支持索引遍历和for range
遍历。
func main() {
s := []int{1, 3, 5}
for i := 0; i < len(s); i++ {
fmt.Println(i, s[i])
}
for index, value := range s {
fmt.Println(index, value)
}
}
4.切片的增加与复制和删除
Go语言的内建函数append()
可以为切片动态添加元素。 可以一次添加一个元素,可以添加多
个元素,也可以添加另一个切片中的元素(后面加…)。
func main(){
var s []int
s = append(s, 1) // [1]
s = append(s, 2, 3, 4) // [1 2 3 4]
s2 := []int{5, 6, 7}
s = append(s, s2...) // [1 2 3 4 5 6 7]
}
注意:通过var声明的零值切片可以在append()
函数直接使用,无需初始化。
var s []int
s = append(s, 1, 2, 3)
复制切片Go语言内建的copy()
函数可以迅速地将一个切片的数据复制到另外一个切片空间中
func main() {
// copy()复制切片
a := []int{1, 2, 3, 4, 5}
c := make([]int, 5, 5)
copy(c, a) //使用copy()函数将切片a中的元素复制到切片c
fmt.Println(a) //[1 2 3 4 5]
fmt.Println(c) //[1 2 3 4 5]
c[0] = 1000
fmt.Println(a) //[1 2 3 4 5]
fmt.Println(c) //[1000 2 3 4 5]//不干扰a切片
}
go语言内没有删除切片元素的方法但可以使用特性来删除(a = append(a[:index], a[index+1:]...)
func main() {
// 从切片中删除元素
a := []int{0, 1, 2, 3, 4, 5, 6, 7}
// 要删除索引为5的元素
a = append(a[:5], a[6:]...)
fmt.Println(a) //[0 1 2 3 4 6 7]
}