Menu
CoddyTech

Định nghĩa phương thức cho struct

Thuộc phần Logic và luồng điều khiển trong hành trình GO của Coddy. Bài học 6 trên 68.

Trong Go, phương thức (method) là hàm (function) thuộc về một kiểu cụ thể. Khác với hàm thông thường đứng độc lập, phương thức gắn với các struct và cho phép bạn xác định hành vi cho các kiểu dữ liệu tùy chỉnh.

Để định nghĩa một phương thức (method), bạn đặt một bộ nhận giữa từ khóa func và tên phương thức. Bộ nhận xác định kiểu dữ liệu nào sở hữu phương thức đó.

type Person struct {
    Name string
    Age  int
}

func (p Person) greet() {
    fmt.Printf("Hello, my name is %s\n", p.Name)
}

Trong ví dụ này, (p Person) là đối tượng nhận, khiến greet trở thành phương thức của kiểu Person. Biến p đại diện cho instance Person mà phương thức được gọi trên đó, tương tự như this trong các ngôn ngữ khác.

Sau đó, bạn có thể gọi phương thức bằng ký pháp dấu chấm trên bất kỳ đối tượng Person nào, nhờ vậy các cấu trúc của bạn có thể thực hiện những hành động liên quan đến dữ liệu của chúng.

challenge icon

Thử thách

Dễ

Trong thử thách này, bạn sẽ luyện cách định nghĩa phương thức cho struct bằng cách tạo một hệ thống quản lý sách đơn giản. Bạn sẽ tạo một struct Book và định nghĩa các phương thức cho phép sách hiển thị thông tin.

Lưu ý quan trọng: Vì tiêu đề sách và tên tác giả có thể chứa khoảng trắng, bạn cần dùng bufio.Scanner để đọc toàn bộ dòng đầu vào. Hàm fmt.Scanln dừng đọc ở khoảng trắng đầu tiên, khiến tiêu đề gồm nhiều từ và tên tác giả gồm nhiều từ bị đọc sai. Hãy dùng bufio.NewScanner(os.Stdin) và gọi scanner.Scan(), sau đó gọi scanner.Text() để đọc trọn dòng.

Bạn sẽ nhận ba đầu vào:

  • Một chuỗi biểu thị tiêu đề sách (ví dụ: "The Go Programming Language")
  • Một chuỗi biểu thị tên tác giả (ví dụ: "Alan Donovan")
  • Một chuỗi biểu thị số trang (ví dụ: "380")

Nhiệm vụ của bạn là:

  1. Định nghĩa một struct Book có ba trường: Title (string), Author (string) và Pages (int)
  2. Tạo một phương thức tên là displayInfo với bộ nhận giá trị, phương thức này in thông tin sách theo định dạng: "Title: [title], Author: [author], Pages: [pages]"
  3. Tạo một phương thức tên là getDescription với bộ nhận giá trị, phương thức này trả về một chuỗi theo định dạng: "[title] by [author]"
  4. Dùng bufio.Scanner để đọc đúng các dòng đầu vào:
    • Tạo scanner: scanner := bufio.NewScanner(os.Stdin)
    • Với mỗi dòng đầu vào, gọi scanner.Scan(), sau đó gọi scanner.Text()
    • Cách này đảm bảo tiêu đề và tên tác giả có khoảng trắng được đọc chính xác
  5. Phân tích các đầu vào để tạo một instance Book
  6. Gọi phương thức displayInfo để in thông tin sách
  7. Gọi phương thức getDescription và in phần mô tả được trả về

Các phương thức nên dùng biến bộ nhận để truy cập các trường của struct và thực hiện thao tác tương ứng. Hãy nhớ rằng phương thức có bộ nhận giá trị hoạt động trên một bản sao của instance struct.

Tự làm thử

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
)

// TODO: Định nghĩa struct Book tại đây

// TODO: Định nghĩa phương thức displayInfo tại đây

// TODO: Định nghĩa phương thức getDescription tại đây

func main() {
    // Tạo scanner để đọc từng dòng đầu vào
    scanner := bufio.NewScanner(os.Stdin)
    
    // Đọc title
    scanner.Scan()
    title := scanner.Text()
    
    // Đọc author
    scanner.Scan()
    author := scanner.Text()
    
    // Đọc pages
    scanner.Scan()
    pagesStr := scanner.Text()
    
    // Chuyển chuỗi pages thành số nguyên
    pages, _ := strconv.Atoi(pagesStr)
    
    // TODO: Tạo một instance Book và gọi các phương thức
    
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng điều khiển

Tự luyện tập: Trình biên dịch Go online