全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Go 中嵌入结构体方法调用的常见误区:避免将无返回值方法作为参数传递

在 go 中,当通过嵌入(embedding)让子结构体获得父结构体的方法时,需注意方法是否有返回值;若误将无返回值的方法(如 `setname()`)直接传给 `fmt.println()`,会触发编译错误,因其“无值可传递”。

Go 的结构体嵌入(embedding)是一种实现代码复用和“类似继承”行为的重要机制。当你将 Foo 嵌入 Bar 时(type Bar struct { Foo; id string }),Bar 实例(尤其是指针 *Bar)会自动获得 *Foo 类型定义的所有指针接收者方法(如 (*Foo).SetName 和 (*Foo).Name),前提是这些方法的接收者是 *Foo —— 这正是本例中能成功调用 bar.Name() 的原因。

但关键区别在于方法签名

  • func (f *Foo) Name() string 返回 string,因此 bar.Name() 是一个可求值的表达式,可安全用于 fmt.Println(bar.Name());
  • func (f *Foo) SetName(name string) 返回 void(即无返回值),因此 bar.SetName("...") 是一条语句,而非表达式,不能作为函数参数传递。

你遇到的错误:

./struct-2.go:33: bar.Foo.SetName("New value set to Foo struct name") used as value

本质上是 Go 编译器在提示:你试图把一条没有返回值的语句当作一个“值”来使用(此处传给了 fmt.Println 的可变参数列表),这在 Go 中是非法的。

✅ 正确写法应将方法调用与打印分离:

bar.SetName("New value set to Foo struct name") // 单独调用,不参与打印
fmt.Println("Bar getName(): ", bar.Name())       // 再读取并打印

⚠️ 补充注意事项:

  • 嵌入仅提升方法可见性,不改变方法语义:bar.SetName(...) 实际等价于 bar.Foo.SetName(...),操作的是嵌入字段 bar.Foo 的内存;
  • 若 SetName 改为值接收者 func (f Foo) SetName(...),则 bar.SetName(...) 将无法编译(因为嵌入提升仅适用于指针接收者作用于 *Bar);
  • fmt.Println 接收 interface{} 类型的可变参数,它要求每个实参都必须是可求值的表达式(如变量、字面量、有返回值的函数/方法调用),而空方法调用不符合此要求。

总结:在 Go 中,切勿将无返回值的方法调用直接嵌入到需要值的上下文(如函数参数、赋值右值、if 条件等)。养成“先调用,再使用”的习惯,既符合语言规范,也提升代码可读性与健壮性。


# go  # 区别  # 代码复用  # 编译错误  # 代码可读性  # String  # if  # 结构体  # 可变参数  # void  # 指针  # 继承  # Struct  # Interface  # 实参  # embedding  # 返回值  # 的是  # 是一个  # 是一种  # 尤其是  # 求值  # 适用于  # 不符合  # 这在  # 你将 


相关文章: C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?  做企业网站制作流程,企业网站制作基本流程有哪些?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  如何在IIS管理器中快速创建并配置网站?  已有域名和空间,如何快速搭建网站?  如何续费美橙建站之星域名及服务?  如何配置IIS站点权限与局域网访问?  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  C#如何使用XPathNavigator高效查询XML  建站ABC备案流程中有哪些关键注意事项?  如何通过.red域名打造高辨识度品牌网站?  如何快速搭建安全的FTP站点?  如何选择建站程序?包含哪些必备功能与类型?  如何获取上海专业网站定制建站电话?  ui设计制作网站有哪些,手机UI设计网址吗?  如何在阿里云通过域名搭建网站?  宝塔面板创建网站无法访问?如何快速排查修复?  寿县云建站:智能SEO优化与多行业模板快速上线指南  建站之星价格显示格式升级,你的预算足够吗?  网站制作员失业,怎样查看自己网站的注册者?  高端网站建设与定制开发一站式解决方案 中企动力  如何自定义建站之星网站的导航菜单样式?  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?  *服务器网站为何频现安全漏洞?  深圳网站制作培训,深圳哪些招聘网站比较好?  网站制作公司,橙子建站是合法的吗?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  网站制作公司排行榜,抖音怎样做个人官方网站  高性能网站服务器配置指南:安全稳定与高效建站核心方案  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  C++中引用和指针有什么区别?(代码说明)  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何在Windows 2008云服务器安全搭建网站?  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  学校建站服务器如何选型才能满足性能需求?  专业公司网站制作公司,用什么语言做企业网站比较好?  如何选择高效可靠的多用户建站源码资源?  制作充值网站的软件,做人力招聘为什么要自己交端口钱?  建站之星如何保障用户数据免受黑客入侵?  深入理解Android中的xmlns:tools属性  建站之星安装失败:服务器环境不兼容?  安云自助建站系统如何快速提升SEO排名?  建站主机选择指南:服务器配置与SEO优化实战技巧  如何通过IIS搭建网站并配置访问权限?  小程序网站制作需要准备什么资料,如何制作小程序?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  c# 在ASP.NET Core中管理和取消后台任务 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。