golang指针介绍

前言

简单记录下,GO语言中的指针类型和值类型的使用,以及二两之前的区别


目录

  • 前言
  • 指针类型介绍
  • 值类型和指针类型的使用区别
      • 值类型(Value Types):
      • 指针类型(Pointer Types):
      • 示例:
        • 值类型的使用:
        • 指针类型的使用:

指针类型介绍

在Go语言中,指针是一种特殊类型的变量,用于存储其他变量的内存地址。Go语言支持指针,但相对于一些其他编程语言,使用指针的频率较低,因为Go有垃圾回收机制,可以自动管理内存,减少了手动内存管理的需求。以下是一些关于Go语言指针的基本概念:

  1. 取地址符 &

    • 通过在变量前面加上 & 符号,可以获取该变量的内存地址。
    package mainimport "fmt"func main() {x := 42var ptr *intptr = &xfmt.Println("Value of x:", x)fmt.Println("Address of x:", &x)fmt.Println("Value stored at the address:", *ptr)
    }
    
  2. 指针类型声明:

    • 使用 * 符号声明指针类型。例如,var ptr *int 表示 ptr 是一个指向 int 类型的指针。
    var ptr *int
    
  3. 零值(nil):

    • 指针的零值是 nil,表示该指针不指向任何有效的内存地址。
    var ptr *int // nil pointer
    
  4. 间接引用(解引用):

    • 使用 * 符号可以从指针中获取存储在相应内存地址上的值。这个过程叫做解引用。
    var x int = 42
    var ptr *int
    ptr = &x
    fmt.Println("Value stored at the address:", *ptr)
    
  5. 指针作为函数参数:

    • 可以将指针作为函数参数传递,从而可以在函数内部修改指针指向的值。
    package mainimport "fmt"func modifyValue(ptr *int) {*ptr = 100
    }func main() {x := 42fmt.Println("Before modification:", x)modifyValue(&x)fmt.Println("After modification:", x)
    }
    
  6. new 函数:

    • new 函数用于创建一个指向新分配的零值的指针。
    ptr := new(int)
    
  7. 不同类型的指针:

    • 可以有不同类型的指针,比如指向整数、浮点数或结构体的指针。
    var intPtr *int
    var floatPtr *float64
    var structPtr *MyStruct // 假设有一个结构体 MyStruct
    

指针在Go语言中用于处理一些特定的情况,比如在函数间传递大数据结构,或者需要直接修改某个变量的值而不是通过副本传递。然而,由于Go语言的垃圾回收机制,程序员在使用指针时不必过于担心内存管理问题。

值类型和指针类型的使用区别

在编程中,变量的类型可以分为值类型和指针类型,它们在使用和行为上有一些关键区别:

值类型(Value Types):

  1. 直接存储值:

    • 值类型的变量直接存储其值,而不是存储对内存中对象的引用。
  2. 独立的存储空间:

    • 每个值类型的变量都有自己的独立存储空间,对一个值的修改不会影响其他变量。
  3. 传递副本:

    • 当将值类型传递给函数或方法时,传递的是值的副本,而不是实际变量本身。
  4. 无需手动管理内存:

    • 对于大多数值类型,内存管理是自动的,不需要程序员手动进行内存分配或释放。
  5. 适用于简单数据结构:

    • 值类型适用于简单的数据结构,如基本数据类型(int、float、bool等)和结构体。

指针类型(Pointer Types):

  1. 存储内存地址:

    • 指针类型的变量存储的是另一个变量的内存地址。
  2. 共享存储空间:

    • 多个指针变量可以指向同一块内存地址,它们共享相同的存储空间。修改一个指针的值会影响其他指向相同地址的指针。
  3. 传递引用:

    • 当将指针类型传递给函数或方法时,传递的是内存地址的引用,允许在函数内修改原始变量的值。
  4. 需要手动管理内存:

    • 指针通常需要手动进行内存管理,包括分配和释放内存,特别是在一些低级语言中,如C和C++。
  5. 适用于动态数据结构:

    • 指针类型更适用于动态数据结构,如链表、树等,以及在需要直接操作内存时的情况。

示例:

值类型的使用:
package mainimport "fmt"func main() {x := 10 // 值类型y := x  // 创建副本y = 20  // 修改 y 不影响 xfmt.Println(x) // 输出: 10
}
指针类型的使用:
package mainimport "fmt"func main() {x := 10      // 值类型ptr := &x    // 指向 x 的指针*ptr = 20    // 通过指针修改 x 的值fmt.Println(x) // 输出: 20
}

选择值类型还是指针类型取决于具体的需求。通常,对于简单的数据结构和函数参数传递,值类型更为方便。对于需要共享数据、动态分配内存或需要直接操纵内存的情况,指针类型可能更为适用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/607501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用Docker部署开源CMF Drupal并结合cpolar内网穿透远程访问

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS,适用于各种不同的网站项目,从小型个人博客到大型企业级门户网站。它的学习…

【软考中级-软件设计师】day4:数据结构-线性表、单链表、栈和队列、串

大纲 线性结构 顺序存储和链式存储区别 单链表的插入和删除 真题 栈和队列 真题 串

kubectlkubeletrancherhelmkubeadm这几个命令行工具是什么关系?

背景 在最近学习k8s的过程中,发现kubectl&kubelet&rancher&helm&kubeadm这几个命令怎么在交错使用,他们究竟是什么关系?他们分别应该在什么情况下使用呢?这里我进行了简单的总结,做个区分。 各工具说…

性能分析与调优: Linux 实现 缺页剖析与火焰图

目录 一、实验 1.环境 2.缺页(RSS增长)剖析与火焰图 一、实验 1.环境 (1)主机 表1-1 主机 主机架构组件IP备注prometheus 监测 系统 prometheus、node_exporter 192.168.204.18grafana监测GUIgrafana192.168.204.19agent 监测 主机 node_exporter…

实现锚点定位功能(React/Vue)

前言 最近接到一个需求,修改某某页面,增加XXX功能,并实现个锚点功能。做产品就是不断优化,增加功能的过程。实现锚点的方式很多, 很多UI库也提供了组件,可以根据自己的需求调整一下组件库也可以实现&#…

vulhub中的Apache HTTPD 换行解析漏洞(CVE-2017-15715)详解

Apache HTTPD 换行解析漏洞(CVE-2017-15715) 1.cd到CVE-2017-15715 cd vulhub/httpd/CVE-2017-15715 2.运行docker-compose build docker-compose build 3.运行docker-compose up -d 4.查看docker-compose ps 5.访问 出现这个表示安装成功 6.漏洞复现…

C 练习实例22

题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。 首先吐槽一下,这是…

Linux系统操作命令

Linux管理 在线查询Linux命令: https://www.runoob.com/linux/linux-install.htmlhttps://www.linuxcool.com/https://man.linuxde.net/ 1.Linux系统目录结构 Linux系统的目录结构是一个树状结构,每一个文件或目录都从根目录开始,并且根目…

MySQL语法练习-DML语法练习

文章目录 0、相关文章1、添加数据2、修改数据3、删除数据4、总结 0、相关文章 《MySQL练习-DDL语法练习》 1、添加数据 # 给指定字段添加数据 insert into 表名 (字段名1,字段名2,...) values(值1,值2...);# 给全部字段添加数据 insert into 表名 values(值1,值2,...);#批量…

五种主流数据库:字符串匹配

当我们不能完全确定需要查找的信息时,可以使用 SQL 模糊查找的功能进行文本检索,对应的运算符是 LIKE。 本文比较五种主流数据库对于文本模糊查找的实现和差异,包括 MySQL、Oracle、SQL Server、PostgreSQL 以及 SQLite。 字符串模糊匹配My…

C++入门【24-C++ 传递指针给函数】

C 允许您传递指针给函数&#xff0c;只需要简单地声明函数参数为指针类型即可。 下面的实例中&#xff0c;我们传递一个无符号的 long 型指针给函数&#xff0c;并在函数内改变这个值&#xff1a; 实例 #include <iostream>#include <ctime>using namespace std…

MySQL面试系列-02

1. 表分区有什么好处&#xff1f; 1、存储更多数据。分区表的数据可以分布在不同的物理设备上&#xff0c;从而高效地利用多个硬件设备。和单个磁盘或者文件系统相比&#xff0c;可以存储更多数据 2、优化查询。在where语句中包含分区条件时&#xff0c;可以只扫描一个或多个…

Docker查看镜像的Dockerfile

前言 在使用Docker构建应用程序时&#xff0c;我们可以通过Dockerfile定义应用程序的环境&#xff0c;并将其打包成一个镜像。有时&#xff0c;我们可能需要查看一个已经构建好的镜像的Dockerfile&#xff0c;以了解镜像是如何构建的&#xff0c;或者进行后续的修改和调整。本…

python股票分析挖掘预测技术指标知识之蜡烛图指标(6)

本人股市多年的老韭菜&#xff0c;各种股票分析书籍&#xff0c;技术指标书籍阅历无数&#xff0c;萌发想法&#xff0c;何不自己开发个股票预测分析软件&#xff0c;选择python因为够强大&#xff0c;它提供了很多高效便捷的数据分析工具包。 我们已经初步的接触与学习其中数…

【华为OD机试真题2023CD卷 JAVAJS】根据IP查找城市

华为OD2023(C&D卷)机试题库全覆盖,刷题指南点这里 根据IP查找城市 时间限制:3s 空间限制:256MB 限定语言:不限 题目描述: 某业务需要根据终端的IP地址获取该终端归属的城市,可以根据公开的IP地址池信息查询归属城市。地址池格式如下城市名=起始IP,结束IP,起始和结…

利用格式工厂,做视频的剪辑

接到一个工作&#xff0c;一段视频中&#xff0c;需要抠除其中某一段 其实 剪映、苹果手机的视频编辑功能&#xff0c;都可以轻松搞定 只是清晰度会有损伤 而且对于太大的视频&#xff0c;苹果手机就没法处理了。 很多软件在导出高清视频时&#xff0c;需要会员收费&#xff0…

【PHP】判断字符串是否是有效的base64编码

目录 1.检测长度&#xff1a; 2.检查字符集&#xff1a; 在PHP中&#xff0c;判断一个字符串是否是有效的Base64编码&#xff0c;可以通过以下几种方法&#xff1a; 1.检测长度&#xff1a; Base64编码的字符串长度必须是4的倍数&#xff08;对于标准的Base64编码&#xff…

什么是.jks(.keystore)文件

.jks 文件就是Java KeyStore (JKS)文件。它的用于存储加密密钥和证书。这个jks可以用在SSL加密&#xff0c;Android应用签名&#xff0c;Java应用等上面。 其实&#xff0c;我们还见过.keystore文件&#xff0c;它和.jks文件是一样的。 .jks 文件是.keystore 文件的其中一种。…

Java学习笔记-day02-在IDEA中使用git忽略提交.idea下的文件

1.在根目录.gitignore文件排除.idea目录 ### IntelliJ IDEA ### .idea2.使用重置Head还原已经add过的文件 创建项目时&#xff0c;可能会有.idea中的文件先add到git后再创建的.gitignore文件&#xff0c;导致文件commit时无法排除&#xff0c;如下所示。 使用重置Head将文件…

Python从入门到网络爬虫(JSON详解)

前言 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式。和XML相比&#xff0c;JSON更加简洁和易于读写&#xff0c;同时也更加易于解析和生成。JSON的基本数据类型包括字符串、数字、布尔、null以及数组和对象两种复合类型。各种编程语言都…