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()相同,都是进行内存空间开辟的,但是它只针对slicemapchan的内存创建,并且它返回的值是这三个类型的本身,这三种类型不是属于值类型,而是属于引用类型,故我们可以不使用变量对其进行接收。

   注意,在声明上述三种类型时,都需要使用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的区别

    1. 二者都是用来做内存分配的。
    2. make只用于slicemap以及channel的初始化,返回的还是这三个引用类型本身;
    3. new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针。

Go 指针相关的更多相关文章

  1. 【linux+C】神器 vim + 指针相关客串

    前篇回顾 上篇介绍了linux下C编程基本环境配置以及相关工具使用选择. 不过10个大牛9个用vim,那么咱们就来玩vim.linux下玩c就别依靠图形界面.好吧告别Ide,命令行才是c的王道. 本篇 ...

  2. C语言中和指针相关的四道题目

    例子1. void fun (int *x , int *y) { printf("%d, %d", *x, *y) ; *x = 3; *y = 4;} main(){ int ...

  3. C++拾遗(四)指针相关

    指针声明与初始化 在将指针初始化为一个确定的地址后,才能安全的对指针使用 *操作. 将整数赋值给指针时要使用强制转换(typeName *). 分配内存 C中用malloc(); C++更提倡使用ne ...

  4. Go指针相关

    结合这个例子分析一下 结果: 结合以往C语言的基础,画了一张图来解释为什么会有上面这些值的出现.先查看下Go中的这两个运算符是啥吧. ①对于所有带a的结果 var a int = 1 定义了一个变量a ...

  5. C++学习---指针相关

    1.指向 “指针对象” 的 ”指针” 一般指针 int *p1,ival =42; p1 = &ival; 或者 int ival =42,*p1=&val; 代表一个指针对象指向一个 ...

  6. C++函数指针相关 & 类成员的指针 & 成员函数的指针

    有时候会有指向类成员变量或者成员函数的指针,但是注意,这个指针并不是针对一个地址的指向,而更多的是一个偏移. 同时,支持将父类对象的成员 转为 子类对象的成员指针,如下: 反过来,是不行的.因为父类的 ...

  7. C语言-指针

    C指针基础知识 C语言中,指针无疑是最令人头疼的.今天无事就来学学C语言的指针,在此留下点笔记,仅供个人参考. 首先要搞懂的是,指针是什么? 指针:是用来存放内存地址的变量. 不管是什么类型的指针,存 ...

  8. C++智能指针简单剖析

    导读 最近在补看<C++ Primer Plus>第六版,这的确是本好书,其中关于智能指针的章节解析的非常清晰,一解我以前的多处困惑.C++面试过程中,很多面试官都喜欢问智能指针相关的问题 ...

  9. C语言指针的长度和类型

    本文地址:http://www.cnblogs.com/archimedes/p/point-length-type.html,转载请注明源地址. 如果考虑应用程序的兼容性和可移植性,指针的长度就是一 ...

随机推荐

  1. C++ strcmp与strncmp的比较

    C++ strcmp与strncmp的比较(转载)  原文链接:https://www.cnblogs.com/ybqjymy/p/12565444.html strcmp与strncmp都是用来比较 ...

  2. pyinstaller库的简单使用 打包科赫雪花几何图形

    pyinstaller 简单使用 (cmd命令行) pyinstaller -F <文件名.py> Pyinstaller库常用参数 参数 描述 -h 查看帮助 --clean 清理打包过 ...

  3. [C#.NET 拾遗补漏]08:强大的LINQ

    大家好,这是 [C#.NET 拾遗补漏] 系列的第 08 篇文章,今天讲 C# 强大的 LINQ 查询.LINQ 是我最喜欢的 C# 语言特性之一. LINQ 是 Language INtegrate ...

  4. 揭秘!containerd 镜像文件丢失问题,竟是镜像生成惹得祸

    导语 作者李志宇,腾讯云后台开发工程师,日常负责集群节点和运行时相关的工作,熟悉 containerd.docker.runc 等运行时组件.近期在为某位客户提供技术支持过程中,遇到了 contain ...

  5. 终于弄明白了 Singleton,Transient,Scoped 的作用域是如何实现的

    一:背景 1. 讲故事 前几天有位朋友让我有时间分析一下 aspnetcore 中为什么向 ServiceCollection 中注入的 Class 可以做到 Singleton,Transient, ...

  6. .Net ImageSharp给图片添加文字

    开始之前需要Nuget安装的包 ##这三个包是一定要安装的,不然库的有些方法用不了 一.导入字体 var fonts = new FontCollection(); var fontFamily = ...

  7. asterisk PBX 对接中国移动IMS

    前提: 最近有项目需求,需要对接移动的IMS,移动的对接同事给出了信息: 用户名:+86750735xxxx@ims.gd.chinamobile.com  密码:123456 (系统导入的号码,默认 ...

  8. 石子合并2(环形求最优解 区间dp)

    题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...

  9. Google Code Jam 2020 Round1B Blindfolded Bullseye

    总结 这一题是道交互题,平时写的不多,没啥调试经验,GYM上遇到了少说交个十几发.一开始很快的想出了恰烂分的方法,但是没有着急写,果然很快就又把Test Set3的方法想到了,但是想到归想到,调了快一 ...

  10. springboot入门遇到Whitelabel Error Page错误

    错误页面: 解决方法: 启动类要放在最外层,改成下面的