Go语言学习之指针|Go主题月

719 阅读4分钟

作者:看那个码农

公众号:看那个码农

上期内容介绍了Go语言学习之数据类型|Go主题月 常用的五种数据类型。

  • 整型
  • 浮点型
  • 布尔型
  • 字符串
  • 切片

本篇内容将继续带领大家走进Go语言的世界。

1.本文简介

本篇将介绍

Go语言的指针

2.初识指针

指针概念在Go语言中被拆分成了两个概念。

  • 类型指针:允许对这个指针类型的数据进行修改。传递数据使用指针,而不用拷贝数据,类型指针不能进行偏移和计算,类型指针不能进行偏移和运算。

  • 切片:由指向起始元素的原始指针、元素数量和容器组成。

3.指针地址和指针类型

要明白指针,需要知道几个概念:指针地址、指针类型和指针取值。

每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。

Go语言使用 “&” 操作符放在变量前面对变量进行 “取地址” 操作 格式如下:

str :=&v  //v的指针类型为T

其中v代表被取地址的变量,被取地*址的v使用str变量进行接收,
str的类型就为“*T”,称做v的指针类型,
“*”代表指针

是不是有些懵?我们用一个案例来说明一下

package main
import (
   "fmt"
)
func main(){
var a int=1
var str string="apple"
fmt.Printf("%p,%p",&a,&str)
}

输出为

image.png

本案例中是首先声明了整型a变量,字符串str变量,

使用fmt.Printf的“%p”,输出a和str变量取地址后的指针值,指针值是带有“0x”的十六进制前缀

变量、指针、地址三者的关系是 每个变量都拥有地址,指针的值就是地址

4.从指针获取指针指向的值

在对普通变量使用“&”操作符取地址后可以获得这个变量的指针

可以对指针使用”*”操作,也就是指针取值的操作

例如以下案例

package main
import "fmt"
func main(){
   //准备一个字符串类型的变量
   var a ="Hello World!"
   //对字符串取地址,str类型为*string
   str := &a
   //打印str的类型
   fmt.Printf("str type: %T\n",str)
   //打印str的指针地址
   fmt.Printf("address: %p\n",str)
   //对指针进行取值操作
   value:=*str
   //取值后的类型
   fmt.Printf("value type: %T\n",value)
   //指针取值后就是指向变量的值
   fmt.Printf("values: %s\n",value)
}

输出为

image.png

在指针中

取地址操作符“&”和
取值操作符“*”是一对互补操作符,
“&”取出地址,
“*”根据地址取出地址指向的值。

几点重要的关系,大家需要明确

  • 对变量进行取地址(&)操作,可以获得这个变量的指针变量
  • 指针变量的值是指针地址
  • 对指针变量进行取值(*)操作,可以获得指针变量指向的原变量的值

5.使用指针修改值

通过指针不仅可以取值,还可以修改值。

我们通过一个案例来说明利用指针进行数值交换的过程。

package main
import "fmt"
//定义交换函数
func swap(a,b *int){
   //取a指针的值,赋给临时变量t
   t:=*a
   //取出b指针的值,赋给a指针指向的变量
   *a=*b
   //将a指针的值赋给b指针指向的变量
   *b=t
}
//书写主函数
func main(){
   //准备两个变量,赋值1和2
   x,y:=1,2
   //交换变量值
   swap(&x,&y)
   //输出变量值
   fmt.Println(x,y) 
}

输出为

image.png

通过定义新函数的形式,是进行指针数值交换的方式之一

6.创建指针的另一种方法-New()函数

我们除了上述常规的指针创建操作外,我们还可以使用这样的方法创建一个新指针 格式如下:

new(类型)

一般可以利用这种方法进行定义

package main
import "fmt"
func main(){

str:=new(string)
*str="Hello World!"

fmt.Printf("%s\n",*str)
fmt.Println(*str)
}

输出为

image.png

如果你觉得这篇内容对你有帮助的话:

1、点赞支持下吧,让更多的人也能看到这篇内容

2、关注公众号:看那个码农,我们一起学习一起进步。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情