1.指针
指针保存了值的内存地址。
类型 *T 是指向 T 类型值的指针,其零值为 nil。
& 操作符会生成一个指向其操作数的指针。
* 操作符表示指针指向的底层值。
package main
import "fmt"
func main() {
i, j := 42, 27
p := &i // 指向 i
fmt.Println(*p) // 通过指针读取 i 的值
*p = 21 // 通过指针设置 i 的值
fmt.Println(i) // 查看 i 的值
p = &j // 指向 j
*p = *p / 9 // 通过指针对 j 进行除法运算
fmt.Println(j) // 查看 j 的值
fmt.Println(&j)
fmt.Println(p)
fmt.Println(&p)
fmt.Println(*p)
}
42
21
3
0x40e024
0x40e024
0x40c138
3
2.切片(一)
切片并不存储任何数据,它只是描述了底层数组中的一段。
更改切片的元素会修改其底层数组中对应的元素。
与它共享底层数组的切片都会观测到这些修改。
package main
import "fmt"
func main() {
names := [4]string{
"John",
"Paul",
"George",
"Ringo",
}
fmt.Println(names)
a := names[0:2]
b := names[1:3]
fmt.Println(a, b)
b[0] = "XXX"
fmt.Println(a, b)
fmt.Println(names)
}
[John Paul George Ringo]
[John Paul] [Paul George]
[John XXX] [XXX George]
[John XXX George Ringo]
3.切片(二)
package main
import "fmt"
func main() {
s := []int{2, 3, 5, 7, 11, 13}
s1 := s[1:4]
fmt.Println(s1,len(s1), cap(s1))
s2 := s[:2]
fmt.Println(s2,len(s2), cap(s2))
s3 := s[1:]
fmt.Println(s3,len(s3), cap(s3))
s4 := s[:]
fmt.Println(s4,len(s4), cap(s4))
}
[3 5 7] 3 5
[2 3] 2 6
[3 5 7 11 13] 5 5
[2 3 5 7 11 13] 6 6
4.Range
可以将下标或值赋予 _ 来忽略它。
for i, _ := range pow
for _, value := range pow
若只需要索引,忽略第二个变量即可。
for i := range pow
package main
import "fmt"
func main() {
pow := make([]int, 10)
for i := range pow {
pow[i] = 1 << uint(i) // == 2**i
}
for _, value := range pow {
fmt.Printf("%d\n", value)
}
for index := range pow {
fmt.Printf("%d\n", index)
}
}
5.映射赋值
package main
import "fmt"
func main() {
m := make(map[string]int)
m["Answer"] = 42
fmt.Println("The value:", m["Answer"])
m["Bnswer"] = 48
fmt.Println("The value:", m["Bnswer"])
fmt.Println("The value:", m)
delete(m, "Answer")
fmt.Println("The value:", m["Answer"])
v, ok := m["Answer"]
fmt.Println("The value:", v, "Present?", ok)
w, ok := m["Bnswer"]
fmt.Println("The value:", w, "Present?", ok)
}
The value: 42
The value: 48
The value: map[Answer:42 Bnswer:48]
The value: 0
The value: 0 Present? false
The value: 48 Present? true