作者:看那个码农
公众号:看那个码农
上期内容介绍了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)
}
输出为
本案例中是首先声明了整型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)
}
输出为
在指针中
取地址操作符“&”和
取值操作符“*”是一对互补操作符,
“&”取出地址,
“*”根据地址取出地址指向的值。
几点重要的关系,大家需要明确
- 对变量进行取地址(&)操作,可以获得这个变量的指针变量
- 指针变量的值是指针地址
- 对指针变量进行取值(*)操作,可以获得指针变量指向的原变量的值
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)
}
输出为
通过定义新函数的形式,是进行指针数值交换的方式之一
6.创建指针的另一种方法-New()函数
我们除了上述常规的指针创建操作外,我们还可以使用这样的方法创建一个新指针 格式如下:
new(类型)
一般可以利用这种方法进行定义
package main
import "fmt"
func main(){
str:=new(string)
*str="Hello World!"
fmt.Printf("%s\n",*str)
fmt.Println(*str)
}
输出为
如果你觉得这篇内容对你有帮助的话:
1、点赞支持下吧,让更多的人也能看到这篇内容
2、关注公众号:看那个码农,我们一起学习一起进步。
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情