Menu
CoddyTech

创建一个简单的包

本课属于 Coddy GO 学习旅程的“逻辑与流程”单元。第 53 课,共 68 课。

现在该创建你自己的自定义包了!创建包可以让你把代码整理成可重复使用的模块,并在不同的程序中导入和使用。

要创建一个包,先在文件顶部使用 package 关键字声明它,后面跟上包名。对于我们的计算器包,我们会使用:

package calculator

在这个包中,你可以定义函数、变量和类型。请记住,只有导出的标识符(以大写字母开头的标识符)才能从其他包中访问。下面是定义导出的 Add 函数的方法:

package calculator

func Add(a, b int) int {
    return a + b
}

要在另一个文件中使用自定义包,你可以像导入其他包一样导入它。然后,你可以在 main 包中调用导出的函数:

package main

import "calculator"

func main() {
    result := calculator.Add(5, 3)
}

这种模块化方法能让你的代码更有条理,还能让你在多个程序中重复使用功能,而不必复制代码。

challenge icon

挑战

简单

创建一个包含基本数学运算的自定义 mathutils 包,然后在主程序中使用它。本挑战将测试你创建包、定义导出函数,以及导入自定义包并在另一个程序中使用它的能力。

你会收到两个输入:

  • 一个字符串,其中包含函数定义,格式为 "function1:param1,param2:operation|function2:param1,param2:operation"(例如:"Add:5,3:addition|Multiply:4,7:multiplication|Subtract:10,4:subtraction")
  • 一个字符串,其中包含计算请求,格式为 "operation1:value1,value2|operation2:value1,value2|operation3:value1,value2"(例如:"Add:15,25|Multiply:6,8|Subtract:50,20")

你的任务是:

  1. 在顶部声明 package mathutils,创建一个 mathutils 包
  2. 通过按竖线(|)拆分,解析第一个输入,获取各个函数定义
  3. 对每个函数定义按冒号拆分,获取函数名、参数和运算类型
  4. 在 mathutils 包中创建以下导出函数:
    • Add(a, b int) int,返回 a 和 b 的和
    • Subtract(a, b int) int,返回 a 减 b 的结果
    • Multiply(a, b int) int,返回 a 和 b 的乘积
    • Divide(a, b int) int,返回 a 除以 b 的结果(整数除法)
  5. 在主程序中导入 mathutils 包
  6. 显示包信息标题:"=== MATHUTILS PACKAGE DEMO ==="
  7. 解析第一个输入并显示可用函数:
    • "Available functions in mathutils package:"
    • 对每个函数显示:"- [function_name]: Performs [operation_type] on two integers"
  8. 通过按竖线拆分,解析第二个输入,获取各个计算请求
  9. 对每个计算请求按冒号拆分,获取函数名和参数
  10. 按逗号拆分参数,获取两个整数值
  11. 使用 strconv.Atoi 将参数字符串转换为整数
  12. 显示计算过程标题:"Performing calculations:"
  13. 对每个计算请求:
    • 调用 mathutils 包中的对应函数
    • 显示:"mathutils.[function_name]([param1], [param2]) = [result]"
  14. 计算并显示统计摘要:
    • "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. 显示包使用确认信息:
    • "Package demonstration completed successfully"
    • "All functions from mathutils package executed correctly"

使用 strings 包拆分输入字符串,使用 strconv 包将字符串转换为整数,并使用 fmt 包进行格式化输出。请记住,只有以大写字母开头的函数才会导出,才能从其他包访问。

重要:两行输入都使用竖线(|)作为条目之间的分隔符。第一个输入中的每个条目格式为 FunctionName:param1,param2:operationtype:先按 | 拆分,再按 : 拆分每个条目,以提取函数名(索引 0)和运算类型(索引 2)。

本挑战展示了如何通过自定义包编写可重复使用的代码,以及如何将功能组织到逻辑模块中。

亲手试试

package main

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

// TODO: 在这里创建 mathutils 包中的函数
// 由于不能使用单独的文件,直接定义这些函数
// 这些函数通常会放在单独的包文件中

func main() {
	// 使用 bufio.Scanner 读取输入,以正确处理空格
	scanner := bufio.NewScanner(os.Stdin)

	scanner.Scan()
	functionDefs := scanner.Text()

	scanner.Scan()
	calcRequests := scanner.Text()

	// TODO: 在下方编写你的代码
	// 1. 定义 Add、Subtract、Multiply、Divide 函数(模拟 mathutils 包)
	// 2. 解析 functionDefs:先按 '|' 拆分,得到各个定义,再按 ':' 拆分每个定义
	//    格式:FuncName:param1,param2:operation(例如 "Add:5,3:addition")
	// 3. 显示包信息和可用函数
	// 4. 解析 calcRequests(按 '|' 拆分),执行计算
	// 5. 显示结果和汇总统计信息

	// 避免出现未使用变量的警告
	_ = functionDefs
	_ = calcRequests
	_ = fmt.Sprintf
	_ = strconv.Atoi
	_ = strings.Split

	// 记得按挑战中指定的格式输出。
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Go 在线编译器