Go语言指针
Posted Go程序员开发
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go语言指针相关的知识,希望对你有一定的参考价值。
Go语言指针
Go语言支持指针类型*T
,指针的指针**T
,以及包含包名前缀的*package.T
。
声明一个int值的指针变量
var ip *int
声明一个string值的指针变量
var sp *string
通过 :=
语法来定义指针
var str string = "oldboy"
sp := &str
声明一个int值的指针的指针变量
var p **int
声明一个time.Time值的指针变量
var t *time.Time
package main
import "fmt"
func main() {
var str string = "oldboy"
fmt.Printf("变量的地址: %x\n", &str)
}
运行结果:
变量的地址: c42000e1d0
空指针
当一个指针被定义后没有分配到任何变量时,它的值为 nil。nil 指针也称为空指针。
nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。
package main
import (
"fmt"
)
func main() {
var ip *int
var sp *string
if ip == nil {
fmt.Println("ip == nil")
}
if sp == nil {
fmt.Println("sp == nil")
}
}
定义的不同类型的零值不能用于比较运算,实例如下:
package main
import (
"fmt"
)
func main() {
var ip *int
var sp *string
if ip == sp {
fmt.Println("error")
}
}
编译错误:
./main.go:11:8: invalid operation: ip == sp (mismatched types *int and *string)
查看零值指针类型,实例如下:
package main
import (
"fmt"
)
func main() {
var ip *int
var sp *string
fmt.Printf("ip : %#v\n", ip)
fmt.Printf("sp : %#v\n", sp)
}
运行结果:
ip : (*int)(nil)
sp : (*string)(nil)
指针类型转换
Go语言是不允许两个指针类型进行转换的。
我们一般使用T作为一个指针类型,表示一个指向类型T变量的指针。为了安全的考虑,两个不同的指针类型不能相互转换,比如 *uint 不能转为 *int 。实例如下:
package main
func main() {
var i uint = 10
var p2 *int
p1 := &i
p2 = (*int)(p1)
}
编译错误:
./main.go:8:13: cannot convert p1 (type *uint) to type *int
unsafe.Pointer类型用于表示任意类型的指针。有4个特殊的只能用于Pointer类型的操作:
1、 任意类型的指针可以转换为一个Pointer类型值
2、 一个Pointer类型值可以转换为任意类型的指针
3、 一个uintptr类型值可以转换为一个Pointer类型值
4、 一个Pointer类型值可以转换为一个uintptr类型值
因此,Pointer类型允许程序绕过类型系统读写任意内存。使用它时必须谨慎。实例如下:
package main
import (
"fmt"
"unsafe"
)
func main() {
var i uint = 10
var p2 *int
p1 := &i
p2 = (*int)(unsafe.Pointer(p1))
fmt.Println(*p2)
}
下一篇:
Go语言结构体------敬请期待!
0基础学习Go语言系列:
看完本文有收获?那就分享给更多人吧~
长按二维码
以上是关于Go语言指针的主要内容,如果未能解决你的问题,请参考以下文章
Go语言技巧之正确高效使用slice(听课笔记总结--简单易懂)