Go语言 处理全局结构中的类型化字符串常量[已关闭]

hfyxw5xn  于 2023-01-28  发布在  Go
关注(0)|答案(2)|浏览(124)

已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。

2天前关闭。
Improve this question
我想知道如何在一个globalstruct中最好地处理类型化的string和数字常量的集合。
也就是说,我喜欢把所有写好的字符串和幻数都收集到一个可以全局调用的Struct中,这是为了防止输入错误,把所有的设置都放在一个地方,我只找到了有很多样板的解决方案,但是如何才能最好地解决这个问题呢?

wgmfuz8q

wgmfuz8q1#

如前所述,你不能真的用struct来实现这个目的,你当然可以在任何给定的包中声明一组公共的常量,然后将它们导出到其他地方使用--net/http包可能是这两种方法最常用的例子(http.MethodGet)。
另一种可能适用也可能不适用的方法(在不了解具体用例的情况下很坚韧得太多)是使用enum

type Building int

const (
    Headquarters Building = iota
    Factory
    Receiving
    Administration
)

func main() {
  fmt.Printf("You are in building %d\n", Factory)
}

playground
一般来说,我喜欢为常量使用类型别名,这样我就可以将可能值的范围限制为我想要的值:

type Building string

const (
    BuildingHQ      Building = "headquarters"
    BuildingFactory Building = "factory"
)

func main() {
    fmt.Printf("You are in building %s\n", BuildingHQ)
}

playground

dgiusagp

dgiusagp2#

感谢上面的@icza注解,这就是go库中常量的处理方式,它们都在全局空间中,所以它们的名字前面都有Method...和Status...作为前缀。
然后为StatusText(code int)添加了一个返回字符串的方便方法,但是您可以在此方法中使用任何int。

package http

// Common HTTP methods.
const (
    MethodGet     = "GET"
    MethodPost    = "POST"
    MethodPut     = "PUT"
    MethodDelete  = "DELETE"
    // Skipped lines
)

// HTTP status codes as registered with IANA.
const (
    StatusContinue           = 100 // RFC 9110, 15.2.1
    StatusSwitchingProtocols = 101 // RFC 9110, 15.2.2
    StatusProcessing         = 102 // RFC 2518, 10.1
    StatusEarlyHints         = 103 // RFC 8297

    StatusOK                   = 200 // RFC 9110, 15.3.1
    StatusCreated              = 201 // RFC 9110, 15.3.2
    StatusAccepted             = 202 // RFC 9110, 15.3.3
    StatusNonAuthoritativeInfo = 203 // RFC 9110, 15.3.4
    StatusNoContent            = 204 // RFC 9110, 15.3.5
    // Skipped lines
)

// StatusText returns a text for the HTTP status code.
func StatusText(code int) string {
    switch code {
    case StatusContinue:
        return "Continue"
    case StatusSwitchingProtocols:
        return "Switching Protocols"
    case StatusProcessing:
        return "Processing"
    case StatusEarlyHints:
        return "Early Hints"
    case StatusOK:
        return "OK"

    // Skipped lines

    default:
        return ""
    }
}

相关问题