变量和内存地址
1. 每个变量都有内存地址,可以说通过变量来操作对应⼤⼩的内存
var a int32
a = 100
fmt.Printf(“%d\n”, a)
fmt.Printf(“%p\n”, &a)
注意:通过&符号可以获取变量的地址
2. 普通变量存储的是对应类型的值,这些类型就叫值类型
指针类型
3. 指针类型的变量存储的是⼀个地址,所以⼜叫指针类型或引⽤类型
4. 指针类型定义,var 变量名 *类型
package main
import (
"fmt"
)
func main() {
b := 255
var a *int = &b
fmt.Printf("Type of a is %T\n", a)
fmt.Println("address of b is", a)
}
5. 指针类型变量的默认值为nil,也就是空地址
package main
import (
"fmt"
)
func main() {
a := 25
var b *int
if b == nil {
fmt.Println("b is", b)
b = &a
fmt.Println("b after initialization is", b)
}
}
6. 如果操作指针变量指向的地址⾥⾯的值呢?
package main
import (
"fmt"
)
func main() {
b := 255
a := &b
fmt.Println("address of b is", a)
fmt.Println("value of b is",*a)
}
注意:通过* 符号可以获取指针变量指向的变量
7. 通过指针修改变量的值
package main
import (
"fmt"
)
func main() {
b := 255
a := &b
fmt.Println("address of b is", a)
fmt.Println("value of b is",*a)
*a++
fmt.Println("new value of b is", b)
}
8. 指针变量传参
package main
import (
"fmt"
)
func change(val *int) {
*val = 55
}
func main() {
a := 58
fmt.Println("value of a before function call is",a)
b := &a
change(b)
fmt.Println("value of a after function call is", a)
}
9. 指针变量传参示例2
package main
import (
"fmt"
)
func modify(arr *[3]int) {
(*arr)[0] = 90
}
func main() {
a := [3]int{89, 90, 91}
modify(&a)
fmt.Println(a)
}
10.切⽚传参
package main
import (
"fmt"
)
func modify(sls []int) {
sls[0] = 90
}
func main() {
a := [3]int{89, 90, 91}
modify(a[:])
fmt.Println(a)
}
注意:切⽚是引⽤类型!!
11. make⽤来分配引⽤类型的内存,⽐如 map、slice以及channel,new⽤来分配除引⽤类型的所有其他类型的内存,⽐如 int、数组等
值拷贝和引用拷贝
12. 值拷⻉和引⽤拷⻉
13. 值拷⻉和引⽤拷⻉