Я делаю первые шаги в го. Мое первое приложение должно реализовывать 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?
При использовании функции строка строится при каждом вызове функции, верно? Я бы хотел «построить один раз», а потом просто использовать.
сделать экспортированный, BaseURL = sb.String()

Кажется, в 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-адрес в качестве параметра вашему типу клиента, когда вы его используете:
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 произойдет только один раз при первом вызове.
Если это может быть вызвано одновременно, он должен использовать sync.Once.
Просто используйте обычную функцию.