在GoLang中,我们可以将所有数据类型分为两组。
整数、浮点数、数组、结构-值类型切片、Map、函数、接口-指针类型。
我理解为什么切片和Map是指针。例如,你可以在不同的函数中向Map添加更多的值:
func main() {
m := make(map[string]string)
updateMap(m)
fmt.Println(m)
}
func updateMap(m map[string]string) {
m["1"] = "1"
m["2"] = "2"
m["3"] = "3"
m["4"] = "4"
}
您可以简单地更新切片:
func main() {
s := make([]int, 2)
s[0] = 0
s[1] = 0
updateSlice(s)
fmt.Println(s)
}
func updateSlice(s []int) {
s[0] = 1
s[1] = 1
}
但是func是指针的原因是什么呢?
我无法覆盖它:
func main() {
f := func() {
fmt.Println("Hello, 世界")
}
update(f)
f()
}
func update(f func()) {
f = func() {
fmt.Println(2)
}
}
所以我真的很困惑为什么它应该是一个指针,为什么它不能只是一个值?
我有一个假设,这是与内存管理的函数。恕我直言,如果函数将是一个pinters,我们不能这样做:
func main() {
s := 2
x := func() {
s = 3
}
updateFunc(x)
fmt.Println(s)
}
func updateFunc(f func()) {
f()
}
1条答案
按热度按时间ffscu2ro1#
函数不是指针,切片、Map和接口也不是。指针可以被解引用,但其他类型都不能。切片和Map是包含指针的数据结构,仅此而已。
updateMap和updateSlice函数与
update(f func())
的类比是无效的,因为它们没有赋值给参数。在Go语言中,所有参数都是通过值传递的:
在计算[函数值和参数]之后,调用的参数按值传递给函数,被调用的函数开始执行。