GO语言指针有那些限制

发布于:2024-10-18 ⋅ 阅读:(8) ⋅ 点赞:(0)

GO语言指针有那些限制

GO 语言的指针
一个指针变量本身存会计的只是一个内存地址
一个内存地邗在32位系统上占4个字节,在64位系统上占8个字节
内存地址一般用整数的16进制来表示

当一个变量声明的时候,GO运行时将此变量开辟一段内存,此内存的起始地址即为此变量的地址

	func main()
	{
		x:=new(int) //声明指针
		y:=x//将x的地址值赋值给y
		tmp:=5
		x=&tmp //将tmp的地址值赋值给x
		fmt.Println("x=",*,"y=",y,*y)
	}

在这里插入图片描述
多维指针
在这里插入图片描述
GO语言中哪些值不可被寻址
映射的元素、字符串的字节元素、常量包级别的函数以及用作函数值的方法等

如何获取一个指针值
内置函数new 、直接使用&操作符

func main()
{
	a = new([3]int)
	fmt.Println(a)
	b:=3
	fmt.Println(&b)
}

GO语言指针的限制
1.GO提针不支持直接进行算术运算

func main()
{
 	i:=int64(5)
 	p:=&i
 	p++ //nvalid operation: p++ (non-numeric type *int64)
 	atomic.AddInt64(p,1)
 }

2.一个指针类型的值不能被随意转 换为另一个指针类型
指针类型转换的条件
底层类型一致且有一个是无名类型
都是无名类型,且他们的基为类型的底层一致

func main() {
	type Myint int32
	type P1 *int32
	type P2 *Myint

	var x1 P1
	var x2 *int32
	x1 = x2 //隐式转换
	//fmt.Println(x1, x2)
	x2 = x1 //隐式转换
	var x3 *Myint
	x4 := (*int32)(x3) //显示转换
	x5 := (*Myint)(x2) //*Myint显示转换到*int32
	fmt.Println(x4, x5)
	//var x6 P2
	//x6 = x1                         //P1不能直接隐式转换到P2,编译不通过
	//x6 = (*Myint)(x1)               //也不能直接显示转换,编译不通过
	//x6 = P2((*Myint)((*int32)(x1))) //P1经过3层显示转换到P2
	//fmt.Println(x6)
	//
}

3.一个指针不能随意跟其他指针类型的值进行比较
指针比较需要满足的条件
这两个指针类型相同
这两个指针之前可以隐式转换

	func main() {
	type Myint int32
	type P1 *int32
	type P2 *Myint

	var x1 P1
	var x2 *int32
	x1 = x2 //隐式转换
	//fmt.Println(x1, x2)
	x2 = x1 //隐式转换
	var x3 *Myint
	x4 := (*int32)(x3) //显示转换
	x5 := (*Myint)(x2) //*Myint显示转换到*int32
	fmt.Println(x4, x5)
	//var x6 P2
	//x6 = x1                         //P1不能直接隐式转换到P2,编译不通过
	//x6 = (*Myint)(x1)               //也不能直接显示转换,编译不通过
	//x6 = P2((*Myint)((*int32)(x1))) //P1经过3层显示转换到P2
	//fmt.Println(x6)
	//
		//fmt.Println(x1 == x2) // 可以比较
	//fmt.Println(x2 == x3) //不能比较
	//fmt.Println(x1 == x6) //不能比较
	//fmt.Println(x2 == x6) //不能比较

	fmt.Println("unsafe.Pointer:", unsafe.Pointer(x2) == unsafe.Pointer(x3)) //可以比较
}

4.一个指针不能随意被赋值给其它任意类型的指针值
上术限制可以能过unsafe标准包中的非类型安全指针(unsafe.Pointer)来打破