Zinx 学习记录
借 Zinx 的接口、函数类型和 Worker 队列示例理解 Go 代码组织。
Zinx 学习记录
NewServer 为什么返回接口
/* 创建一个服务器句柄 */
func NewServer (name string) ziface.IServer {
s:= &Server {
Name :name, IPVersion:"tcp4", IP:"0.0.0.0", Port:7777, }
return s
}
这个接口限定了调用者可见的服务器能力,也便于替换实现或在测试中使用 mock。是否返回接口要看框架的边界,不必把它推广成所有构造函数都必须遵循的规则。
用函数类型传入处理逻辑
ProcessFunc 规定输入和输出;applyToStrings 负责遍历,具体处理逻辑由调用者提供。
package main
import (
"fmt"
)
// 定义ProcessFunc类型
type ProcessFunc func(input string) int
// 实现一个计算字符串字节数的ProcessFunc
func countBytes(s string) int {
return len(s)
}
// 实现一个返回固定值的ProcessFunc
func fixedValue(s string) int {
return 42
}
// applyToStrings 接受一个ProcessFunc和字符串切片,应用函数到每个字符串
func applyToStrings(f ProcessFunc, inputs []string) []int {
results := make([]int, len(inputs))
for i, s := range inputs {
results[i] = f(s) // 应用ProcessFunc到每个字符串
}
return results
}
func main() {
strings := []string{"hello", "world", "go", "programming"}
// 使用countBytes函数
lengths := applyToStrings(countBytes, strings)
fmt.Println("字符串字节数:", lengths)
// 使用fixedValue函数
values := applyToStrings(fixedValue, strings)
fmt.Println("固定值:", values)
}
这里的 len(s) 统计字节数。示例中的英文字符串恰好与字符数相同,中文字符串不能这样等同。
Worker 队列初始化
先创建 channel 切片,再初始化每个 channel;仅创建切片时,各元素仍然是 nil。
var workerPool = make([]chan ziface.IRequest, 10) // 创建一个包含10个通道的切片
for i := range workerPool {
workerPool[i] = make(chan ziface.IRequest, 5) // 初始化每个通道,容量为5
}
测试文件
测试文件与被测代码放在同一目录,文件名以 _test.go 结尾。例如 calc.go 对应 calc_test.go。