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.
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à:
- Định nghĩa giao diện
Vehiclevới chữ ký của một phương thức:GetInfo(), phương thức này trả về một chuỗi - Định nghĩa cấu trúc
Carvới hai trường:Brand(chuỗi) vàSpeed(số nguyên) - Triển khai phương thức
GetInfo()cho cấu trúcCar. Phương thức này trả về một chuỗi theo định dạng:"Brand: [brand], Speed: [speed] km/h" - Phân tích các đầu vào để tạo một đối tượng
Car - 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)
}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
1Luồng điều khiển nâng cao
Switch với `fallthrough`Thoát khỏi vòng lặp lồng nhauTiếp tục một vòng lặp cụ thểCâu lệnh `goto`Ôn tập: điều khiển vòng lặp nâng cao4Dự án: Danh sách việc cần làm đơn giản
Thiết lập dự ánThêm một việc cần làm2Struct và phương thức
Định nghĩa phương thức cho structReceiver giá trịReceiver con trỏChọn receiverPhương thức và hàmÔn tập: hành vi của struct5Tìm hiểu chuyên sâu về map
Map chứa structCon trỏ làm giá trị của mapKiểm tra map nilSo sánh các mapÔn tập: bộ đếm tần suất từ8Dự án: Quản lý hàng tồn kho đơn giản
Tổng quan dự ánKiểm tra hàng tồn kho3Interface (cơ bản)
Interface là gì?Định nghĩa interfaceTriển khai interfaceDùng kiểu interfaceInterface rỗngKhẳng định kiểuType switchÔn tập: hình dạng và hành viTự luyện tập: Trình biên dịch Go online