目录
什么是指针
指针的声明和定义
var 关键字声明
new 函数声明
指针的操作
指针参数
指针接收者
什么情况下使用指针

什么是指针
我们都知道,程序运行时的数据是存放在内存中的,每一个存储在内存中的数据都有一个编号,这个编号就是内存地址。我们可以根据这个内存地址来找到内存中存储的数据,而内存地址可以被赋值给一个指针。我们也可以简单的理解为指针就是内存地址。

指针的声明和定义
在Go语言中,获取一个指针,直接使用取地址符&就可以。
示例:
func main() { name := "微客鸟窝" nameP := &name //取地址 fmt.Println("name变量值为:", name) fmt.Println("name变量的内存地址为:", nameP)}//运行结果://name变量值为: 微客鸟窝//name变量的内存地址为: 0xc00004e240
nameP 指针的类型是 string
Go语言中,
类型名表示一个对应的指针类型
| 变量 | 内存中数据| 内存地址 |
|name := “微客鸟窝”| 微客鸟窝| 0xc00004e240 |
|nameP := &name | 0xc00004e240 |0xc00004e360 |
从上面表格可以看到:

普通变量 name 的值是微客鸟窝,存放在内存地址为 0xc00004e240 的内存中
指针变量 namep 的值是普通变量的内存地址 0xc00004e240
指针变量 nameP 的值存放在 内存地址为 0xc00004e360 的内存中
普通变量存的是数据,指针变量存的是数据的地址

var 关键字声明
我们也可以使用 var 关键字声明
var nameP *stringnameP = &name
new 函数声明
nameP := new(string)nameP = &name
可以传递类型给这个内置的 new 函数,它会返回对应的指针类型。

指针的操作
这里强调一下:

指针变量是一个变量,这个变量的值是指针(内存地址)!
指针变量是一个变量,这个变量的值是指针(内存地址)!
指针变量是一个变量,这个变量的值是指针(内存地址)!

获取指针指向的值:

只需要在指针变量钱加 号即可获得指针变量值所对应的数据:
`nameV :=
nameP
fmt.Println(“nameP指针指向的值为:”,nameV) //nameP指针指向的值为: 微客鸟窝修改指针指向的值:nameP = “公众号:微客鸟窝” //修改指针指向的值
fmt.Println(“nameP指针指向的值为:”,
nameP)
fmt.Println(“name变量的值为:”,name)
//运行结果:
//nameP指针指向的值为: 公众号:微客鸟窝
//name变量的值为: 公众号:微客鸟窝我们发现nameP 指针指向的值被改变了,变量 name 的值也被改变了因为变量 name 存储数据的内存就是指针 nameP 指向的内存,这块内存被 nameP 修改后,变量 name 的值也被修改了。通过 var 关键字直接定义的指针变量是不能进行赋值操作的,因为它的值为 nil,也就是还没有指向的内存地址//错误示例
var intP intintP = 10 //错误,应该先给分配一块内存,内存地址作为变量 intP 的值,这个内存就可以存放 10 了。

//应该使用
var intP int //声明int类型的指针变量 intP
intP = new(int) // 给指针分配一块内存
intP = 66
fmt.Println(“:::”,intP) //::: 0xc0000ac088
fmt.Println(intP) //66
//简短写法
var intP := new(int)
intP=66指针参数当给一个函数使用指针作为参数的时候,就可以在函数中,通过形参改变实参的值:func main() {
name := “无尘”
modify(&name)
fmt.Println(“name的值为:”,name)
}
func modify(name string) { name = “wucs”
}
//运行结果:
//name的值为: wucs`
指针接收者
如果接收者类型是 map、slice、channel 这类引用类型,不使用指针;
如果需要修改接收者,那么需要使用指针;
如果接收者是比较大的类型,可以考虑使用指针,因为内存拷贝廉价,所以效率高。

什么情况下使用指针

不要对 map、slice、channel 这类引用类型使用指针;

如果需要修改方法接收者内部的数据或者状态时,需要使用指针;

如果需要修改参数的值或者内部数据时,也需要使用指针类型的参数;

如果是比较大的结构体,每次参数传递或者调用方法都要内存拷贝,内存占用多,这时候可以考虑使用指针;

像 int、bool 这样的小数据类型没必要使用指针;

如果需要并发安全,则尽可能地不要使用指针,使用指针一定要保证并发安全;

指针最好不要嵌套,也就是不要使用一个指向指针的指针,虽然 Go 语言允许这么做,但是这会使你的代码变得异常复杂。

更多相关文章

  1. Android(安卓)make脚本简记
  2. SQL SERVER 将XML变量转为JSON文本
  3. Windows配置Android(安卓)SDK环境
  4. Android(安卓)ThreadLocal及InheritableThreadLocal分析
  5. Android中的数据绑定框架DataBinding(对比AngularJS双向数据绑定
  6. SQLSERVER 拼接含有变量字符串案例详解
  7. SQL Server查询条件IN中能否使用变量的示例详解
  8. androidstudio搭建flutter环境,遇到的问题
  9. Kotlin 概览——如何看待 Google 将 Kotlin 选为 Android(安卓)

随机推荐

  1. Android:控件的对象修改控件的值
  2. Android中JNI实现
  3. 判断android devices是否联网
  4. Android TextView背景跟随焦点的变化
  5. Android LayoutInflater.inflate(R.layou
  6. android 屏幕保持唤醒 不锁屏
  7. Android工程的自动创建,编译并生成apk
  8. Android MTK Launcher3 替换桌面图标
  9. 设置TextView超过一定长度后显示省略号
  10. android 通过uri启动Activity