背景:go不支持类似java的方法重载,但对于函数的可选参数和默认参数配置,通常要在不影响不破坏现有逻辑基础上进行参数的添加。
实现:通过options选项,使用函数进行参数的初始化和可选值的设置。
代码:
package main
import "fmt"
// go实现可选参数实践
// 背景:go不支持方法重载,但对于函数的可选参数和默认参数配置,通常要在不影响不破坏现有逻辑基础上进行参数的添加
// 实现:通过options选项,使用函数进行参数的初始化和可选值的设置
type UserConfig struct {
ID int64 `json:"id"`
Name string `json:"name"`
Age int `json:"age"`
}
type UserOptions func(*UserConfig)
func WithName(name string) UserOptions {
return func(config *UserConfig) {
config.Name = name
}
}
func WithAge(age int) UserOptions {
return func(config *UserConfig) {
config.Age = age
}
}
func GetUser(id int64, options ...UserOptions) *UserConfig {
user := &UserConfig{ID: id}
for _, option := range options {
// option本质就是函数,通过函数调用进行可选参数name、age的设置
option(user)
}
return user
}
func main() {
option1 := WithName("yzh")
option2 := WithAge(18)
user1 := GetUser(1)
user2 := GetUser(2, option1, option2)
fmt.Printf("%+v", user1) //&{ID:1 Name: Age:0}
fmt.Println()
fmt.Printf("%+v", user2) //&{ID:2 Name:yzh Age:18}
}