Golang 值传递和引用传递

优质
小牛编辑
133浏览
2023-12-01

Go 语言中 值类型 有:int 系列、float 系列、bool、string、数组、结构体

  • 值类型通常在栈中分配存储空间
  • 值类型作为函数参数传递,是拷贝传递
  • 在函数体内修改值类型参数,不会影响到函数外的值
package main
import "fmt"
func main() {
	num := 10
	change(num)
	fmt.Println(num) // 10
}
func change(num int)  {
	num = 998
}
package main
import "fmt"
func main() {
	arr := [3]int{1, 3, 5}
	change(arr)
	fmt.Println(arr) // 1, 3, 5
}
func change(arr [3]int)  {
	arr[1] = 8
}
package main
import "fmt"
type Person struct {
	name string
	age int
}
func main() {
	p := Person{"lnj", 33}
	change(p)
	fmt.Println(p.name) // lnj
}
func change(p Person)  {
	p.name = "zs"
}

Go 语言中 引用类型 有:指针、slice、map、channel

  • 引用类型通常在堆中分配存储空间
  • 引用类型作为函数参数传递,是引用传递
  • 在函数体内修改引用类型参数,会影响到函数外的值
package main
import "fmt"
func main() {
	num := 10
	change(&num)
	fmt.Println(num) // 998
}
func change(num *int)  {
	*num = 998
}
package main
import "fmt"
func main() {
	arr := []int{1, 3, 5}
	change(arr)
	fmt.Println(arr) // 1, 8, 5
}
func change(arr []int)  {
	arr[1] = 8
}
package main
import "fmt"
func main() {
	mp := map[string]string{"name":"lnj", "age":"33"}
	change(mp)
	fmt.Println(mp["name"]) // zs
}
func change(mp map[string]string)  {
	mp["name"] = "zs"
}