首先,在变量分配空间和参数传递上,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)
}