直接看例子:
package main
import "fmt"
func main() {
b := false
fmt.Println("b's address is:", &b)
bo(b)
fmt.Println(b)
}
func bo(b bool) {
fmt.Println("b's address is:", &b)
b = true
}
输出:
b's address is: 0xc420014088
b's address is: 0xc420014089
false
->> bool 值传递
package main
import "fmt"
var i int = 5
func main() {
modify(&i)
fmt.Println(i)
}
func modify(i *int) {
*i = 6
}
输出:
6
->> 指针修改值,c语言类似
package main
import "fmt"
func modifyElem(s int) {
s += 100
}
func modifyArray1(s [5]int) {
s[1] = 200
}
func modifyArray2(s [5]int) {
s = [5]int{5,5,5,5,5}
}
func main() {
var s = [5]int{1, 2, 3, 4, 5}
modifyElem(s[0])
fmt.Println(s[0])
modifyArray1(s)
fmt.Println(s)
modifyArray2(s)
fmt.Println(s)
}
输出:
1
[1 2 3 4 5]
[1 2 3 4 5]
->>数组无法修改实参
package main
import "fmt"
func modify1(s []int) {
fmt.Printf("modify1:%p \n", &s)
s = []int{500,500,500,500,500}
}
func modify2(s []int) {
fmt.Printf("modify2:%p \n", &s)
s[4] += 500
}
func main() {
a := [5]int{1, 2, 3, 4, 5}
s := a[:]
fmt.Printf("main :%p \n", &s)
modify1(s)
fmt.Println(s[4])
modify2(s)
fmt.Println(s[4])
}
输出:
main :0xc42000a060
modify1:0xc42000a080
5
modify2:0xc42000a0a0
505
->>slice类型可以修改实参,modify1中将s指向了另外的slice,无法修改实参
package main
import "fmt"
func modify1(s []int) {
s = []int{9,9,9}
s[0] = 100
}
func modify2(s []int) {
s[0] = 100
s = []int{9,9,9}
}
func main() {
a := [5]int{1, 2, 3, 4, 5}
s := a[:]
modify1(s)
fmt.Println(s[0])
modify2(s)
fmt.Println(s[0])
}
输出:
1
100
->>modify1中先将s指向了别处,所以无法修改实参,modify2修改值后再指向别处,所以修改了实参