Go语言入门【7】指针

指针

在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)       // 默认值为 0
fmt.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)
}

运行结果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeJR

如果觉得有用请赏一个呗!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值