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)来打破