我正在Go中迈出第一步。我的第一个应用程序将实现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中是否有等效功能?
答案 0 :(得分:3)
在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
答案 1 :(得分:1)
我认为您可以执行以下操作来实现 构建一次 :
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
的构造将在第一次调用时仅发生一次。