创建一个简单的包
本课属于 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)
}这种模块化方法能让你的代码更有条理,还能让你在多个程序中重复使用功能,而不必复制代码。
挑战
简单创建一个包含基本数学运算的自定义 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")
你的任务是:
- 在顶部声明
package mathutils,创建一个mathutils包 - 通过按竖线(
|)拆分,解析第一个输入,获取各个函数定义 - 对每个函数定义按冒号拆分,获取函数名、参数和运算类型
- 在
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 的结果(整数除法)
- 在主程序中导入
mathutils包 - 显示包信息标题:
"=== MATHUTILS PACKAGE DEMO ===" - 解析第一个输入并显示可用函数:
"Available functions in mathutils package:"- 对每个函数显示:
"- [function_name]: Performs [operation_type] on two integers"
- 通过按竖线拆分,解析第二个输入,获取各个计算请求
- 对每个计算请求按冒号拆分,获取函数名和参数
- 按逗号拆分参数,获取两个整数值
- 使用
strconv.Atoi将参数字符串转换为整数 - 显示计算过程标题:
"Performing calculations:" - 对每个计算请求:
- 调用
mathutils包中的对应函数 - 显示:
"mathutils.[function_name]([param1], [param2]) = [result]"
- 调用
- 计算并显示统计摘要:
"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]"
- 显示包使用确认信息:
"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
// 记得按挑战中指定的格式输出。
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Go 在线编译器