兄弟连Go语言培训课程体系设计架构包括了区块链的基础语言Go语言、区块链后端技术体系、区块链公链、区块链分布式应用开发等内容讲解,以及到最后的面试指导和项目实战。课程由清华微软谷歌团队精心打造,历时半年时间共同研发而出。
兄弟连教育Go语言教程(6)指针
⽀支持指针类型*T,指针的指针**T,以及包含包名前缀的*
•默认值nil,没有NULL常量。
•操作符"&"取变量地址,"*"透过指针访问⺫⽬目标对象。
•不⽀支持指针运算,不⽀支持"->"运算符,直接⽤用"."访问⺫⽬目标成员。
funcmain(){
typedatastruct{aint}
vard=data{1234}
varp*data
p=&d
fmt.Printf("%p,%v\n",p,p.a)//直接⽤用指针访问⺫⽬目标对象成员,⽆无须转换。
}
输出:
0x2101ef018,1234
不能对指针做加减法等运算。
x:=1234
p:=&x
p++//Error:invalidoperation:p+=1(mismatchedtypes*intandint)
可以在unsafe.Pointer和任意类型指针间进⾏行转换。
funcmain(){
x:=0x12345678
p:=unsafe.Pointer(&x)//*int->Pointer
n:=(*[4]byte)(p)//Pointer->*[4]byte
fori:=0;i fmt.Printf("%X",n[i]) } } 输出: 78563412 返回局部变量指针是安全的,编译器会根据需要将其分配在GCHeap上。 functest()*int{ x:=100 return&x//在堆上分配x内存。但在内联时,也可能直接分配在⺫⽬目标栈。 } 将Pointer转换成uintptr,可变相实现指针运算。 funcmain(){ d:=struct{ sstring xint }{"abc",100} p:=uintptr(unsafe.Pointer(&d))//*struct->Pointer->uintptr p+=unsafe.Offsetof(d.x)//uintptr+offset p2:=unsafe.Pointer(p)//uintptr->Pointer px:=(*int)(p2)//Pointer->*int *px=200//d.x=200 fmt.Printf("%#v\n",d) } 输出: struct{sstring;xint}{s:"abc",x:200}