直观的常用的初始化一个结构体的方式大概是这样
func NewClient(url string,port int,password string,db int){
return &Client{
url: url,
port: port,
password: password,
db: db,
//....
}
}
如果后续加入了新的参数,那么这个api又得修改,而且不能很好的使用默认参数,如果是自己使用问题不太明显,如果是A写出来的提供给B调用,就得重新修改打包,这样不利于代码的升级和迭代,通过阅读一些其它的源码grpc-go也好,学到一种易于扩展的选项装配方式,下面列出来
type Client struct {
url string
port int
password string
db int
}
type option func(client *Client)
func WithUrl(url string) option {
return func(client *Client) {
client.url = url
}
}
func WithPort(port int) option {
return func(client *Client) {
client.port = port
}
}
func WithPassword(pwd string) option {
return func(client *Client) {
client.password = pwd
}
}
func NewClinet(ops...option) *Client {
c := &Client{
url: "localhost",
port: 3306,
password: "",
db: 0,
}
for _,op := range ops{
op(c)
}
return c
}
第二种方法,可以根据需要传递适合的参数个数,不传还能使用默认参数,更方便以后的扩展