Menu
CoddyTech

Triển khai interface

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 14 trên 68.

Giờ bạn đã biết cách định nghĩa một interface, hãy cùng tìm hiểu cách các kiểu trong Go thực sự triển khai interface. Điều quan trọng nhất cần hiểu là Go sử dụng cách triển khai ngầm định, không cần từ khóa hay khai báo đặc biệt nào.

Nếu một kiểu có tất cả các phương thức mà một giao diện yêu cầu, kiểu đó tự động đáp ứng giao diện ấy. Bạn không cần khai báo rõ rằng kiểu của mình triển khai giao diện, Go sẽ tự xác định điều này.

Đây là cách hoạt động với giao diện (interface) Shaper trong bài học trước:

type Circle struct {
    Radius float64
}

func (c Circle) Area() float64 {
    return 3.14159 * c.Radius * c.Radius
}

Vì kiểu Circle có phương thức Area() trả về float64, nên nó tự động triển khai giao diện Shaper. Bạn không cần khai báo rõ mối quan hệ này, Go nhận biết dựa trên sự khớp nhau của chữ ký phương thức.

Cách tiếp cận ngầm định này giúp các giao diện (interface) của Go vô cùng linh hoạt. Bất kỳ kiểu hiện có nào cũng có thể đáp ứng một giao diện mới miễn là có các phương thức (method) bắt buộc, ngay cả khi giao diện đó được tạo sau khi kiểu ấy đã được viết.

challenge icon

Thử thách

Dễ

Trong thử thách này, bạn sẽ luyện tập cách triển khai giao diện bằng cách tạo một hệ thống phương tiện đơn giản. Bạn sẽ tạo một cấu trúc Car tự động triển khai giao diện Vehicle thông qua cơ chế triển khai ngầm của Go.

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

  • Một chuỗi (string) biểu thị thương hiệu của xe, ví dụ "Toyota"
  • Một chuỗi biểu thị tốc độ của xe tính bằng km/h, ví dụ "120"

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

  1. Định nghĩa giao diện Vehicle với chữ ký của một phương thức: GetInfo(), phương thức này trả về một chuỗi
  2. Định nghĩa cấu trúc Car với hai trường: Brand (chuỗi) và Speed (số nguyên)
  3. Triển khai phương thức GetInfo() cho cấu trúc Car. Phương thức này trả về một chuỗi theo định dạng: "Brand: [brand], Speed: [speed] km/h"
  4. Phân tích các đầu vào để tạo một đối tượng Car
  5. Gọi phương thức GetInfo() và in kết quả ra

Hãy nhớ rằng trong Go, cấu trúc Car sẽ tự động triển khai giao diện Vehicle vì nó có phương thức GetInfo() cần thiết với chữ ký chính xác. Bạn không cần khai báo rõ ràng rằng Car triển khai Vehicle. Go nhận biết mối quan hệ này một cách ngầm định.

Tự làm thử

package main

import (
	"fmt"
	"strconv"
)

// TODO: 1. Định nghĩa interface Vehicle với phương thức (method) GetInfo() trả về chuỗi (string)

// TODO: 2. Định nghĩa struct Car với các trường Brand (string) và Speed (int)

// TODO: 3. Triển khai phương thức GetInfo() cho Car

func main() {
	// Đọc đầu vào (input)
	var brand string
	var speedStr string
	fmt.Scanln(&brand)
	fmt.Scanln(&speedStr)

	// Chuyển chuỗi speed thành số nguyên (integer)
	speed, _ := strconv.Atoi(speedStr)

	// TODO: 4. Tạo instance Car bằng brand và speed, rồi gọi GetInfo()
	result := "" // Thay dòng này bằng phần code bạn viết
	_ = brand
	_ = speed

	// In ra kết quả
	fmt.Println(result)
}
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