Создание строки в 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?

Просто используйте обычную функцию.

cn007b 12.10.2018 09:26

При использовании функции строка строится при каждом вызове функции, верно? Я бы хотел «построить один раз», а потом просто использовать.

Robert Strauch 12.10.2018 09:28

сделать экспортированный, BaseURL = sb.String()

nilsocket 12.10.2018 09:29
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
0
3
50
2

Ответы 2

Кажется, в 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.

Adrian 12.10.2018 15:11

Другие вопросы по теме