栈上调配
堆上调配
- 严格来说,Go 语言没有援用类型。
- 然而咱们能够把 map、chan、函数、接口、slice 切片, 称为援用类型,这样便于了解。
- 指针类型也能够了解为是一种援用类型。
下面咱们提到了堆、栈,这里简略介绍下
栈堆
值类型和指针类型参数示例:
package main
import "fmt"
func main() {
name := "无尘"
modify1(name)
fmt.Println("name的值为:", name)
modify2(&name)
fmt.Println("name的值为:", name)
}
func modify1(name string) { //值类型
name = "wucs"
}
func modify2(name *string) { //指针类型
*name = "wucs"
}
//运行后果:
//name的值为: 无尘
//name的值为: wucs
援用类型
map
以map类型为参数示例:
package main
import "fmt"
func main() {
m:=make(map[string]int)
m["无尘"] = 18
fmt.Println("无尘的年龄为",m["无尘"])
modify(m)
fmt.Println("无尘的年龄为",m["无尘"])
}
func modify(p map[string]int) {
p["无尘"] =20
}
//运行后果:
//无尘的年龄为 18
//无尘的年龄为 20
// makemap implements Go map creation for make(map[k]v, hint).
func makemap(t *maptype, hint int, h *hmap) *hmap{
//省略无关代码
}
chan
channel 实质上也是个指针,来看源码:
func makechan(t *chantype, size int64) *hchan {
//省略无关代码
}
能够看到创立的 chan 其实是个 *hchan,所以它在参数传递中也和 map 一样。
类型的零值申明makenew函数
类型 | 零值 |
---|---|
数值类型(int、float等) | 0 |
bool | false |
string | “”(空字符串) |
struct | 外部字段的零值 |
slice | nil |
map | nil |
指针 | nil |
函数 | nil |
chan | nil |
interface | nil |
在 Go 语言中,函数的参数传递只有值传递,而且传递的实参都是原始数据的一份拷贝。如果拷贝的内容是值类型的,那么在函数中就无奈批改原始数据;如果拷贝的内容是指针(或者能够了解为援用类型 map、chan 等),那么就能够在函数中批改原始数据。