1.值类型与引用类型
package main
import "fmt"
func main() {
//引用类型与值类型
//引用类型:将变量赋值给另一个变量 修改新变量 会对其他的产生影响
//值类型:将变量赋值给另一个变量 修改新变量 不会对其他的产生影响
array := [3]string{"1", "2", "3"}
slice := []string{"1", "2", "3"}
array01 := array
slice01 := slice
array01[0] = "3"
slice01[0] = "3"
fmt.Println(array01, array)
fmt.Printf("%p %p\n", &array01, &array)
fmt.Println(slice01, slice)
fmt.Printf("%p %p\n", &slice01, &slice)
//针对值类型和引用类型在赋值后新旧变量的地址并不相同,只是一样弄类型在底层共享数据结构(其中包含指针类型元素)
//int(值类型) bool(值类型) float32(值类型) float64(值类型) array(值类型) slice(引用类型) map(引用类型) 指针
//值类型:int bool float32 float64 array 指针
//引用类型:slice map
a := map[string]int{"a": 2}
b := a
b["a"] = 3
fmt.Println(a, b)
fmt.Printf("%p %p \n", a, b)
}
2.值传递与引用传递
(1)值传递
在 Go 语言中参数传递默认均为值传递(形参为实参变量的副本),对于引用类型数据因其底
层共享数据结构,所以在函数内可对引用类型数据修改从而影响函数外的原变量信息
2) 引用传递
可以通过将变量的地址通过指类型递给函数,此时可通过指针对函数外的原变量进行修改
package main
import "fmt"
func inta(a int) {
a = 200
}
func selicenum(num []int) {
num[0] = 200
}
func changenum(p *int) {
*p = 200
}
func main() {
//对于值类型在函数间的传递 不会对原先的变量有影响,对于引用类型的 会有影响
num := []int{1, 2, 3, 4, 5}
a := 2
fmt.Println(num)
fmt.Println(a)
inta(a)
selicenum(num)
fmt.Println(num)
fmt.Println(a)
//这里相当于直接把内存地址的值改了 所以会变
//形参实参所在的内存地址不同 但是指向的都是同一个内存地址(指针)
changenum(&a)
fmt.Println(a)
}