我正在迈出围棋的第一步。我的第一个应用程序将实现一个 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)
(另一方面,由于host
、port
和path
也是硬编码的,因此只需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
的构造只会在第一次调用时发生一次。