经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
一文详解Go语言中的Option设计模式
来源:jb51  时间:2023/5/8 10:20:20  对本文有异议

关于什么是设计模式,笔者在这里就不做过多的解释。大家自行百度谷歌就好。下面我们聊聊Option设计模式,这个单词翻译过来就是选项的意思。

它一般都是用在初始化数据的时候使用。

  1. type User struct {
  2. // 必须初始化的值
  3. Username string
  4. Age int
  5. // 非必要初始化的值
  6. Password string
  7. }

结构体中,有些字段是必须要初始化的,而有些则是不用。那些不用初始化的字段就被称为可选项。用户根据自己的实际需求对其进行初始化。

一般来说,对于这种结构体,不论是必须初始化的字段还是非必须的,都是私有的字段,不会暴露给外界。

下面是一个标准的Option的设计模式

  1. // 定义一个Option函数签名
  2. type UserOption func(user *User)
  3.  
  4. // 提供一个可选函数
  5. func WithUserPassword(password string) UserOption {
  6. return func(user *User) {
  7. user.Password = password
  8. }
  9. }
  10.  
  11. type User struct {
  12. // 必须初始化的值
  13. Username string
  14. Age int
  15. // 非必要初始化的值
  16. Password string
  17. }
  18.  
  19. // 定义一个初始化User的方法
  20. func NewUser(username string, age int, opts...UserOption) *User {
  21. user := &User{
  22. Username: username,
  23. Age: age,
  24. }
  25. for _, opt := range opts {
  26. opt(user)
  27. }
  28. return user
  29. }

步骤

  • 定义一个结构体,内部字段全部都是私有的,并且存在必须初始化字段和非必要初始化字段
  • 定义一个Option函数签名,参数是结构体指针,必须是结构体指针,因为只有指针才能设置上值
  • 定义一个初始化结构体的方法,参数是结构体必须要初始化的字段值,外加一个Option函数切片,返回值可以是结构体,也可以是指针结构体
  • 初始化结构体方法内部先初始化好一个最基本的结构体,然后遍历Option函数切片
  • 定义的Option函数实现最好用With开头,规范,不遵守也可以

Option模式变种

  1. // 定义一个Option函数签名
  2. type UserOptionErr func(user *User) error
  3.  
  4. // 提供一个可选函数
  5. func WithUserPassword(password string) UserOption {
  6. return func(user *User) error {
  7. if password == "" {
  8. return errors.New("password 不能为空")
  9. }
  10. user.Password = password
  11. return nil
  12. }
  13. }
  14.  
  15. type User struct {
  16. // 必须初始化的值
  17. Username string
  18. Age int
  19. // 非必要初始化的值
  20. Password string
  21. }
  22.  
  23. // 定义一个初始化User的方法
  24. func NewUser(username string, age int, opts...UserOption) (*User, error) {
  25. user := &User{
  26. Username: username,
  27. Age: age,
  28. }
  29. for _, opt := range opts {
  30. if err := opt(user); err != nil {
  31. return nil, err
  32. }
  33. }
  34. return user, nil
  35. }

大家应该发现了,就是修改Option函数签名的返回值,这种模式可以用作对Option函数的参数进行校验。由于这里发生了变更,导致初始化结构体的方法也需要做出相应的变化。

对于Option模式,在很多场景中都能用到,并且也是非常好用的。大家记住它是在初始化数据的时候用就行,代码模式相对固定。

到此这篇关于一文详解Go语言中的Option设计模式的文章就介绍到这了,更多相关Go Option设计模式内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号