Golang中如何打印函数的值
Golang中如何打印函数的值
在学习Go语言中的接口时,我编写了以下代码:
package main
import "fmt"
type I interface {
fullName() string
}
type Person struct {
fname, lname string
}
func (p Person) fullName() string { // 不能接受: (p *Person)
return p.fname + p.lname
}
func main() {
var name string = `hasan`
var p I = Person{fname: name, lname: `yousef`}
fmt.Printf("Your full name is: %v", p.fullName)
}
我得到的输出是:
Your full name is: 0x49c560
这与预期不符,0x49c560是什么?如何打印出正确的字符串输出?
更多关于Golang中如何打印函数的值的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你将 fullName 定义为一个返回字符串的函数,因此请将你的调用更改为:
fmt.Printf("Your full name is: %v", p.fullName())
更多关于Golang中如何打印函数的值的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
是的,正如@Yamil_Bracho所指出的,你忘记实际调用函数了。
因为在Go语言中,函数(以及方法)是一等公民,它们可以作为值使用(被赋值、作为参数传递等),所以你那样做是完全“合法”的,但这具有不同的含义。
还有一点——你那条写着 // can not accept: (p *Person) 的注释并不完全正确——你实际上是可以使用指针接收器的!你的函数可以写成这样:
func (p *Person) fullName() string {
return p.fname + p.lname
}
只要你将主函数中的那行代码改为:
var p I = &Person{fname: name, lname: "yousef"}
(注意 Person 前面的 & 符号)
你遇到的问题是因为在fmt.Printf中直接引用了p.fullName而不是调用它。p.fullName是方法表达式(method expression),它返回的是函数的内存地址(十六进制表示),而不是调用方法得到的结果。
要正确打印,你需要加上括号调用这个方法:
fmt.Printf("Your full name is: %v", p.fullName())
以下是修正后的完整代码:
package main
import "fmt"
type I interface {
fullName() string
}
type Person struct {
fname, lname string
}
func (p Person) fullName() string {
return p.fname + " " + p.lname // 添加了空格分隔
}
func main() {
var name string = "hasan"
var p I = Person{fname: name, lname: "yousef"}
fmt.Printf("Your full name is: %v", p.fullName()) // 注意这里的括号
}
输出:
Your full name is: hasan yousef
关键区别:
p.fullName:获取方法表达式(函数值),打印出来是内存地址p.fullName():实际调用方法,执行函数体并返回字符串结果
另外,我在fullName()方法中添加了空格,这样输出会更符合"full name"的格式。

