在结构体上定义方法
本课属于 Coddy GO 学习旅程的“逻辑与流程”单元。第 6 课,共 68 课。
在 Go 中,方法是属于特定类型的函数。与独立存在的常规函数不同,方法附加在结构体上,让你可以为自定义数据类型定义行为。
要定义一个方法,你需要在 func 关键字和方法名之间放置一个接收者。接收者指定了该方法所属的类型。
type Person struct {
Name string
Age int
}
func (p Person) greet() {
fmt.Printf("Hello, my name is %s\n", p.Name)
}在这个示例中,(p Person) 是接收者,因此 greet 是 Person 类型的方法。变量 p 表示调用该方法的 Person 实例,类似于其他语言中的 this。
然后,你可以在任何 Person 实例上使用点表示法调用方法,让结构体能够执行与其数据相关的操作。
挑战
简单在这个挑战中,你将通过创建一个简单的图书管理系统,练习为结构体定义方法。你将创建一个 Book 结构体,并定义方法,让图书能够显示自己的信息。
重要提示:由于书名和作者姓名可能包含空格,你需要使用 bufio.Scanner 读取完整的输入行。fmt.Scanln 函数会在遇到第一个空格时停止读取,这会导致包含多个单词的书名和作者姓名无法正确读取。请使用 bufio.NewScanner(os.Stdin),并依次调用 scanner.Scan() 和 scanner.Text() 来读取完整的行。
你将收到 3 个输入:
- 表示书名的字符串(例如,
"The Go Programming Language") - 表示作者姓名的字符串(例如,
"Alan Donovan") - 表示页数的字符串(例如,
"380")
你的任务是:
- 定义一个
Book结构体,包含 3 个字段:Title(string)、Author(string)和Pages(int) - 创建一个名为
displayInfo的方法,使用值接收者,并按以下格式打印图书信息:"Title: [title], Author: [author], Pages: [pages]" - 创建一个名为
getDescription的方法,使用值接收者,并按以下格式返回字符串:"[title] by [author]" - 使用
bufio.Scanner正确读取输入行:- 创建一个扫描器:
scanner := bufio.NewScanner(os.Stdin) - 对于每一行输入:调用
scanner.Scan(),然后调用scanner.Text() - 这样可以确保正确读取包含空格的书名和作者姓名
- 创建一个扫描器:
- 解析输入,以创建一个
Book实例 - 调用
displayInfo方法来打印图书信息 - 调用
getDescription方法,并打印返回的描述
这些方法应使用接收者变量访问结构体字段,并执行各自的操作。请记住,使用值接收者的方法会操作结构体实例的副本。
亲手试试
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
// TODO: 在这里定义你的 Book 结构体
// TODO: 在这里定义你的 displayInfo 方法
// TODO: 在这里定义你的 getDescription 方法
func main() {
// 创建 scanner,用于逐行读取输入
scanner := bufio.NewScanner(os.Stdin)
// 读取书名
scanner.Scan()
title := scanner.Text()
// 读取作者
scanner.Scan()
author := scanner.Text()
// 读取页数
scanner.Scan()
pagesStr := scanner.Text()
// 将 pages 字符串转换为整数
pages, _ := strconv.Atoi(pagesStr)
// TODO: 创建一个 Book 实例并调用这些方法
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Go 在线编译器