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

4 回复

你将 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"的格式。

回到顶部