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