为什么Golang中的函数是指针

7hiiyaii  于 2022-12-28  发布在  Go
关注(0)|答案(1)|浏览(169)

在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()
}
ffscu2ro

ffscu2ro1#

函数不是指针,切片、Map和接口也不是。指针可以被解引用,但其他类型都不能。切片和Map是包含指针的数据结构,仅此而已。
updateMap和updateSlice函数与update(f func())的类比是无效的,因为它们没有赋值给参数。

func updateSlice(s []int) {
   s = []int{}
}

在Go语言中,所有参数都是通过值传递的:
在计算[函数值和参数]之后,调用的参数按值传递给函数,被调用的函数开始执行。

相关问题