在 Go 中构建一个字符串,这是"public static"?



我正在迈出围棋的第一步。我的第一个应用程序将实现一个 REST 客户端。为此,我正在构建一个所有请求都有共同点的baseUrl

var sb strings.Builder
sb.WriteString("http://")
sb.WriteString(host)
sb.WriteString(":")
sb.WriteString(strconv.Itoa(apiPortTest))
sb.WriteString("/")
sb.WriteString(basePathTest)
var baseUrl = sb.String()

在 Java 中,我可以使用public static字符串在不同的类/方法中访问它。

围棋中有等价物吗?

在 Go 中似乎没有办法做到这一点,但我会考虑一些替代方案:

1( 使用全局变量(具有明显且已知的权衡(:

var BaseURL = fmt.Sprintf("http://%s:%d/%s", host, port, path)

(另一方面,由于hostportpath也是硬编码的,因此只需const BaseURL = "http://yourhost:1234/api"就足够了(。

2( 将该全局变量包装在一个函数中:

var baseURL = fmt.Sprintf("http://%s:%d/%s", host, port, path)
func BaseURL() string {
return baseURL
}

3((在我看来是明显的赢家(在使用 URL 时将 URL 作为参数传递给您的客户端类型:

type RESTClient struct {
BaseURL string
// ...
}
// on the user side:
client := &RESTClient{BaseURL: baseURL}
client.ListResources()  // or whatever

我认为你可以做这样的事情来实现一次构建它

package config
// ...
var baseURL string
func BaseURL() string {
if baseURL == "" {
// construct the base url here
host := "localhost"
apiPortTest := 9090
basePathTest := "api"
var sb strings.Builder
sb.WriteString("http://")
sb.WriteString(host)
sb.WriteString(":")
sb.WriteString(strconv.Itoa(apiPortTest))
sb.WriteString("/")
sb.WriteString(basePathTest)
baseURL = sb.String()
}
return baseURL
}

然后只需调用config.BaseURL()baseURL的构造只会在第一次调用时发生一次。

相关内容

最新更新