Go 指针相关
Go指针
Go
语言中的指针非常简单,没有偏移和运算,只需要记住两个符号。&
取变量地址与*
根据地址取值。
以下是一个简单的示例:
package main
import (
"fmt"
)
func main() {
var arr = [3]string{"一", "二", "三"}
var addArr = &arr
fmt.Printf("%p \n",addArr) // 打印地址 0xc000062330
fmt.Printf("%v \n",*addArr) // 根据地址打印值
}
指针类型
当我们使用&
取出一个变量的内存地址时,可以通过%T
查看其指针类型。
Go
语言中的值类型(int、float、bool、string、array、struct)都有对应的指针类型,如:*int
、*int64
、*string
等。
package main
import (
"fmt"
)
func main() {
var a int = 100
fmt.Printf("%T",&a) // *int
}
指针变量
以下示例中声明了一个指针变量,但是该指针指向的内存地址还没有被Go
进行分配,赋值会引发异常。
package main
import (
"fmt"
)
func main() {
var a *int
*a = 100
fmt.Println(*a)
// +0x2a exit status 2
}
new
new()
是一个内置的函数,用于对一个指针变量开辟内存空间。 为了解决上面内存空间未被开辟的问题,可以使用该函数进行开辟。
注意,实际开发中new
用的并不多。
package main
import (
"fmt"
)
func main() {
var a *int
a = new(int) // 开辟内存
*a = 100
fmt.Println(*a)
}
make
make()
同new()
相同,都是进行内存空间开辟的,但是它只针对slice
、map
、chan
的内存创建,并且它返回的值是这三个类型的本身,这三种类型不是属于值类型,而是属于引用类型,故我们可以不使用变量对其进行接收。
注意,在声明上述三种类型时,都需要使用make
进行内存创建。
package main
import (
"fmt"
)
func main() {
var b map[string]string
b = make(map[string]string, 10)
b["first"] = "第一个元素"
fmt.Println(b["first"])
}
本章小结
指针取值与指针地址
取地址操作符&
和取值操作符*
是一对互补操作符,&
取出地址,*
根据地址取出地址指向的值。
变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:
- 对变量进行取地址(
&
)操作,可以获得这个变量的指针变量。 - 指针变量的值是指针地址。
- 对指针变量进行取值(
*
)操作,可以获得指针变量指向的原变量的值。
- 对变量进行取地址(
new与make的区别
- 二者都是用来做内存分配的。
make
只用于slice
、map
以及channel
的初始化,返回的还是这三个引用类型本身;- 而
new
用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针。
Go 指针相关的更多相关文章
- 【linux+C】神器 vim + 指针相关客串
前篇回顾 上篇介绍了linux下C编程基本环境配置以及相关工具使用选择. 不过10个大牛9个用vim,那么咱们就来玩vim.linux下玩c就别依靠图形界面.好吧告别Ide,命令行才是c的王道. 本篇 ...
- C语言中和指针相关的四道题目
例子1. void fun (int *x , int *y) { printf("%d, %d", *x, *y) ; *x = 3; *y = 4;} main(){ int ...
- C++拾遗(四)指针相关
指针声明与初始化 在将指针初始化为一个确定的地址后,才能安全的对指针使用 *操作. 将整数赋值给指针时要使用强制转换(typeName *). 分配内存 C中用malloc(); C++更提倡使用ne ...
- Go指针相关
结合这个例子分析一下 结果: 结合以往C语言的基础,画了一张图来解释为什么会有上面这些值的出现.先查看下Go中的这两个运算符是啥吧. ①对于所有带a的结果 var a int = 1 定义了一个变量a ...
- C++学习---指针相关
1.指向 “指针对象” 的 ”指针” 一般指针 int *p1,ival =42; p1 = &ival; 或者 int ival =42,*p1=&val; 代表一个指针对象指向一个 ...
- C++函数指针相关 & 类成员的指针 & 成员函数的指针
有时候会有指向类成员变量或者成员函数的指针,但是注意,这个指针并不是针对一个地址的指向,而更多的是一个偏移. 同时,支持将父类对象的成员 转为 子类对象的成员指针,如下: 反过来,是不行的.因为父类的 ...
- C语言-指针
C指针基础知识 C语言中,指针无疑是最令人头疼的.今天无事就来学学C语言的指针,在此留下点笔记,仅供个人参考. 首先要搞懂的是,指针是什么? 指针:是用来存放内存地址的变量. 不管是什么类型的指针,存 ...
- C++智能指针简单剖析
导读 最近在补看<C++ Primer Plus>第六版,这的确是本好书,其中关于智能指针的章节解析的非常清晰,一解我以前的多处困惑.C++面试过程中,很多面试官都喜欢问智能指针相关的问题 ...
- C语言指针的长度和类型
本文地址:http://www.cnblogs.com/archimedes/p/point-length-type.html,转载请注明源地址. 如果考虑应用程序的兼容性和可移植性,指针的长度就是一 ...
随机推荐
- C语言如何动态分配二维数组
C语言如何动态分配二维数组(转载) 原文链接:https://www.cnblogs.com/0xWitch/p/9314621.html 使用malloc().free()函数进行动态分配,这两个函 ...
- WPF实现飞控姿态仪表盘控件Attitude dashboard
一.概要 近期项目当中需要用到飞机控制仪表盘的姿态仪,一开始去各大网站搜索解决方案要么就是winfrom要么就是很老的代码根本不能运行更甚者是居然有的还要下载积分. 只能自己手动从0开始写一个控件.这 ...
- 使用 Postman 做 API 自动化测试
Postman 最基本的功能用来重放请求,并且配合良好的 response 格式化工具. 高级点的用法可以使用 Postman 生成各个语言的脚本,还可以抓包,认证,传输文件. 仅仅做到这些还不能够满 ...
- 面经手册 · 第8篇《LinkedList插入速度比ArrayList快?你确定吗?》
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你以为考你个数据结构是要造火箭? 汽车75马力就够奔跑了,那你怎么还想要2.0涡轮+ ...
- vue+elementUI+vue-i18n 实现国际化
在main.js同级建i18n文件夹,并里面建i18n.js.langs文件夹,langs文件夹下建en.js.cn.js目录如下: . ├── App.vue ├── assets │ └── ...
- Python基础(闭包函数、装饰器、模块和包)
闭包函数 格式: def 函数名1(): def 函数名2(): 变量 = 值 return 变量 return 函数名2 func = 函数名1() key = func()
- Matrix4x4
Unity3D开发之Matrix4x4矩阵变换 https://www.cnblogs.com/hewei2012/p/4190282.html Matrix4x4 4x4矩阵 http://wiki ...
- ParticleSystem 介绍
ParticleSystem 介绍 http://gad.qq.com/article/detail/31724
- Laravel5的验证码功能
第三方扩展包 mews/captcha 作为基础来实现 Laravel 中的验证码功能 安装 注册 配置验证码文件 前端引用 后端验证 安装前准备(我这边没执行这个,安装成功,但是搜到的文件有写,不清 ...
- 聊聊redis单线程为什么能做到高性能和io多路复用到底是个什么鬼
1:io多路复用epoll io多路复用简单来说就是一个线程处理多个网络请求 我们知道epoll in 的事件触发是可读了,这个比较好理解,比如一个连接过来,或者一个数据发送过来了,那么in事件就触 ...