我有这个示例代码
func myFunction(x string, y string) {
fmt.Printf("Parameter X : %s",x)
fmt.Println("")
fmt.Printf("Parameter Y : %s",y)
}
我想传递我的变量,但只传递参数Y而不传递参数X,我不知道有什么方法可以做到这一点?
谁能给我一些关键字的参考,让我在谷歌上找到它
谢谢你
=====
更新
哇,谢谢,现在我已经有了几个选择
结案
你不能这样做。
但是如果你把你的函数改成使用一个结构,你就可以使用结构中的命名字段。
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"})
如果你想让你的构造函数不那么死板, 你可以使用功能选项模式。你可以用这样的东西来达到你的目的。
// 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库,让你了解这个想法。你可以得到更多关于这个模式的信息 此处
你不能这样做。但如果你的问题需要,你可以使用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函数的详细信息 此处
你不能这样做。
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}
并设置字段或将其置零。