Go如何导入其他包的结构体及字段?跨包调用方法后字段取值为空怎么解决
问题原因
- 导入路径不匹配:你当前使用的导入路径
main/other和项目go.mod声明的模块名不一致,导致Go没有导入你本地编写的other包,而是拉取了缓存中无实际实现的空包,调用SetDay自然不会修改Day字段。这也是同包运行正常、跨包运行异常的核心原因:同包运行不需要走导入逻辑,直接使用当前文件的代码实现。 - 旧包缓存未清理:如果你之前修改过
other包的SetDay实现(比如早期写为值接收者),修改后没有清理模块缓存,Go运行时会直接调用旧版本的方法,值接收者只会修改结构体副本,不会生效到原变量上。
解决方案
- 修正模块导入配置
- 在项目根目录执行初始化命令:
go mod init demo(demo可替换为任意你想用的模块名) - 确认项目结构如下:
项目根目录 ├── go.mod ├── other │ └── other.go // 存放Birthday相关代码 └── main.go - 将main.go中的导入语句修改为
import "demo/other",和模块名保持一致。
- 在项目根目录执行初始化命令:
- 清理缓存重新运行
执行命令清理旧缓存:go clean -modcache,再执行go run main.go即可得到预期输出10。
内容的提问来源于stack exchange,提问作者Ignacio
相关产品推荐
相关产品推荐

