Tạo package đơn giản
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 53 trên 68.
Đã đến lúc tạo package tùy chỉnh của riêng bạn! Việc tạo package giúp bạn sắp xếp code thành các module có thể tái sử dụng, nhập và dùng trong nhiều chương trình khác nhau.
Để tạo một package, bạn bắt đầu bằng cách khai báo package ở đầu tệp với từ khóa package, theo sau là tên package. Với package máy tính của chúng ta, mình sẽ dùng:
package calculatorBên trong package này, bạn có thể định nghĩa các hàm, biến và kiểu dữ liệu. Hãy nhớ rằng chỉ những định danh được xuất (bắt đầu bằng chữ cái viết hoa) mới có thể được truy cập từ các package khác. Sau đây là cách bạn có thể định nghĩa một hàm Add được xuất:
package calculator
func Add(a, b int) int {
return a + b
}Để dùng package tùy chỉnh từ một tệp khác, bạn import package đó giống như mọi package khác. Từ package main, bạn có thể gọi các hàm đã xuất:
package main
import "calculator"
func main() {
result := calculator.Add(5, 3)
}Cách tiếp cận theo mô-đun này giúp code của bạn có tổ chức hơn và cho phép bạn tái sử dụng chức năng trong nhiều chương trình mà không cần lặp lại code.
Thử thách
DễTạo một package mathutils tùy chỉnh với các phép toán cơ bản, sau đó dùng package đó trong chương trình chính của bạn. Thử thách này sẽ kiểm tra khả năng tạo package, định nghĩa các hàm được export và import package tùy chỉnh để dùng trong chương trình khác.
Bạn sẽ nhận được hai đầu vào:
- Một chuỗi chứa các định nghĩa hàm (function) theo định dạng
"function1:param1,param2:operation|function2:param1,param2:operation"(ví dụ:"Add:5,3:addition|Multiply:4,7:multiplication|Subtract:10,4:subtraction") - Một chuỗi chứa các yêu cầu tính toán theo định dạng
"operation1:value1,value2|operation2:value1,value2|operation3:value1,value2"(ví dụ:"Add:15,25|Multiply:6,8|Subtract:50,20")
Nhiệm vụ của bạn là:
- Tạo package
mathutilsbằng cách khai báopackage mathutilsở đầu - Phân tích đầu vào thứ nhất bằng cách tách theo dấu gạch đứng (
|) để lấy các định nghĩa hàm riêng lẻ - Với mỗi định nghĩa hàm, tách theo dấu hai chấm để lấy tên hàm, tham số và loại phép toán
- Tạo các hàm được export sau đây trong package
mathutils:Add(a, b int) int- trả về tổng của a và bSubtract(a, b int) int- trả về a trừ bMultiply(a, b int) int- trả về tích của a và bDivide(a, b int) int- trả về a chia cho b (phép chia số nguyên)
- Trong chương trình chính, import package
mathutils - Hiển thị tiêu đề thông tin package:
"=== MATHUTILS PACKAGE DEMO ===" - Phân tích đầu vào thứ nhất và hiển thị các hàm có sẵn:
"Available functions in mathutils package:"- Với mỗi hàm:
"- [function_name]: Performs [operation_type] on two integers"
- Phân tích đầu vào thứ hai bằng cách tách theo dấu gạch đứng để lấy các yêu cầu tính toán riêng lẻ
- Với mỗi yêu cầu tính toán, tách theo dấu hai chấm để lấy tên hàm và các tham số
- Tách các tham số theo dấu phẩy để lấy hai giá trị số nguyên
- Chuyển các chuỗi tham số thành số nguyên bằng
strconv.Atoi - Hiển thị tiêu đề quá trình tính toán:
"Performing calculations:" - Với mỗi yêu cầu tính toán:
- Gọi hàm thích hợp từ package
mathutils - Hiển thị:
"mathutils.[function_name]([param1], [param2]) = [result]"
- Gọi hàm thích hợp từ package
- Tính toán và hiển thị số liệu tổng kết:
"Calculation Summary:""Total calculations performed: [number_of_calculations]""Functions used: [comma_separated_list_of_unique_function_names_used]""Sum of all results: [sum_of_all_calculation_results]"
- Hiển thị xác nhận sử dụng package:
"Package demonstration completed successfully""All functions from mathutils package executed correctly"
Dùng package strings để tách các chuỗi đầu vào, package strconv để chuyển chuỗi thành số nguyên và package fmt để định dạng đầu ra. Hãy nhớ rằng chỉ những hàm bắt đầu bằng chữ cái viết hoa mới được export và có thể truy cập từ package khác.
Quan trọng: Cả hai dòng đầu vào đều dùng dấu gạch đứng (|) làm dấu phân cách giữa các mục. Mỗi mục trong đầu vào thứ nhất có định dạng FunctionName:param1,param2:operationtype: trước tiên, tách theo |, sau đó tách từng mục theo : để lấy tên hàm (chỉ số 0) và loại phép toán (chỉ số 2).
Thử thách này minh họa cách tạo code có thể tái sử dụng thông qua các package tùy chỉnh và cách sắp xếp chức năng thành các module hợp lý.
Tự làm thử
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
// TODO: Tạo các hàm (function) của package mathutils tại đây
// Vì không thể dùng các tệp riêng, hãy định nghĩa các hàm trực tiếp
// Thông thường, các hàm này sẽ nằm trong một tệp package riêng
func main() {
// Đọc đầu vào bằng bufio.Scanner để xử lý đúng khoảng trắng
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
functionDefs := scanner.Text()
scanner.Scan()
calcRequests := scanner.Text()
// TODO: Viết code bên dưới
// 1. Định nghĩa các hàm Add, Subtract, Multiply, Divide (mô phỏng package mathutils)
// 2. Phân tích functionDefs: tách theo '|' để lấy từng định nghĩa, rồi tách mỗi định nghĩa theo ':'
// Định dạng: FuncName:param1,param2:operation (ví dụ: "Add:5,3:addition")
// 3. Hiển thị thông tin package và các hàm có sẵn
// 4. Phân tích calcRequests (tách theo '|'), rồi thực hiện các phép tính
// 5. Hiển thị kết quả và số liệu thống kê tổng hợp
// Ẩn cảnh báo về các biến chưa dùng
_ = functionDefs
_ = calcRequests
_ = fmt.Sprintf
_ = strconv.Atoi
_ = strings.Split
// Nhớ in đầu ra đúng định dạng mà thử thách yêu cầu
}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 vi6Go theo cách viết thành ngữ: tập hợp
Cách dùng tập hợp trong GoTạo tập hợpThêm phần tử vào tập hợpKiểm tra phần tử có thuộc tập hợp khôngXóa phần tử khỏi tập hợpLặp qua tập hợpÔn tập: tên người dùng duy nhất9Package và phạm vi
Package là gì?Được xuất và không được xuấtTạo package đơn giảnBí danh packageĐịnh danh trống `_`Hàm `init`Ôn tập: xây dựng tiện íchTự luyện tập: Trình biên dịch Go online