在Go中构建一个字符串,这是“公共静态”?

时间:2018-10-12 07:21:21

标签: go

我正在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中是否有等效功能?

2 个答案:

答案 0 :(得分:3)

在Go中似乎无法完全做到这一点,但我会考虑几种替代方法:

1)使用全局变量(具有明显和已知的取舍):

var BaseURL = fmt.Sprintf("http://%s:%d/%s", host, port, path)

(另一方面,由于hostportpath也是硬编码的,因此仅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的构造将在第一次调用时仅发生一次。