将变量传递给某个参数函数,而忽略其他[关闭]。

问题描述 投票:0回答:1

我有这个示例代码

func myFunction(x string, y string) {
  fmt.Printf("Parameter X : %s",x) 
  fmt.Println("")
  fmt.Printf("Parameter Y : %s",y)
}

我想传递我的变量,但只传递参数Y而不传递参数X,我不知道有什么方法可以做到这一点?

谁能给我一些关键字的参考,让我在谷歌上找到它

谢谢你

=====

更新

哇,谢谢,现在我已经有了几个选择

结案

function go variables parameters
1个回答
1
投票

你不能这样做。

但是如果你把你的函数改成使用一个结构,你就可以使用结构中的命名字段。

type xy struct{ x, y string }

func myFunction(v xy) {
    fmt.Printf("Parameter X : %v", v.x)
    fmt.Println("")
    fmt.Printf("Parameter Y : %v", v.y)
}

myFunction(xy{x: "1"})


2
投票

如果你想让你的构造函数不那么死板, 你可以使用功能选项模式。你可以用这样的东西来达到你的目的。

// Client may be used to issue requests to special API
type Client struct {
    httpClient *http.Client
    apiKey     string
    baseURL    string
}

// ClientOption is the type of constructor options for NewClient(...).
type ClientOption func(*Client) error

// WithBaseURL configures an API client with a custom base url
func WithBaseURL(baseURL string) ClientOption {
    return func(c *Client) error {
        if baseURL == "" {
            return errors.New("lib: empty base url was provided")
        }
        c.baseURL = baseURL
        return nil
    }
}

// WithCustomClient configures an API client with a custom http.Client
func WithCustomClient(httpClient *http.Client) ClientOption {
    return func(c *Client) error {
        if httpClient == nil {
            return errors.New("lib: nil http client was provided")
        }
        c.httpClient = httpClient
        return nil
    }
}

// NewClient constructs a new Client which can make requests to
// WebService APIs.
func NewClient(apiKey string, options ...ClientOption) (*Client, error) {

    if apiKey == "" {
        return nil, errors.New("lib: API key credential missing")
    }

    c := &Client{apiKey: apiKey}
    _ = WithCustomClient(&http.Client{Timeout: 5 * time.Second})(c)
    for _, option := range options {
        err := option(c)
        if err != nil {
            return nil, err
        }
    }

    return c, nil
}

然后你可以用任何你想要的方式使用它。

c, err := NewClient("key", WithCustomClient(httpClient)
// or
c, err := NewClient("key", WithCustomClient(httpClient), WithBaseURL(server.URL)

一个例子是来自生产中的google地图go库,让你了解这个想法。你可以得到更多关于这个模式的信息 此处


1
投票

你不能这样做。但如果你的问题需要,你可以使用Variadic函数。

变量函数可以使用任何数量的尾部参数来调用。

func myFunction(parameters ...int) {
  for i, parameter := range parameters {
       fmt.Printf("Parameter %d : %d\n",i ,parameter)
  }
}

然后像这样使用任意数量的ints作为参数进行调用。

myFunction(1)
myFunction(1,2)

查找关于Variadic函数的详细信息 此处


1
投票

你不能这样做。

Go没有命名参数,所以参数的顺序必须是固定的,否则无法知道哪个参数是哪个。

你可以把参数类型改为指针,并为你想排除的参数传递nil。

func myfunc(x *string, y *string) {
  if x != nil {
     fmt.Printf("Parameter X: %s\n",*x)
  }
  if y != nil { 
     fmt.Printf("Parameter Y: %s\n",*y)
  }
}

然后你可以调用 y := "foo"; myfunc(nil, &y)

一些其他的选择。

  • 将参数改为 parameter name -> parameter value,尽管在这一点上你只是让你的生活更复杂。
  • 用一个结构来代替。struct{x *int, y *int} 并设置字段或将其置零。
© www.soinside.com 2019 - 2024. All rights reserved.