在 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() 的原因。
但关键区别在于方法签名:
你遇到的错误:
./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()) // 再读取并打印⚠️ 补充注意事项:
的函数/方法调用),而空方法调用不符合此要求。总结:在 Go 中,切勿将无返回值的方法调用直接嵌入到需要值的上下文(如函数参数、赋值右值、if 条件等)。养成“先调用,再使用”的习惯,既符合语言规范,也提升代码可读性与健壮性。