Go--指针
时间:2019-11-10
本文章向大家介绍Go--指针,主要包括Go--指针使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Go语言中的指针
任何程序数据都需要载入内存中,那么在内存中都会有一个内存地址,这其实就是指针。为了保存一个数据在内存中的地址,我们就需要用到指针变量
Go语言中的指针不能进行偏移和运算,因此Go语言中的指针操作其实也非常简单,&(取地址)和*(根据内存地址取值)
指针地址和指针类型
每个变量在运行的时候都拥有一个地址,这个地址代表变量在内存中的地址。Go语言中利用&字符放在变量的前面对变量进行操作
ptr := &v // v的类型为T
- v:代表被取地址的变量,类型为T
- ptr:用于接收内存地址的变量,ptr的类型为*T,叫做T的指针类型。*代表指针
指针取值
对于普通变量使用&操作符取内存地址以后就会获得这个变量的指针,然后可以对指针使用*操作,也就是利用指针取值
func main() { //指针取值 a := 10 b := &a // 取变量a的地址,将指针保存到b中 fmt.Printf("type of b:%T\n", b) c := *b // 指针取值(根据指针去内存取值) fmt.Printf("type of c:%T\n", c) fmt.Printf("value of c:%v\n", c) }
type of b:*int type of c:int value of c:10
总结:取地址操作符&和取值操作符*是一对互补的操作符,&取出内存地址,*根据内存地址取出地址指向的值,然后再进行后续的操作
变量、指针地址、指针变量、取地址、取值的相互的关系:
- 对变量进行取地址&操作,可以获取这个变量的指针地址
- 指针变量的值是指针地址
- 对指针变量进行取值*操作,就可以获取指针变量指向的变量的值
func modify1(x int) { x = 100 } func modify2(x *int) { *x = 100 } func main() { a := 10 modify1(a) fmt.Println(a) // 10 modify2(&a) fmt.Println(a) // 100 }
new和make
func new(Type) *Type
- type表示类型,new函数只接受一个参数,这个参数就是一个类型
- *type表示指针类型,new函数返回一个指向该类型内存地址的指针
new函数不太常用,使用new函数得到的是一个类型的指针,并且该指针对应的值为该类型的零值
之前的代码中,var a *int 只是声明了一个指针变量a但是没有初始化成功,指针作为引用类型需要初始化后才会拥有内存空间,才可以给它做赋值操作
func main() { var a *int a = new(int) *a = 10 fmt.Println(*a) }
make
make也是用于内存分配的,区别于new,它适用于slice、map以及chan类型的创建,而且它的返回类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型就是引用类型,所以也就没有必要返回他们的指针了。
func make(t Type, size ...IntegerType) Type
make函数是无可替代的,我们在使用slice、map以及channel的时候,都需要使用make进行初始化,然后才可以对它们进行操作。
如map中要是只声明变量是一个map类型,是不能进行操作的,必须利用make先对map进行初始化操作之后能可以对键值对进行赋值。
func main() { var b map[string]int b = make(map[string]int, 10) b["沙河娜扎"] = 100 fmt.Println(b) }
make和new的区别:
- 二者都是用来做内存分配的
- make只用于slice、map、channel的初始化,返回的还是这三个引用类型的本身
- new用于类型的内存分配,并且内存对应的值为类型的零值,返回的是指向类型的指针
原文地址:https://www.cnblogs.com/tulintao/p/11831357.html
- 使用line_profiler查看api接口函数每行代码执行时间
- GAN 的 keras 实现
- 双向 LSTM
- scrapy回调函数传递参数
- python更新数据库脚本两种方法
- 使聊天机器人具有个性
- 遇到502错误,invalid request block size 解决方法
- python中json.loads,dumps,jsonify使用
- sqlalchemy和flask-sqlalchemy几种分页操作
- 一个 tflearn 情感分析小例子
- 前端js,后台python实现RSA非对称加密
- 运行mysql时,提示Table ‘performance_schema.session_variables’ doesn’t exist
- ODL应用开发之MD-SAL中级教程
- Sql参数是一个list的最佳实践
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- CentOS7防火墙firewall操作命令
- centos7搭建NFS共享存储服务
- LVS-NAT负载均衡
- Kali-Dos洪水攻击之Hping3
- CVE-2018-8174 IE浏览器远程代码执行漏洞
- MFS传给CS sessions会话
- windows利用Hashcat字典破解WiFi密码
- tensorflow 使用CPU而不使用GPU的问题解决
- Python图像灰度变换及图像数组操作
- 典型算法的Python实现
- Spring是如何解决循环依赖的
- Python将两个列表转换为字典
- 三、基于promise封装属于自己的Ajax库
- 数据分析 常见异常及解决办法(一)
- Python数据分析实战(2)使用Pandas进行数据分析