值类型和引用类型的差异在于赋值同类型新变量后,对新变量进行修改是否能够影响原来的变量,若不能影响则为值类型,若能影响则为引用类型。
值类型是值拷贝,引用类型是公用底层数据。
package main
import "fmt"
func main() {
//数组是值类型
slice01 := []int{1, 2, 3}
slice02 := slice01
fmt.Println(slice01, slice02)
slice02[1] = 100
fmt.Println(slice01, slice02)
array01 := [3]int{}
array02 := array01
fmt.Println(array01, array02)
array02[1] = 100
fmt.Println(array01, array02)
}
值类型:数值、布尔、字符串、指针、数组、结构体等。
引用类型:切片、映射、接口等。
针对值类型可以借助指针修改原值。
针对值类型和引用类型在赋值后新旧变量的地址并不相同,只是引用类型在底层共享数据结构(其中包含指针类型元素)。
package main
import "fmt"
func main() {
// 值类型: string int bool float array 指针 结构体
// 引用类型: slice map 接口
// 将变量赋值给一个新的变量,并修改新变量的值,如果对旧变量有影响就是引用类型,无影响就是值类型
// 针对值类型可借助指针修改原值
// 值类型和引用类型在赋值后新旧变量地址并不相同,只是引用类型在底层共享数据结构
string01 := "B"
string02 := string01
string02 = "C"
fmt.Println(string01, string02)
int01 := 1
int02 := int01
int02 = 2
fmt.Println(int01, int02)
bool01 := true
bool02 := bool01
bool02 = false
fmt.Println(bool01, bool02)
array01 := [3]string{"A", "B", "C"}
array02 := array01
array02[2] = "D"
fmt.Println(array01, array02)
slice01 := []string{"A", "B", "C"}
slice02 := slice01
slice02[2] = "D"
fmt.Println(slice01, slice02)
map01 := map[string]int{"a": 1, "b": 2}
map02 := map01
map02["b"] = 3
fmt.Println(map01, map02)
age01 := 30
age02 := age01
age02 = 31
fmt.Println(age01, age02)
pointer := &age01
*pointer = 31
fmt.Println(age01, age02, *pointer)
}
值传递
package main
import "fmt"
func changeInt(a int) {
a = 100
}
func changeSlice(s []int) {
s[0] = 100
}
func changeIntByPoint(p *int) {
*p = 100
}
func main() {
//go中都是值传递
num := 1
changeInt(num)
fmt.Println(num)
// 引用类型底层是共享内存
nums := []int{1, 2, 3}
changeSlice(nums)
fmt.Println(nums)
changeIntByPoint(&num)
fmt.Println(num)
}