Go 语言的函数传参都是
值传递
package main
import "fmt"
func double(x *int) {
*x += *x
x = nil//x是值拷贝,x和a都指向了一块内存地址,x=nil,并不影响a指向的内存地址中的数据
}
func main() {
var a = 3
double(&a)
fmt.Println(a) // 6
p := &a
double(p)
fmt.Println(a, p == nil) // 12 false
}
限制一:
Go 的指针不能进行数学运算
a := 5
p := &a
p++ //会报编译错误:invalid operation
p = &a + 3
限制二:
不同类型的指针不能相互转换
a := int(100)
var f *float64
f = &a //cannot use &a (type *int) as type *float64 in assignment
限制三:
不同类型的指针不能使用 == 或 != 比较
只有在两个指针类型相同或者可以相互转换的情况下,才可以对两者进行比较。另外,指针可以通过 == 和 != 直接和 nil 作比较
限制四:
不同类型的指针变量不能相互赋值
unsafe包
unsafe.Pointer非类型安全的指针,unsafe 包用于 Go 编译器,在编译阶段使用。
它可以绕过 Go 语言的类型系统,直接操作内存,使代码更高效。