没有什么比在上课时写自己的玩意摸鱼更能容易带给人灵感的了
Golang感觉实际上手确实挺简洁的,但是有些地方又简洁过头了,比如连泛型和三元表达式都没有只有对比才能感觉出一些东西的必要性,虽然你平时不一定能感受到
前言
在搞基机器学习课上准备写那个日志库的作业,但是写着写着遇到了一个问题
在其他的面向对象语言中,会提供一个构造函数的东西,Go虽然可以用结构体和函数来实现面向对象,而且拔插性很强,但是有有个问题:
没有默认参数!
在python and其他的语言,会有一个叫函数的默认参数名的东西存在,你在传参时可以自由选择是否传过去某个参数
假如你不传,函数也能运行,输出或处理一个默认的值
你可能会问,其他语言也有没有默认参数的啊
对,比如Java,但是!Go连函数的重载都不支持!
你想想,你写个含三个参数的构造函数,你得写newXXX1,newXXX2...newXXX8 你得写8个不同名字的构造函数,而且调用的时候还得分开!!
那个酸爽,简直了
解决方法
一般是结构体参数和map
但是前者来个套娃,后者来个if nil !=,都挺那个的
也有几个有意思的解决方法,有些东西确实看文档与模仿源码更能让人理解深刻
//定义结构体
type ExampleClient struct {
Name string
Job string
}
//定义配置选项函数(关键)
type Option func(*ExampleClient)
func SetName(name string) Option {// 返回一个Option类型的函数(闭包):接受ExampleClient类型指针参数并修改之
return func(this *ExampleClient) {
this.Name = name
}
}
//应用函数选项配置
func NewExampleClient(opts ...Option) ExampleClient{ // 参数是一个函数的切片
// 初始化默认值
defaultClient := ExampleClient{
Name: "default",
Job: "default",
}
// 依次调用opts函数列表中的函数,为结构体成员赋值
for _, o := range opts {
o(&defaultClient)
}
return defaultClient
}
初始化实例
func main() {
sr := NewExampleClient()
//或
sr := NewExampleClient(
setName("yezi"),
)
}
这样利用闭包的特性,当我们需要额外添加参数时,只需要增加配置选项函数即可,拓展性很强。