您当前的位置: 首页 >  golang

少林码僧

暂无认证

  • 3浏览

    0关注

    317博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Golang实现任意顺序和数量的参数传递

少林码僧 发布时间:2022-03-04 08:44:41 ,浏览量:3

实现方式:通过函数式选项模式(Functional Options Pattern)实现,即通常所说的option设计模式 实现代码
package main
 
import "fmt"
 
type Message struct {
    id      int
    name    string
    address string
    phone   int
}
 
func (msg Message) String() {
    fmt.Printf("ID:%d \n- Name:%s \n- Address:%s \n- phone:%d\n", msg.id, msg.name, msg.address, msg.phone)
}
 
func New(id, phone int, name, addr string) Message {
    return Message{
        id:      id,
        name:    name,
        address: addr,
        phone:   phone,
    }
}
 
type Option func(msg *Message)
 
var DEFAULT_MESSAGE = Message{id: -1, name: "-1", address: "-1", phone: -1}
 
func WithID(id int) Option {
    return func(m *Message) {
        m.id = id
    }
}
 
func WithName(name string) Option {
    return func(m *Message) {
        m.name = name
    }
}
 
func WithAddress(addr string) Option {
    return func(m *Message) {
        m.address = addr
    }
}
 
func WithPhone(phone int) Option {
    return func(m *Message) {
        m.phone = phone
    }
}
 
func NewByOption(opts ...Option) Message {
    msg := DEFAULT_MESSAGE
    for _, o := range opts {
        o(&msg)
    }
    return msg
}
 
func NewByOptionWithoutID(id int, opts ...Option) Message {
    msg := DEFAULT_MESSAGE
    msg.id = id
    for _, o := range opts {
        o(&msg)
    }
    return msg
}
 
func main() {
    message1 := New(1, 123, "message1", "cache1")
    message1.String()
    message2 := NewByOption(WithID(2), WithName("message2"), WithAddress("cache2"), WithPhone(456))
    message2.String()
    message3 := NewByOptionWithoutID(3, WithAddress("cache3"), WithPhone(789), WithName("message3"))
    message3.String()
}
执行结果
ID:1
- Name:message1
- Address:cache1
- phone:123
ID:2
- Name:message2
- Address:cache2
- phone:456
ID:3
- Name:message3
- Address:cache3
- phone:789
优点
  • 支持传递多个参数,并且在参数个数、类型发生变化时保持兼容性
  • 任意顺序传递参数
  • 支持默认值
  • 方便拓展
缺点
  • 增加许多function,实现成本增大
注意:

该模式使用场景为参数很多的情况下,当参数不太复杂时,尽量少用

关注
打赏
1661398670
查看更多评论
立即登录/注册

微信扫码登录

0.0381s