当前位置: 首页 > ds >正文

为什么go语言中返回的指针类型,不需要用*取值(解引用),就可以直接赋值呢?

Go 中返回的是指针,但你却能直接用“.”访问字段,看起来像是“没有解引用”,其实是 Go 帮你自动处理了“指针解引用”的语法糖。

在 Go 中,如果你有一个结构体指针(例如 *FileMeta),你可以直接用 p.Field 的方式访问字段,Go 会自动帮你做 (*p).Field 的转换。

🧠 背后原理:自动解引用(auto dereferencing)

type FileMeta struct {FileName string
}var f = &FileMeta{FileName: "test"}
fmt.Println(f.FileName)  // ✅ 等价于 fmt.Println((*f).FileName)

Go 编译器会自动将指针字段访问 f.Field 翻译为 (*f).Field,这叫做“自动解引用”,是 Go 语言为了简化语法做的语法糖处理。

❓ 那什么时候需要 * 解引用?
你只在需要整个值而不是字段的时候才需要手动解引用,例如赋值、拷贝等:

p := &Person{Name: "Alice"}
val := *p  // 拷贝整个结构体
fmt.Println(val.Name)

今天在写代码的时候发现的很奇妙的go特性:go不需要手动解引用,可以直接.field取值

func GetFileInfo(fileSha1 string) (*fileInfo, bool) {stmt, err := mydb.DBconn().Prepare("select file_sha1,file_addr,file_name,file_size from tbl_file " +"where file_sha1=? and status=1 limit 1")if err != nil {fmt.Println(err)return &fileInfo{}, false}defer stmt.Close()fileInfo := fileInfo{}//var fileInfo fileInfoerr = stmt.QueryRow(fileSha1).Scan(&fileInfo.FileSha1, &fileInfo.Location, &fileInfo.FileName, &fileInfo.FileSize)if err != nil {fmt.Println("查询失败!" + err.Error())return &fileInfo, false}return &fileInfo, true
}
func GetFileMetaDB(filehash string) (*FileMeta, bool) {fileInfo, ok := db.GetFileInfo(filehash)if !ok {return &FileMeta{}, false}filemetaDB := FileMeta{FileSha1: fileInfo.FileSha1,FileSize: fileInfo.FileSize.Int64,Location: fileInfo.Location.String,FileName: fileInfo.FileName.String,}return &filemetaDB, true
}
http://www.xdnf.cn/news/6215.html

相关文章:

  • 什么是函数重载?为什么 C 不支持函数重载,而 C++能支持函数重载?
  • 电商平台自动化
  • 基于 Spring Boot 瑞吉外卖系统开发(十五)
  • 【MoveIt 2】使用 MoveIt 任务构造器(MoveIt Task Constructor)进行拾取和放置
  • Docker 常见问题及其解决方案
  • NLP的基本流程概述
  • uni-app vue3版本打包h5后 页面跳转报错(uni[e] is not a function)
  • 使用ECS搭建云上博客wordpress(ALMP)
  • 零基础用 Hexo + Matery 搭建博客|Github Pages 免费部署教程
  • [操作系统] 策略模式进行日志模块设计
  • OkHttp连接池
  • 5月13日日记
  • 《社交应用动态表情:RN与Flutter实战解码》
  • 场景以及八股复习篇
  • 数据清洗ETL
  • 【Python 算法零基础 2.模拟 ④ 基于矩阵】
  • 【starrocks】StarRocks 常见 HTTP 操作与导入错误排查指南
  • 数值积分知识
  • MK米客方德SD NAND:无人机存储的高效解决方案
  • Qwen-3 模型的应用及实际用例
  • 面向具身智能的视觉-语言-动作模型(VLA)综述
  • 大数据开发 hadoop集群 3.Hadoop运行环境搭建
  • 【Linux】第十六章 分析和存储日志
  • voip--初始化libosip2库
  • 首个专业AI设计Agent发布-Lovart
  • nvrtc环境依赖
  • C++类和对象之相关特性
  • 养猪场巡检机器人的设计与应用研究
  • Python环境管理工具深度指南:pip、Poetry、uv、Conda
  • Vue3学习(组合式API——Watch侦听器详解)