写点什么

Go 语言入门 07—指针

作者:良猿
  • 2022-10-26
    湖北
  • 本文字数:1109 字

    阅读完需:约 4 分钟

Go语言入门07—指针

指针

在 go 语言中,每一个变量在运行时都会拥有一个地址,这个地址代表的就是变量在内存中的位置,而指针就是指向这个地址的变量。使用 go 语言中的指针很简单,只需要记住两个关键字符,&(取地址符)和*(取值符)。

取地址符

取地址符的使用很简单,只需要在变量前面加上取地址符&即可取到该变量在内存中的地址,保存地址的变量就称为指针。


package main
import "fmt"
func main() { a := 1 // 定义一个变量a,并赋值为1 b := &a // 通过取地址符取出变量a在内存中的地址 fmt.Println(b) // 打印取出的地址}
复制代码


运行结果:每个人的运行结果不一样,只要打印的是如下格式的内容表示成功。


取值符

通过上面的取地址符能够取出变量 a 在内存中的地址,然后通过地址同样可以取出变量对应的值,取值符* 使用在第一步取出的地址变量之前即可取出对应的值。


package main
import "fmt"
func main() { a := 1 b := &a c := *b fmt.Printf("b的类型:%T \n", b) fmt.Printf("c的值:%d \n", c)}
复制代码


此时的指针 b 中保存的就是变量 a 在内存中的地址,变量 b 此时的类型为*int,称作 int 的指针类型,通过取值符*b则可以取到 b 地址对应的变量值。


运行结果:


指针声明

go 语言中的值类型int float32 string等都有其对应的指针类型:*int *float32 *string,在声明指针时,需要使用到指针类型。


语法:


var 指针名 *类型
复制代码


代码示例:


package main
import "fmt"
func main() { var a *int // 定义一个指针类型 fmt.Println(a) // 输出为<nil>}
复制代码


上面定义了一个指针 a,但是指针 a 没有分配到变量时,其值就为 nil,称之为空指针。


直接给指针赋值:


package main
import "fmt"
func main() { var a *int *a = 1 fmt.Println(a)}
复制代码


如果如上所示直接运行,代码会产生报错,报错信息如下,报错原因是在 Go 语言中对于引用类型的变量,在使用的时候不仅要声明,还要为其分配内存空间,否则赋的值就没办法存储。而对于值类型的声明不需要分配内存空间,是因为它们在声明的时候已经默认分配好了内存空间。


new

函数签名:


func new(Type) *Type
复制代码


使用 new 函数时,传入一个类型,返回一个指向该类型内存地址的指针,使用 new 得到的指针其对应的值为该类型的默认值。


a := new(int)b := new(bool)fmt.Println(*a)       // 默认值为 0fmt.Println(*b)       // 默认值为 false
复制代码


上面的var a *int只是声明了一个指针并没有初始化分配内存空间,所以才会报错,如果使用 new 进行初始化指针就没有问题了。


package main
import "fmt"
func main() { a := new(int) *a = 1 fmt.Printf("a的值:%d \n", *a) fmt.Printf("a的类型:%T \n", a)}
复制代码


运行结果:



发布于: 刚刚阅读数: 3
用户头像

良猿

关注

还未添加个人签名 2019-02-13 加入

还未添加个人简介

评论

发布
暂无评论
Go语言入门07—指针_Go_良猿_InfoQ写作社区