gpt4 book ai didi

go - Go 中可选参数的等效项

转载 作者:行者123 更新时间:2023-12-03 07:55:41 25 4
gpt4 key购买 nike

我正在将客户端从 python 移植到 API。原始实现使用可选参数作为

def createIntAttribute(attr_name, default_value=None, is_array=False)

它在数据库上创建一个带有或不带有默认值的整数属性,如下所示:

createIntAttribute("numUsers")             # No default attribute
createIntAttribute("numUsers", 0) # Default attribute of 0

如何在 Go 中实现这一点?

我考虑过的一些方法是:

  • 使用 int 作为类型
    无法知道用户是否想要避免创建默认值或想要创建默认值 0
  • 使用指针defaultValue *int
    每次使用时都需要 & 并且不支持文字
  • 使用结构体作为参数
    int 的默认值是 0,所以问题与第一种方法相同
  • 使用带有 value 和 isSet 属性的结构来包含可选参数
    每种类型的变量都需要一个结构。这可能可以使用泛型,但增加了 go 版本 > 1.18 的要求
    用法是 mypackage.NewOptionalStringArray([]string{"hello", "world"})
  • 使用可变参数函数func createIntAttribute(name string, options ...interface{})
    默认情况下不进行类型检查
    自动完成不显示变量的名称和类型;在 vs code 中使用单独的参数会在我输入时显示参数的名称及其类型

实现这一点的最佳方法是什么?

最佳答案

一种方法是使用 Functional Options Pattern 。请参阅下面的演示:

package main

import (
"log"
)

type options struct {
hasDefault bool
defaultValue int
}

type option func(*options)

func withDefault(value int) option {
return func(o *options) {
o.hasDefault = true
o.defaultValue = value
}
}

func createIntAttribute(name string, setters ...option) {
o := &options{}

for _, setter := range setters {
setter(o)
}

log.Println(name, o)
}

func main() {
createIntAttribute("test1")
createIntAttribute("test1", withDefault(10))
}

当作为方法链实现时,这种方法可能更加用户友好(也许):

package main

import (
"log"
)

type createIntAttributeParams struct {
name string
hasDefault bool
defaultValue int
}

// mandatory parameters here
func createIntAttribute(name string) *createIntAttributeParams {
return &createIntAttributeParams{
name: name,
}
}

// optional parameter
func (p *createIntAttributeParams) withDefault(value int) *createIntAttributeParams {
p.hasDefault = true
p.defaultValue = value
return p
}

// other with* functions to set more optional parameters

// execute
func (p *createIntAttributeParams) do() {
log.Println(*p)
}

func main() {
createIntAttribute("test1").do()
createIntAttribute("test1").withDefault(10).do()
}

关于go - Go 中可选参数的等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76082755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com