指针

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 语言的类型系统,直接操作内存,使代码更高效。

上一篇:go语言defer


下一篇:数据结构-二叉树(顺序数组实现)