全网整合营销服务商

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

免费咨询热线: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  # 返回值  # 的是  # 是一个  # 是一种  # 尤其是  # 求值  # 适用于  # 不符合  # 这在  # 你将 


相关文章: php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  5种Android数据存储方式汇总  西安大型网站制作公司,西安招聘网站最好的是哪个?  网站微信制作软件,如何制作微信链接?  如何设计高效校园网站?  如何通过可视化优化提升建站效果?  如何高效配置香港服务器实现快速建站?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  Thinkphp 中 distinct 的用法解析  如何通过WDCP绑定主域名及创建子域名站点?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  官网网站制作腾讯审核要多久,联想路由器newifi官网  重庆网站制作公司哪家好,重庆中考招生办官方网站?  如何通过免费商城建站系统源码自定义网站主题与功能?  如何选择高效便捷的WAP商城建站系统?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  Android自定义listview布局实现上拉加载下拉刷新功能  如何在IIS7中新建站点?详细步骤解析  如何自定义建站之星模板颜色并下载新样式?  如何快速生成可下载的建站源码工具?  建站主机选购指南:核心配置与性价比推荐解析  子杰智能建站系统|零代码开发与AI生成SEO优化指南  如何用狗爹虚拟主机快速搭建网站?  做企业网站制作流程,企业网站制作基本流程有哪些?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  如何用wdcp快速搭建高效网站?  网站制作公司排行榜,四大门户网站排名?  相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  微信小程序制作网站有哪些,微信小程序需要做网站吗?  盘锦网站制作公司,盘锦大洼有多少5G网站?  免费网站制作appp,免费制作app哪个平台好?  c# await 一个已经完成的Task会发生什么  如何在阿里云香港服务器快速搭建网站?  MySQL查询结果复制到新表的方法(更新、插入)  宝塔新建站点报错如何解决?  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  如何在西部数码注册域名并快速搭建网站?  宝塔建站助手安装配置与建站模板使用全流程解析  如何在阿里云域名上完成建站全流程?  建站上市公司网站建设方案与SEO优化服务定制指南  如何快速上传建站程序避免常见错误?  制作营销网站公司,淘特是干什么用的?  广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?  建站之星客服服务时间及联系方式如何?  如何选择高效可靠的多用户建站源码资源?  如何选择域名并搭建高效网站?  创业网站制作流程,创业网站可靠吗? 

您的项目需求

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