GO中的 & 和 * 在创建结构体对象场景中的含义

2023-05-16

在赋值场景中 & 和 *  分别是取地址和取值的两个特殊操作,是最基础的用法和语义。

当 * 出现在参数中或者声明场景时,代表传参类型需要指针类型或者声明一个指针变量。

基本类型的应用场景:

a := 1 // 声明变量a 并赋值1
var b *int // 声明int类型地址指针 变量b
b = &a // 将a变量地址赋值给 地址指针 b
c := *b // c取值*b,也就是 *&a 得到的就是 变量a的值 1  *&a = a, 相当于*&抵消了
 
// 上述场景为通常的变量取地址和取值

struct结构体对象应用场景:

import (
	"fmt"
)

type Book struct { // 定义一个Book类型的结构体,有三个导出(public访问权限)属性
    ID int64
    Title string
    Price float32
}

// 定义两个函数,一个是传递Book值参数,一个是传递Book指针参数
// 作为值传递的参数Book,在方法体内使用参数b时,不会改变原对象
func changePrice1(b Book, p float32) {
	b.Price = p
}

// 作为指针传递的参数Book,在方法体内使用参数b时,会改变原对象
func changePrice2(b *Book, p float32) {
	b.Price = p
}


func main() {
    // 方式1创建并赋值, 此时创建b1是一个值对象,直接使用b1时作为值对象使用,如果作为指针需要使用&
    b1 := Book{1, "go", 12.1}

    // 方式2创建并赋值,此时创建b2是一个指针对象,直接使用b2时作为指针使用,如果要获取对象值使用*
    b2 := &Book{2, "java", 1.1}

    // changePrice1需要的Book参数为值对象所以此时当前main作用域内的b1和b2的字段值不会改变
    changePrice1(b1, 10)
    changePrice1(*b2, 10)

    // 打印的b1 b2的Price值为原值,并且可以注意到,打印的b1为{...}, b2为&{...}
    fmt.Println(b1) 
    fmt.Println(b2)

    // changePrice2需要的Book参数为指针对象所以此时当前main作用域内的b1和b2的字段值会改变
    changePrice2(&b1, 10)
    changePrice2(b2, 10)
    
    // b1 b2的Price变为了10
    fmt.Println(b1) 
    fmt.Println(b2)

}

该场景下可以看出,创建对象时,直接创建type_name{}和&type_name{}的区别,如果需要当前对象在多数情况下作为指针使用并传递时使用&type_name{}方式创建对后续使用更方便,如果只作为dto类型的值使用时,直接type_name{}方式创建和使用更方便。

两种形式的创建对象都可以,具体使用哪种要参照业务场景,选择一个合适的即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GO中的 & 和 * 在创建结构体对象场景中的含义 的相关文章

  • 程序性能优化工具——gprof

    gprof是程序性能分析的一个重要工具 xff0c 通过gprof工具可以获取程序中函数之间的调用关系 xff0c 每个函数的调用次数 xff0c 及函数的消耗时间 xff0c 从而为程序性能优化指明方向 由此也可以推断出 xff0c 一个
  • 程序性能优化之分支预测

    程序是由多条指令构成的 xff0c 程序的运行便是cpu一条一条执行程序指令的过程 一条指令的执行过程大致可以分为加载指令 xff0c 翻译指令 xff0c 加载数据 xff0c 执行运算 xff0c 更新数据几个阶段 xff0c 每个阶段
  • 初识valgrind

    valgrind是一款非常优秀的性能调试工具 xff0c 通过valgrind xff0c 可以完成以下几点工作 xff1a 1 Memcheck xff1a 内存错误检测 2 Cachegrind xff1a 缓存和分支预测分析 3 Ca
  • 服务运维-日志

    服务一般情况下运行在后台 xff0c 没有界面 xff0c 很难观察到服务的状态 因此 xff0c 对于服务运维 xff0c 日志变成了一个非常重要的工具 通过服务日志 xff0c 可以了解到服务的运行状态 xff0c 如服务是否正常运行
  • 如何查看cpu是否支持sse指令级

    Mac xff1a 命令 xff1a sysctl a grep machdep cpu features 结果 xff1a machdep cpu features FPU VME DE PSE TSC MSR PAE MCE CX8 A
  • Mac系统下VSCode配置gopath

    golang项目的编译和调试依赖gopath 命令行可以通过export为每个golang项目导出不同的gopath xff0c 使用VSCode也可以通过配置 xff0c 实现不同的golang项目使用不同gopath xff0c 步骤如
  • GDB打印vector指定元素

    使用GDB调试程序时 xff0c 需要查看变量的值 对于普通变量 xff0c 直接使用p命令即可 xff0c 如下 xff1a 对于vector xff0c 也可以使用相同的方法 xff0c 如下 xff1a vector元素较少时 xff
  • Linux中学教程(一)

    突然想写点关于linux的东西 xff0c 一是将自己几十年来零碎的知识作以串联 xff0c 二是能为正在学习路上的新手作些指引 而恰好作者的孩子是一位初一的学生 xff0c 我写的这些东西也正是我手把手教授他的 xff0c 现在分享出来并
  • libevent之eventop

    功能 xff1a IO处理模型 架构 xff1a 实现 xff1a event internal h定义eventop结构体 xff0c 在 c文件实例化生成对应的全局对象 xff0c 如在poll c中生成pollops对象 event
  • C++ Lambda表达式的使用方法

    C 43 43 Lambda表达式的简单实用方法如下 xff1a include lt functional gt include lt algorithm gt include lt iostream gt include lt list
  • Visual Code 配置golang开发环境

    1 去微软官网下载安装Visual Code http code visualstudio com Download 安装成功后 xff0c 打开命令行 xff0c 输入go version xff0c 会输出golang 版本 如果没有输
  • linux下调用mysql_query产生SIGSEGV段错误

    xfeff xfeff 程序需要用到MySQL来进行持久化 xff0c 代码在windows测试通过 xff0c 但在Linux调试时 xff0c 产生下面的异常 xff1a Thread 9 34 NodesManagerd 34 rec
  • vim编辑文档误用Ctrl+S导致vim假死

    xfeff xfeff 在linux使用vim编辑源码之后 xff0c 顺手使用了ctrl 43 s xff0c 本以为会保存源码 xff0c 但不料vim却卡住了 xff0c 怎么动都动不了 经过查询 xff0c 才发现ctrl 43 s
  • golang获取命令行参数

    xfeff xfeff 对于C C 43 43 java xff0c 或C 程序 xff0c 我们可以通过入口函数 xff08 main函数 xff09 直接获取命令行参数 xff1a int main int argc char argv
  • linux不指定LD_LIBRARY_PATH运行程序

    在windows中 xff0c 只要将动态库DLL跟可执行程序放在同一个目录 xff0c 程序在运行时 xff0c 就能找到DLL 然而 xff0c 在linux中 xff0c 必须指定动态库的路径 xff0c 程序才能找到动态库 xff0
  • bfs编译失败,编译gflags时缺少config.h

    在编译百度文件系统时 xff0c 编译失败 xff0c 错误如下 xff1a 进入到bfs thirdsrc gflags 2 1 1 include gflags xff0c 发现config h存在 于是跳到gflags 2 1 1 x
  • golang文件读取介绍

    golang提供了多种文件读取方式 xff0c 第一种方式 xff0c 也是最简单的一种方式 xff0c 如下 xff1a bytes err 61 ioutil ReadFile 34 a txt 34 if err 61 nil pan
  • zookeeper分布式部署

    在部署zookeeper之前 xff0c 先准备3台服务器 xff08 服务器已安装配置jdk xff09 xff1a node0 192 168 1 161 xff08 ubuntu16 04 xff09 node1 192 168 1
  • Linux中学教程--第1章 Centos8 开局N件事

    操作系统的学习 xff0c 最重要的是动手去操作 xff0c 而不是去背诵枯燥的概念 命令 通过前面的学习 xff0c 估计大家都已经将centos 8 5安装到自己的虚拟机里了 xff0c 可是第一次登录以后桌面怎么空空的呢 xff1f
  • stdbind剖析

    stl 算法库多数算法只能提供一个参数给绑定函数 xff0c 如 for each 函数 如果想打印 vector 中的每一个元素 xff0c 用 for each 实现方式代码如下 xff1a include lt iostream gt

随机推荐