Golang 中的指针 - Pointer

Go 的原生数据类型可以分为基本类型和高级类型,基本类型主要包含 string, bool, int 及 float 系列,高级类型包含 struct,array/slice,map,chan, func 。
相比 Java,Python,Javascript 等引用类型的语言,Golang 拥有类似C语言的指针这个相对古老的特性。但不同于 C 语言,Golang 的指针是单独的类型,而不是 C 语言中的 int 类型,而且也不能对指针做整数运算。从这一点看,Golang 的指针基本就是一种引用。
那么 Golang 为什么需要指针?这种指针又能有什么独特的用途呢?
在学习引用类型语言的时候,总是要先搞清楚,当给一个函数/方法传参的时候,传进去的是值还是引用。实际上,在大部分引用型语言里,参数为基本类型时,传进去的大都是值,也就是另外复制了一份参数到当前的函数调用栈。参数为高级类型时,传进去的基本都是引用。这个主要是因为虚拟机的内存管理导致的。
内存管理中的内存区域一般包括 heap 和 stack, stack 主要用来存储当前调用栈用到的简单类型数据:string,boolean,int,float 等。这些类型的内存占用小,容易回收,基本上它们的值和指针占用的空间差不多,因此可以直接复制,GC也比较容易做针对性的优化。 复杂的高级类型占用的内存往往相对较大,存储在 heap 中,GC 回收频率相对较低,代价也较大,因此传引用/指针可以避免进行成本较高的复制操作,并且节省内存,提高程序运行效率。
因此,在下列情况可以考虑使用指针:1,需要改变参数的值;2,避免复制操作;3,节省内存;
而在 Golang 中,具体到高级类型 struct,slice,map,也各有不同。实际上,只有 struct 的使用有点复杂,slice,map,chan 都可以直接使用,不用考虑是值还是指针。
struct:
对于函数(function),由函数的参数类型指定,传入的参数的类型不对会报错。
对于方法(method),接收者(receiver)可以是指针,也可以是值,Golang 会在传递参数前自动适配以符合参数的类型。也就是:如果方法的参数是值,那么按照传值的方式 ,方法内部对struct的改动无法作用在外部的变量上。
方法是包含了接收者的函数。
函数的格式是固定的,func 函数名 参数 返回值(可选) 函数体。
slice :
slice 实际上相当于对其依附的 array 的引用,它不存储数据,只是对 array 进行描述。因此,修改 slice 中的元素,改变会体现在 array 上,当然也会体现在该 array 的所有 slice 上。
可以使用 make([]int) 来创建并初始化 map 。
 
map :
使用 make(map[string]string) 返回的本身是个引用,可以直接用来操作。
chan :
make(chan int) 返回的是可以直接使用的 channel 。
func :
在 Golang 中,func 可以作为一种值被返回,因此也可以使用类似 Python 的 decorator 的方式来加工函数。
接口指针:
  1. 指针的判断,都涉及到type和value。
  2. 接口指针之间的判等,要基于type与value,一个不同则不等。
  3. 接口指针与其对应实现的结构体指针,可以进行判等操作。

------------------------------------------------------------- ------------------------------------------------------------

数组切片内容复制 copy

用于将内容从一个数组切片复制到另一个数组切片。如果加入的两个数组切片不一样大,就会按其中较小的那个数组切片的元素个数进行复制。

slice1 := []int{1, 2, 3, 4, 5}
slice2 := []int{5, 4, 3} copy(slice2, slice1) // 只会复制slice1的前3个元素到slice2中
copy(slice1, slice2) // 只会复制slice2的3个元素到slice1的前3个位置

go 源码中 slice 的数据结构定义

type slice struct {array unsafe.Pointerlen   intcap   int
}

实际go在append的时候放大cap是有规律的。在 cap 小于1024的情况下是每次扩大到 2 * cap ,当大于1024之后就每次扩大到 1.25 * cap 。

这个是 slice 的数据结构,它很简单,一个指向真实 array 地址的指针 ptr ,slice 的长度 len 和容量 cap 。


其中 len 和 cap 就是我们在调用 len(slice) 和 cap(slice) 返回的值。

slice:用来弥补数组的不足,称之为数组切片

创建数组切片的方式

1:基于数组

var array [10]int = [10]int{1,2,3,4,5,6,7,8,9,10}

var slice []int = array[:5] //基于数组的前5个元素创建数组切片

2:直接创建

slice := make([]int,5,10) //创建一个初始元素个数为5,初始值为0,并预留10个元素的存储                                            空间的数组切片

内置函数:

cap():返回数组切片分配的空间大小

len():返回数组切片当前所存储的元素个数

  

转载于:https://www.cnblogs.com/hetonghai/p/9059189.html

golang 小知识-持续更新中相关推荐

  1. Python日常小技巧(持续更新中)

    目录 快速定位元组内容 对字典进行排序 json的获取(dumps,dump,loads,load) 查找字典中相同的key 统计列表中元素的个数 字典按输入顺序输出 历史记录的存储 对有多个分割符的 ...

  2. 几款不错的golang应用包 持续更新中~~~

    队列 1.hibiken/asynq 保证至少执行一次任务 任务调度 重试失败的任务 在工作进程崩溃时自动恢复任务 加权优先级队列 严格优先级队列 由于Redis中的写入速度很快,因此添加任务的延迟很 ...

  3. 前端使用Canvas绘图(基础知识)--持续更新中

    文章目录 前言 canvas文档 一.canvas代码提示(插件和注释) 1.1.使用插件方式(推荐这种方式) =>canvas-snippets 1.2.使用注释方式 二.初始canvas 2 ...

  4. 【netty篇】- 第0章netty网络编程必备知识[持续更新中]~

    一.三大组件简介 Channel与Buffer Java NIO系统的核心在于:通道(Channel)和缓冲区(Buffer).通道表示打开到 IO 设备(例如:文件.套接字)的连接.若需要使用 NI ...

  5. jQuery学习总结之基础知识----持续更新中

    语法总结和注意事项 1.关于页面元素的引用 通过jquery的$()引用元素包括通过id.class.元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象 ...

  6. 视网膜脱落相关知识(持续更新中)

    视网膜脱落的类型 [1]中主要分为两大类: 1.孔源性视网膜脱离 大多数视网膜脱离是这一类型的.由于各种内.外界原因导致视网膜产生了裂孔,引起的视网膜脱离.内因是指视网膜本身的原因,比如:高度近视视网 ...

  7. 前端基础知识(持续更新中)

    HTML Hyper Text Markup Language 超文本标记语言 1.html5为什么只需要写<! DOCTYPE HTML> 答:这是w3c制定的规则,是文档类型声明,语义 ...

  8. 微信小程序-仿淘宝(附真机测试图)(持续更新中。。。)

    醉前端 微信小程序已开始公测, 醉前端 的开发热情依然不减... 这是仿手机淘宝做的微信小程序,目的在于享受开发,学习小程序,欢迎大家批评指正. demo资源地址:demo gihub传送门 tip: ...

  9. Python爬虫及其它函数知识读记及简单用法,持续更新中...

    Python爬虫相关函数知识读记及简单用法,持续更新中- requests [riˈkwests] n. 请求,要求( request的名词复数 ): 需要: 所请求的事物: 申请书 函数或单词- 音 ...

最新文章

  1. 2019春季学期期末总结
  2. oracle 生成 json文件,oracle - PLSQL导入JSON并导出为JSON文件 - 堆栈内存溢出
  3. 关于相似性度量与各类距离的意义
  4. 礼品鸟一站式礼品采购中心网站PHP源码
  5. 挂载镜像SD卡的FAT32文件系统分区到Linux中
  6. Count on a tree SPOJ - COT
  7. 【code】flex_进度条样式
  8. python基础知识——函数(下)
  9. c语言第三章作业3.13,c语言谭浩强第1章至第3章测试试题
  10. Unity 中文不显示问题
  11. orbslam2初始化流程
  12. 罗马数字转换python_Python实现将罗马数字转换成普通阿拉伯数字的方法
  13. matlab从无到有系列(八):M文件及函数的编写
  14. 基于Spring Boot 2.5.1 微服务框架发布(Eurynome Cloud )
  15. linux xdm 启动执行文件,Linux下配置XDM登录服务器
  16. C#上位机开发—— 修改窗口图标和exe文件图标
  17. bilinear interpolation是什么
  18. 机器学习数学知识(一) 自然数e
  19. ue4中隐藏灯光和相机图标_[HDRP]物理灯光是什么?科普向
  20. Android安全机制(二)

热门文章

  1. @总结 - 6@ 后缀自动机
  2. Java 常用类 -Arrays
  3. 几乎死循环的存储过程
  4. Struts2中Action之ResultType
  5. 【转/TCP协议编程】 基于TCP的Socket 编程
  6. Java数据持久层框架 MyBatis之API学习八(Java API详解)
  7. web touch 事件
  8. CGContextRef学习笔记
  9. Oracle的SOME,ANY和ALL操作
  10. 不能将参数 2 从“const char *”转换为“LPCWSTR”【转】http://blog.sina.com.cn/s/blog_4a94a0db0100ktxp.html...