Строить строку в Go, которая является "public static"? - PullRequest
0 голосов
/ 12 октября 2018

Я делаю свои первые шаги в Го.Мое первое приложение должно реализовать клиент 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?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Я думаю, что вы можете сделать что-то подобное для достижения построить его один раз :

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 произойдет только один раз при первом вызове.

0 голосов
/ 12 октября 2018

Кажется, что в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...