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

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

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

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

go 复制代码
type FileMeta struct {
	FileName string
}

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

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

❓ 那什么时候需要 * 解引用?

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

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

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

go 复制代码
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 fileInfo
	err = 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
}
go 复制代码
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
}
相关推荐
无为之士1 小时前
君正交叉编译链工具mips-gcc540-glibc222-64bit-r3.3.0.smaller.bz2编译st-device-sdk-c
c语言·开发语言
程序员爱钓鱼1 小时前
Go语言实战案例- 开发一个ToDo命令行工具
后端·google·go
源力祁老师2 小时前
深入分析 json2(新)与标准的 jsonrpc的区别
开发语言
小wanga2 小时前
C++知识
java·开发语言·c++
学渣676562 小时前
文件传输工具rsync|rust开发环境安装|Ascend实验相关命令
开发语言·后端·rust
木心爱编程2 小时前
C++容器内存布局与性能优化指南
开发语言·c++·性能优化
我是渣哥2 小时前
Java String vs StringBuilder vs StringBuffer:一个性能优化的探险故事
java·开发语言·jvm·后端·算法·职场和发展·性能优化
你我约定有三2 小时前
java--写在 try 中的创建连接
java·开发语言
ERP老兵-冷溪虎山2 小时前
Python/JS/Go/Java同步学习(第三篇)四语言“切片“对照表: 财务“小南“纸切片术切凭证到崩溃(附源码/截图/参数表/避坑指南/老板沉默术)
java·javascript·python·golang·中医编程·四语言同步学习·职场生存指南
boonya3 小时前
桌面应用开发语言与框架选择指南
开发语言·桌面应用