Menu
CoddyTech

在结构体上定义方法

本课属于 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 实例上使用点表示法调用方法,让结构体能够执行与其数据相关的操作。

challenge icon

挑战

简单

在这个挑战中,你将通过创建一个简单的图书管理系统,练习为结构体定义方法。你将创建一个 Book 结构体,并定义方法,让图书能够显示自己的信息。

重要提示:由于书名和作者姓名可能包含空格,你需要使用 bufio.Scanner 读取完整的输入行。fmt.Scanln 函数会在遇到第一个空格时停止读取,这会导致包含多个单词的书名和作者姓名无法正确读取。请使用 bufio.NewScanner(os.Stdin),并依次调用 scanner.Scan() 和 scanner.Text() 来读取完整的行。

你将收到 3 个输入:

  • 表示书名的字符串(例如,"The Go Programming Language")
  • 表示作者姓名的字符串(例如,"Alan Donovan")
  • 表示页数的字符串(例如,"380")

你的任务是:

  1. 定义一个 Book 结构体,包含 3 个字段:Title(string)、Author(string)和 Pages(int)
  2. 创建一个名为 displayInfo 的方法,使用值接收者,并按以下格式打印图书信息:"Title: [title], Author: [author], Pages: [pages]"
  3. 创建一个名为 getDescription 的方法,使用值接收者,并按以下格式返回字符串:"[title] by [author]"
  4. 使用 bufio.Scanner 正确读取输入行:
    • 创建一个扫描器:scanner := bufio.NewScanner(os.Stdin)
    • 对于每一行输入:调用 scanner.Scan(),然后调用 scanner.Text()
    • 这样可以确保正确读取包含空格的书名和作者姓名
  5. 解析输入,以创建一个 Book 实例
  6. 调用 displayInfo 方法来打印图书信息
  7. 调用 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 实例并调用这些方法
    
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Go 在线编译器