Menu
CoddyTech

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 calculator

Bê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.

challenge icon

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à:

  1. Tạo package mathutils bằng cách khai báo package mathutils ở đầu
  2. 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ẻ
  3. 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
  4. 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à b
    • Subtract(a, b int) int - trả về a trừ b
    • Multiply(a, b int) int - trả về tích của a và b
    • Divide(a, b int) int - trả về a chia cho b (phép chia số nguyên)
  5. Trong chương trình chính, import package mathutils
  6. Hiển thị tiêu đề thông tin package: "=== MATHUTILS PACKAGE DEMO ==="
  7. 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"
  8. 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ẻ
  9. 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ố
  10. Tách các tham số theo dấu phẩy để lấy hai giá trị số nguyên
  11. Chuyển các chuỗi tham số thành số nguyên bằng strconv.Atoi
  12. Hiển thị tiêu đề quá trình tính toán: "Performing calculations:"
  13. 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]"
  14. 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]"
  15. 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
}
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