参数传递

首先,在变量分配空间和参数传递上,go是和c很相似的,都是默认在栈上分配,内存分配在内存模型中有写到,在这里不做赘述了。

由于go语言默认在栈上分配空间,所以参数传递默认是值传递的,无论你是数组还是对象,传入参数后在函数内修改都是修改的变量副本,当此函数出栈后这个变量副本也被销毁,无法影响到原对象,除非你返回这个变量然后赋给原变量。

ps: 实际上我们说的引用传递本质也是值传递,只不过传递的值是地址,所以可以修改原变量。

package main
import (
    "fmt"
)
func swap(a int, b int) {
    var temp int
    temp = a
    a = b
    b = temp
}
func main() {
    x := 5
    y := 10
    swap(x, y)
    fmt.Print(x, y)
}
package main

import "fmt"

func swap(arr [2]int){
	arr[1],arr[0]=arr[0],arr[1]
}
func main() {
	a:=[2]int{0,1}
	swap(a)
	fmt.Print(a)
}

func swap(a *int,b *int){
	*a ,*b = *b,*a
}
func main() {
	a:=1
	b:=2
	swap(&a,&b)
	fmt.Print(a,b)
}

package main
import (
    "fmt"
)
func function(s1 []int) {
    s1[0] += 100
}
func main() {
    var a = [5]int{1, 2, 3, 4, 5}
    var s []int = a[:]
    function(s)
    fmt.Println(s[0])
}
package main
import (
    "fmt"
)
func function(a, b int, sum func(int, int) int) {
    fmt.Println(sum(a, b))
}
func sum(a, b int) int {
    return a + b
}
func main() {
    var a, b int = 5, 6
    f := sum
    function(a, b, f)
}