Golang方法示例:https://play.golang.org/p/AKrvuxF0wMK

Golang方法示例:https://play.golang.org/p/AKrvuxF0wMK 在这个程序中:https://play.golang.org/p/AKrvuxF0wMK

是 (s secretAgent)。

这里的 “s” 在程序的其他地方出现过吗?“s” 有什么特殊含义?

package main

import (
	"fmt"
)

type person struct {
	first string
	last  string
}

type secretAgent struct {
	person
	ltk bool
}

func (s secretAgent) speak() {
	fmt.Println("I am", s.first, s.last, " - the secretAgent speak")
}

func (p person) speak() {
	fmt.Println("I am", p.first, p.last, " - the person speak")
}

type human interface {
	speak()
}

func saySomething(h human) {
	h.speak()
}

func main() {
	sa1 := secretAgent{
		person: person{
			first: "James",
			last:  "Bond",
		},
		ltk: true,
	}

	p1 := person{
		first: "Dr.",
		last:  "Yes",
	}

	fmt.Println(sa1)
	sa1.speak()
	fmt.Println(p1)

	// 错误示例
	// p1.speak()
	saySomething(sa1)
	saySomething(p1)
}

更多关于Golang方法示例:https://play.golang.org/p/AKrvuxF0wMK的实战教程也可以访问 https://www.itying.com/category-94-b0.html

12 回复

谢谢

更多关于Golang方法示例:https://play.golang.org/p/AKrvuxF0wMK的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


有趣。谢谢!

我仔细研究了您的信息,并将定义保存到文件中。

这个程序有返回值吗?如果有的话,返回值是什么?

哦,天哪,我现在看到 “s” 了,在这里:s.first, s.last

你在任何地方看到 return 关键字了吗?好吧,我也没有看到,所以看起来确实没有。

这段代码的返回值是什么。

https://play.golang.org/p/AKrvuxF0wMK

你在任何地方看到 return 关键字了吗?好吧,我也没有看到,所以看起来并不存在。

好的,根据你所说的,显然必须存在 return 关键字才能有返回。

方法是与结构体绑定的函数。接收器是结构体实例名称的括号说明,以便在函数内部使用。因此方法具有接收器;而纯函数则没有。更多信息请参阅以下链接。

返回语句是函数或方法向调用者返回值的方式。如果您询问的是"defer"部分,请查阅语言规范中的defer以获取详细信息。

https://golang.org/doc/effective_go.html#pointers_vs_values

绑定函数可以返回值,但您的函数没有返回。它只是打印一些文本。它的工作方式与常规函数相同

func double(x int) int {
     return x * 2
}

) 后面的 int 告诉计算机这个函数将返回一个整数。而后面的 return 语句将实现这一点。另一方面,一个只打印某些文本的函数可能不会返回任何内容,在 ) 后面也不会有任何内容。

func printDouble(x int) {
    fmt.Println(x * 2)
}

有人能解释一下"接收者"的定义吗? 另外,"返回"的定义是什么? 我找到了这个:返回语句

函数 F 中的"返回"语句会终止 F 的执行,并可以选择提供一个或多个结果值。在 F 返回给调用者之前,由 F 延迟执行的任何函数都会被执行。(语言规范)

他指的是这个吗?有人能详细说明一下吗?

我找不到"接收者"的相关信息。

在这个Go程序中,ssecretAgent 类型方法 speak() 的接收者参数。它只在定义该方法的上下文中出现,作为接收者的标识符。

具体分析:

  1. s 在方法定义中作为接收者:
func (s secretAgent) speak() {
    fmt.Println("I am", s.first, s.last, " - the secretAgent speak")
}
  1. s 的作用域仅限于 speak() 方法内部,用于访问 secretAgent 实例的字段:
s.first  // 访问嵌入的person结构体的first字段
s.last   // 访问嵌入的person结构体的last字段
  1. 在程序的其他地方,如 main() 函数中,使用的是具体的变量名:
sa1 := secretAgent{
    person: person{
        first: "James",
        last:  "Bond",
    },
    ltk: true,
}

sa1.speak()  // 这里调用时,sa1会作为接收者传递给s参数

secretAgent 结构体嵌入了 person 类型,因此可以直接访问 person 的字段。当调用 sa1.speak() 时,sa1 实例会作为接收者传递给方法中的 s 参数。

类似的,person 类型的 speak() 方法使用 p 作为接收者参数:

func (p person) speak() {
    fmt.Println("I am", p.first, p.last, " - the person speak")
}

接收者参数的命名(sp)是约定俗成的,通常使用类型的首字母缩写,但也可以是任何有效的标识符。

回到顶部