
在 go 中,调用方法时忘记添加括号(`()`)是一个常见但容易被忽视的错误。`fmt.println(v.fullname)` 并不会执行 `fullname` 方法,而是将该方法的**函数值(function value)**——即一个指向该方法的可调用对象——传递给 `fmt.println`。由于 `fmt` 对函数值默认以十六进制地址形式输出(如 `0x496d20`),因此你看到的是类似 `0x496d20` 的地址,而非预期的 `"aaabbb"`。
要获得正确的字符串输出,必须显式调用方法:使用 v.fullName()(带括号),才能触发方法执行并返回拼接后的字符串。
✅ 正确写法如下:
package main
import "fmt"
type Name struct {
first, last string
}
func (name Name) fullName() string {
return name.first + name.last
}
func main() {
v := Name{"aaa", "bbb"}
fmt.Println(v.fullName()) // 注意:这里必须加 ()!
}? 输出结果:
aaabbb
⚠️ 补充说明:
- v.fullName 是一个方法值(method value),类型为 func() string,它已绑定接收者 v,可赋值给变量或作为参数传递(例如传给其他函数),但它本身不会自动执行;
- 若误写为 fmt.Println(&v.fullName),不仅语法错误(不能取方法地址),还会编译失败;
- 此问题与指针无关(本例中 Name 是值接收者),也非 fmt 格式化问题,而是对“调用”与“引用”的根本区分未掌握。
? 总结:在 Go 中,有括号是调用,无括号是引用。只要目标是获取方法的返回值,请务必确认末尾有 ()。这是编写清晰、可靠 Go 代码的基础习惯之一。











