云海的博客
首页
  • 接口
  • 数组
  • slice
  • map
  • 指针
  • 反射
  • Context
  • sync.map
  • 锁
  • 类型和类型指针分析
  • recover
  • 从零实现RPC框架
  • make和new区别
  • channel
  • sync.Once
  • sync.Pool
  • protobuf
  • MongoDB pkg源码-findone
  • MyBatis
  • Maven
  • 解析Laravel框架—路由处理
  • PHP(客户端)与 Golang(服务端)使用grpc+protobuf 通信
  • JAVA(客户端)与 Golang(服务端) 使用grpc+protobuf通信
  • Docker使用笔记-常用命令
  • Docker使用笔记-容器间通讯
  • Docker使用笔记-搭建Redis集群
  • Docker使用笔记-镜像多阶段构建
  • Kubernetes部署golang服务
  • Linux常用命令
  • Docker安装Prometheus与Grafana
  • Protobuf
  • TCP抓包
  • 概述-《TCP/IP详解》读书笔记
  • 索引
  • 事务隔离级别
  • 常识
  • 每日一题(1)
  • 每日一题(2)
  • 每日一题(3)
  • 每日一题(4)
关于
GitHub (opens new window)

云海

服务端研发
首页
  • 接口
  • 数组
  • slice
  • map
  • 指针
  • 反射
  • Context
  • sync.map
  • 锁
  • 类型和类型指针分析
  • recover
  • 从零实现RPC框架
  • make和new区别
  • channel
  • sync.Once
  • sync.Pool
  • protobuf
  • MongoDB pkg源码-findone
  • MyBatis
  • Maven
  • 解析Laravel框架—路由处理
  • PHP(客户端)与 Golang(服务端)使用grpc+protobuf 通信
  • JAVA(客户端)与 Golang(服务端) 使用grpc+protobuf通信
  • Docker使用笔记-常用命令
  • Docker使用笔记-容器间通讯
  • Docker使用笔记-搭建Redis集群
  • Docker使用笔记-镜像多阶段构建
  • Kubernetes部署golang服务
  • Linux常用命令
  • Docker安装Prometheus与Grafana
  • Protobuf
  • TCP抓包
  • 概述-《TCP/IP详解》读书笔记
  • 索引
  • 事务隔离级别
  • 常识
  • 每日一题(1)
  • 每日一题(2)
  • 每日一题(3)
  • 每日一题(4)
关于
GitHub (opens new window)
  • 接口
  • 数组
  • slice
  • map
  • 反射
  • sync.Pool
  • net包笔记
  • net-rpc分析
  • 指针
  • 数组排序
  • Context
  • sync.map
  • 锁
  • recover
  • 泛型
  • 类型和类型指针分析
  • make和new区别
  • channel
  • sync.Once
  • protobuf
  • GoLand debug(1)
  • 从零实现RPC框架
  • 从零开始学Go Origin框架
  • MongoDB pkg源码-findone
  • Golang
云海
2018-06-23

指针

# 概述

不像Java,Go语言为程序员提供了控制数据结构指针的能力;但你不能进行指针运算。通过给予程序员基本内存布局,Go语言允许你控制特定集合的数据结构、分配的数量以及内存访问模式,这些对构建运行良好的系统是非常重要的:指针对于性能的影响是不言而喻的,而如果你想要做的是系统编程、操作系统或者网络应用,指针更是不可或缺的一部分。

程序在内存中存储它的值,每个内存块有一个地址,通常用十六进制表示,如:0x6b0820. Go语言的取地址符是&,放到一个变量前使用就会返回相应变量的内存地址。

下面的代码片段可能输出 An interger:5, its location in memeory:0x6b0820(这个值随着你每次运行程序而变化)

var i1 = 5

fmt.Printf("An interger:%d, its location in memeory:%p\n", i1, &i1)
1
2
3

这个地址可以存储在一个叫做指针的特殊数据类型中,在本例中这是一个指向int的指针,即i1:此处使用*int表示。如果我们像调用指针intP, 我们可以这样声明它。

var intP *int
1

然后使用intP = &i1是合法的,此时intP 指向i1.(指针的格式化标识符为%p)

一个指针变量可以指向任何一个值的内存地址,它指向那个值的内存地址,在32位机器上占用4个字节,在64位机器上占用8个字节,并且与它所指向的值的大小无关。当然,可以声明指针指向任何类型的值来表明它的原始性或结构性;你可以在指针类型前面加上*号来获取指针所指向的内容。使用一个指针引用一个值被称为间接引用。 当一个指针被定义后没有分配到任何变量时,它的值为nil。

# 注意事项
  • 你不能获取一个文字或者常量的地址
  • 对于一个空指针的反向引用是不合法的,并且会使程序崩溃
上次更新: 2023/01/11
net-rpc分析
数组排序

← net-rpc分析 数组排序→

最近更新
01
函数
04-11
02
面试题
04-11
03
EFK日志收集系统单机版
08-18
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式