0x00 指针地址和指针类型

一个变量对应一个保存了变量对应类型值的内存空间,一个指针的值是另一个变量的地址,指针变量可以指向任何一个值的内存地址。

取地址符号 &

在指针类型前加上 * 号,可以获取指针所指向的内容,它是一个类型更改器,使用一个指针引用一个值称为间接引用。

prt := &v    // v 的类型为T

v 表示被取地址的变量,prt 接收 v 的地址,prt 的类型为 *T,称为 T 的指针类型。

0x01 从指针获取指针指向的值

使用 & 对变量进行取地址之后,获得这个变量的指针,可以对指针使用 * 号来获取这个指针指向的值,称为指针取值。

temp := "test content"
prt := &temp
fmt.Println(*prt) // 打印 test content

变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:

对变量进行取地址(&)操作,可以获得这个变量的指针变量。

指针变量的值是指针地址。

对指针变量进行取值(*)操作,可以获得指针变量指向的原变量的值。

0x02 使用指针修改值

使用 * 对指针指向的值进行修改和操作

x, y := 1, 2
fmt.Println(x, y) // 1 2
j, k := &x, &y
*j, *k = *k, *j
fmt.Println(x, y) // 2 1

* 操作符的根本意义就是操作指针指向的变量。当操作在右值时,就是取指向变量的值;当操作在左值时,就是将值设置给指向的变量。

如果只是对引用的指针进行交换,那么对被引用的变量,值和地址都是不会影响,受影响的只是应用的指针。

x, y := 1, 2
fmt.Println(x, y) // 1 2
j, k := &x, &y
j, k = k, j
fmt.Println(x, y) // 1 2
fmt.Printf("x : %p, y : %p \n", &x, &y) // x : 0xc00001a088, y : 0xc00001a090
fmt.Printf("j : %p, y : %p \n", j, k) //j : 0xc00001a090, y : 0xc00001a088

x, y 值和地址都不影响,指针j, k 交换之后,j, k 的值交换了。

0x03 返回函数中局部变量

在Go语言中,返回函数中局部变量的地址也是安全的,例如下面的代码,调用f函数时创建局部变量v,在局部变量地址被返回之后依然有效,因为指针p依然引用这个变量

var p = f()

func f() *int {
v := 1
return &v
}

0x04 使用 new() 创建指针

	temp := new(int)
*temp = 123
fmt.Println(*temp) // 123
fmt.Println(temp) // 0xaabb

0x05 flag包的指针技术

指针是实现标准库中flag包的关键技术,它用来实现命令行的标志解析。

例子:

package main

import (
"flag"
"fmt"
"strings"
) var n = flag.Bool("n", true, "print test")
var sep = flag.String("s", " ", "separator")
var test = flag.String("test", " ", "测试") func main() {
flag.Parse()
fmt.Println(strings.Join(flag.Args(), *sep))
if *n {
fmt.Println(*test)
}
}

运行

$ go run main.go --help
Usage of /var/exe/main:
-n print test
-s string
separator (default " ")
-test string
测试 (default " ")
exit status 2
$ go run main.go -s "+" --test 测试文本 a bc def 123
a+bc+def+123
$ go run main.go -s "+" -n --test 测试文本 a bc def 123
a+bc+def+123
测试文本

Golang 指针理解的更多相关文章

  1. Golang指针与unsafe

    前言 我们知道在golang中是存在指针这个概念的.对于指针很多人有点忌惮(可能是因为之前学习过C语言),因为它会导致很多异常的问题.但是很多人学习之后发现,golang中的指针很简单,没有C那么复杂 ...

  2. TODO:Golang指针使用注意事项

    TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...

  3. [c++]this指针理解

    #include <iostream> using namespace std; /** * this 指针理解 */ class A{ int i; public: void hello ...

  4. golang:指针理解总结

    指针的定义 指针是一个代表着某个内存地址的值.这个内存地址往往是在内存中存储的另一个变量的值的起始位置. go指针是提供操作数据的基本桥梁.因为go很多调用,往往复制一份对象,例如函数的参数,如果没有 ...

  5. Golang - 指针与引用

    ​ Golang有指针 , 那么一切数据都是值传递吗 ? 都需要用户进行指针传递吗, 其实不然, 对于Go语言, 虽然有指针, 但是其也有引用传递. 是不是很绕, 因为引用传递就是指针传递哇 . 我们 ...

  6. 关于this指针理解

    1. this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果.this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将 ...

  7. Golang指针基本介绍及使用案例

    一.指针的相关概念说明 变量:是基本类型,变量存的就是值,也叫值类型 地址:用于引用计算机的内存地址,可理解为内存地址的标签,通俗一点讲就是一间房在小区里的门牌号.如下图① 指针:指针变量存的是一个地 ...

  8. C++指针理解

    指针是C/C++编程中的重要概念之一,也是最容易产生困惑并导致程序出错的问题之一.利用指针编程可以表示各种数据结构,通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯:指针能 ...

  9. 浅谈 .NET 中的对象引用、非托管指针和托管指针 理解C#中的闭包

    浅谈 .NET 中的对象引用.非托管指针和托管指针   目录 前言 一.对象引用 二.值传递和引用传递 三.初识托管指针和非托管指针 四.非托管指针 1.非托管指针不能指向对象引用 2.类成员指针 五 ...

随机推荐

  1. C语言中的isalpha,isdigit,islower,isupper等一系列函数

    TITLE:c语言中的isalpha,isdigit,islower,isupper等一系列函数 已经全部验证检查,无任何错误 isalnum(测试字符是否为英文或数字) 相关函数 isalpha,i ...

  2. 数据结构(四十四)交换排序(1.冒泡排序(O(n²))2.快速排序(O(nlogn))))

    一.交换排序的定义 利用交换数据元素的位置进行排序的方法称为交换排序.常用的交换排序方法有冒泡排序和快速排序算法.快速排序算法是一种分区交换排序算法. 二.冒泡排序 1.冒泡排序的定义 冒泡排序(Bu ...

  3. 实战--dango自带的分页(极简)

    注意,我将templates定义在项目的同级目录下: 在settings.py中配置 TEMPLATES = [ { 'BACKEND': 'django.template.backends.djan ...

  4. SQLite AUTOINCREMENT

    只有integer字段可以设置autoincrement.int不行.integer是无符号整型.

  5. Python装饰器基础

    一.Python装饰器引入 讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个 ...

  6. Logstash 安装及简单实用(同步MySql数据到Elasticsearch)(Windows)

    Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的.多样化的日志搜集起来,并进行自定义的处理,然后传输到指定的位置,比如某个服务器或者文件 Windows环境: 1.下载logstas ...

  7. JavaScript中继承的实现方法--详解

    最近看<JavaScript王者归来>中关于实现继承的方法,做了一些小总结: JavaScript中要实现继承,其实就是实现三层含义:1.子类的实例可以共享父类的方法:2.子类可以覆盖父类 ...

  8. NOIP模拟测试33

    这次考试很失败. T1sb题,40分钟切了,当我打完对拍全过去上厕所的时候,碰到了yxm. yxm:我又自闭了,没有一点进展. 我:…… yxm:你会做几个? 我(思考再三):T1只会暴力. (我这么 ...

  9. egret Tiledmap编写障碍物的思路

    egret Tiledmap编写障碍物的思路 获取控制对象下一刻移动的坐标,将其转换成瓦片坐标,如果getTileGIDAt(根据瓦片坐标获取瓦片id)的值不为0,说明对象将要移动的位置有障碍物,不做 ...

  10. ES6学习笔记01 -- 暂时性死区 ( temporal dead zone )

    参考文档: let 和 const 命令 - ECMAScript6入门  暂时性死区(temporal dead zone) 理解ES6中的TDZ(暂时性死区) ES6 中 let 暂时性死区详解 ...