Go: ์ œ์•ˆ: ์‚ฌ์–‘: ํ˜•์‹ํ™”๋œ ์—ด๊ฑฐํ˜• ์ง€์› ์ถ”๊ฐ€

์— ๋งŒ๋“  2017๋…„ 04์›” 01์ผ  ยท  180์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: golang/go

๋‚˜๋Š” ๊ทธ ์—ด๊ฑฐํ˜•์„ type ์˜ ํŠน๋ณ„ํ•œ ์ข…๋ฅ˜๋กœ Go์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ๋Š” protobuf ์˜ˆ์ œ์—์„œ ์ฐจ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜ Go์˜ ์—ด๊ฑฐํ˜•

type SearchRequest int
var (
    SearchRequestUNIVERSAL SearchRequest = 0 // UNIVERSAL
    SearchRequestWEB       SearchRequest = 1 // WEB
    SearchRequestIMAGES    SearchRequest = 2 // IMAGES
    SearchRequestLOCAL     SearchRequest = 3 // LOCAL
    SearchRequestNEWS      SearchRequest = 4 // NEWS
    SearchRequestPRODUCTS  SearchRequest = 5 // PRODUCTS
    SearchRequestVIDEO     SearchRequest = 6 // VIDEO
)

type SearchRequest string
var (
    SearchRequestUNIVERSAL SearchRequest = "UNIVERSAL"
    SearchRequestWEB       SearchRequest = "WEB"
    SearchRequestIMAGES    SearchRequest = "IMAGES"
    SearchRequestLOCAL     SearchRequest = "LOCAL"
    SearchRequestNEWS      SearchRequest = "NEWS"
    SearchRequestPRODUCTS  SearchRequest = "PRODUCTS"
    SearchRequestVIDEO     SearchRequest = "VIDEO"
)

// IsValid has to be called everywhere input happens, or you risk bad data - no guarantees
func (sr SearchRequest) IsValid() bool {
    switch sr {
        case SearchRequestUNIVERSAL, SearchRequestWEB...:
            return true
    }
    return false
}

์–ธ์–ด ์ง€์›์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ณด์ผ์ง€

enum SearchRequest int {
    0 // UNIVERSAL
    1 // WEB
    2 // IMAGES
    3 // LOCAL
    4 // NEWS
    5 // PRODUCTS
    6 // VIDEO
}

enum SearchRequest string {
    "UNIVERSAL"
    "WEB"
    "IMAGES"
    "LOCAL"
    "NEWS"
    "PRODUCTS"
    "VIDEO"
}

์ด ํŒจํ„ด์€ ํŠน์ˆ˜ ์ผ€์ด์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•  ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์ผ๋ฐ˜์ ์ด๋ฉฐ ์ฝ”๋“œ๋ฅผ ๋” ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ตฌํ˜„ ๊ณ„์ธต์—์„œ ๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ๋ฅผ ์ปดํŒŒ์ผ ํƒ€์ž„์— ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ์ผ๋ถ€๋Š” ์ด๋ฏธ ์˜ค๋Š˜๋‚  ๋ฐœ์ƒํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ์ƒ๋‹นํ•œ ์ ˆ์ถฉ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ๋‚ด๋ณด๋‚ธ ์œ ํ˜•์— ๋Œ€ํ•œ ์•ˆ์ „ : ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ SearchRequest(99) ๋˜๋Š” SearchRequest("MOBILEAPP") ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์—๋Š” ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด๋ณด๋‚ด์ง€ ์•Š์€ ์œ ํ˜•์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ํฌํ•จ๋˜์ง€๋งŒ ๊ฒฐ๊ณผ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉ/๋ฌธ์„œํ™”ํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์›Œ์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
  • ๋Ÿฐํƒ€์ž„ ์•ˆ์ „์„ฑ : protobuf๊ฐ€ ๋น„์ •๋ ฌํ™”ํ•˜๋Š” ๋™์•ˆ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์—ด๊ฑฐํ˜•์ด ์ธ์Šคํ„ด์Šคํ™”๋  ๋•Œ๋งˆ๋‹ค ์–ธ์–ด ์ „์ฒด์— ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋„๊ตฌ/๋ฌธ์„œ : ์˜ค๋Š˜๋‚  ๋งŽ์€ ํŒจํ‚ค์ง€๊ฐ€ ํ•„๋“œ ์ฃผ์„์— ์œ ํšจํ•œ ์˜ต์…˜์„ ๋„ฃ์ง€๋งŒ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ ์ฃผ์„์ด ๊ตฌ์‹์ด๋ผ๋Š” ๋ณด์žฅ๋„ ์—†์Šต๋‹ˆ๋‹ค.

๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ

  • Nil : ์œ ํ˜• ์‹œ์Šคํ…œ ์œ„์— enum ๋ฅผ ๊ตฌํ˜„ํ•จ์œผ๋กœ์จ ์ด๊ฒƒ์ด ํŠน๋ณ„ํ•œ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ nil ๊ฐ€ ์œ ํšจํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋ฉด ์—ด๊ฑฐํ˜•์„ ํฌ์ธํ„ฐ๋กœ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ๊ฐ’ / ๋Ÿฐํƒ€์ž„ ํ• ๋‹น : ์ด๊ฒƒ์€ ๋” ์–ด๋ ค์šด ๊ฒฐ์ • ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. Go ๊ธฐ๋ณธ๊ฐ’์ด ์œ ํšจํ•œ ์—ด๊ฑฐํ˜•์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ? ์ •์  ๋ถ„์„์€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์ด ์ค‘ ์ผ๋ถ€๋ฅผ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์™ธ๋ถ€ ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ๊ฐ•ํ•œ ์˜๊ฒฌ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ž˜ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๊ณ  ์ƒํƒœ๊ณ„์— ๊ธ์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

Go2 LanguageChange NeedsInvestigation Proposal

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@md2perpe ์—ด๊ฑฐํ˜•์ด ์•„๋‹™๋‹ˆ๋‹ค.

  1. ์—ด๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  2. ์œ ์šฉํ•œ ๋ฌธ์ž์—ด ํ‘œํ˜„์ด ์—†์Šต๋‹ˆ๋‹ค.
  3. ๊ทธ๋“ค์€ ์ •์ฒด์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค:

```๊ฐ€๋‹ค
ํŒจํ‚ค์ง€ ๋ฉ”์ธ

์ˆ˜์ž…(
"fmt"
)

ํ•จ์ˆ˜ ๋ฉ”์ธ() {
์œ ํ˜• SearchRequest ์ •์ˆ˜
์ƒ์ˆ˜ (
๋ฒ”์šฉ ๊ฒ€์ƒ‰ ์š”์ฒญ = iota
ํŽธ๋ฌผ
)

const (
    Another SearchRequest = iota
    Foo
)

fmt.Println("Should be false: ", (Web == Foo))
    // Prints: "Should be false:  true"

}
````

Go๊ฐ€ ์ผ๋ฅ˜ ์‹œ๋ฏผ์œผ๋กœ์„œ ์ผ๋ถ€ ์—ด๊ฑฐํ˜•์ด ํ•„์š”ํ•˜๋‹ค๋Š” @derekperkins ์˜ ๋ง์— ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ์„์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, Go 1 ์œ ๋ฆฌ์ง‘์„ ๋ถ€์ˆ˜์ง€ ์•Š๊ณ  ๋Š” ๊ฐ€๋Šฅํ•  ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  180 ๋Œ“๊ธ€

@derekparker #19412์—์„œ Go2 ์ œ์•ˆ์— ๋Œ€ํ•œ ํ† ๋ก ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜ ์ผ์ฐ ์ฝ์—ˆ์ง€๋งŒ ์œ ํšจํ•œ ์œ ํ˜• ๊ฐ’์— ์ค‘์ ์„ ๋‘” ์œ ํšจํ•œ ์œ ํ˜•์— ๋” ์ดˆ์ ์„ ๋งž์ถ˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด๊ฒƒ์€ ๊ทธ ์ œ์•ˆ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์˜ค๋Š˜๋‚  Go์— ํฌํ•จ๋  ์ˆ˜ ์žˆ๋Š” ์œ ํ˜• ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๋œ ๊ด‘๋ฒ”์œ„ํ•œ ๋ณ€๊ฒฝ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์—ด๊ฑฐํ˜•์€ ๋ชจ๋“  ์œ ํ˜•์ด ๋™์ผํ•˜๊ณ  ๋ฉ”์„œ๋“œ์— ์˜ํ•ด ๊ฐ๊ฐ์— ์—ฐ๊ฒฐ๋œ ๊ฐ’์ด ์žˆ๋Š” ํ•ฉ๊ณ„ ์œ ํ˜•์˜ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๋” ์ž…๋ ฅํ•ด์•ผ ํ•˜์ง€๋งŒ ํšจ๊ณผ๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ๊ทธ๊ฒƒ์€ ํ•˜๋‚˜ ๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์ด ๋  ๊ฒƒ์ด๋ฉฐ, ํ•ฉ๊ณ„ ์œ ํ˜•์€ ๋” ๋งŽ์€ ๊ทผ๊ฑฐ๋ฅผ ๋‹ค๋ฃจ๋ฉฐ ํ•ฉ๊ณ„ ์œ ํ˜•์กฐ์ฐจ๋„ ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค. Go1 ํ˜ธํ™˜์„ฑ ๊ณ„์•ฝ์œผ๋กœ ์ธํ•ด Go2๊นŒ์ง€๋Š” ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ด๋Ÿฌํ•œ ์ œ์•ˆ์—๋Š” ์ตœ์†Œํ•œ ์ƒˆ ํ‚ค์›Œ๋“œ๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ถฉ๋ถ„ํžˆ ๊ณตํ‰ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ์ œ์•ˆ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ํ˜ธํ™˜์„ฑ ๊ณ„์•ฝ์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ฉ๊ณ„ ์œ ํ˜•์ด Go1์— ์ถ”๊ฐ€ํ•˜๊ธฐ์—๋Š” "๋„ˆ๋ฌด ํฝ๋‹ˆ๋‹ค"๋ผ๋Š” ์˜๊ฒฌ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด ์ œ์•ˆ์€ Go2์—์„œ ์ „์ฒด ๊ธˆ์•ก ์œ ํ˜•์œผ๋กœ ๊ฐ€๋Š” ๋””๋”ค๋Œ์ด ๋  ์ˆ˜ ์žˆ๋Š” ๊ท€์ค‘ํ•œ ์ค‘๊ฐ„ ์ง€์ ์ž…๋‹ˆ๋‹ค.

๋‘˜ ๋‹ค ์‹๋ณ„์ž๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํšจํ•œ Go1 ์ฝ”๋“œ๋ฅผ ๊นจ๋œจ๋ฆด ์ƒˆ ํ‚ค์›Œ๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ•ด๊ฒฐ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

์ƒˆ๋กœ์šด ์–ธ์–ด ๊ธฐ๋Šฅ์—๋Š” ๋งค๋ ฅ์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์–ธ์–ด ๊ธฐ๋Šฅ์€ ์œ ์šฉํ•˜๊ฑฐ๋‚˜ ์•„๋ฌด๋„ ์ œ์•ˆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์–ธ์–ด๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ƒˆ๋กœ์šด ๊ฐœ๋…์„ ๋ฐฐ์šฐ๋„๋ก ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์„ ์ •๋‹นํ™”ํ•  ๋งŒํผ ์œ ์šฉํ•ฉ๋‹ˆ๊นŒ? ์—ฌ๊ธฐ์„œ ๋งค๋ ฅ์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์‚ฌ๋žŒ๋“ค์€ ์ด๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ• ๊นŒ์š”? ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ๋žŒ๋“ค์€ ์œ ํšจํ•œ ์—ด๊ฑฐํ˜• ๊ฐ’ ์ง‘ํ•ฉ์„ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ด ์ œ์•ˆ์ด ์ผ๋ถ€ ์Šค์œ„์น˜์— ๊ธฐ๋ณธ ์ผ€์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ ์ด์ƒ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๊นŒ?

ํ˜„์žฌ Go์—์„œ ์—ด๊ฑฐํ˜•์„ ์ž‘์„ฑํ•˜๋Š” ๊ด€์šฉ์  ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

type SearchRequest int

const (
    Universal SearchRequest = iota
    Web
    Images
    Local
    News
    Products
    Video
)

์ด๊ฒƒ์€ OR:ed(์—ฐ์‚ฐ์ž | ์‚ฌ์šฉ)ํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

type SearchRequest int

const (
    Universal SearchRequest = 1 << iota
    Web
    Images
    Local
    News
    Products
    Video
)

enum ํ‚ค์›Œ๋“œ๋ฅผ ๋„์ž…ํ•˜๋ฉด ํ›จ์”ฌ ๋” ์งง์•„์งˆ ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@md2perpe ์—ด๊ฑฐํ˜•์ด ์•„๋‹™๋‹ˆ๋‹ค.

  1. ์—ด๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  2. ์œ ์šฉํ•œ ๋ฌธ์ž์—ด ํ‘œํ˜„์ด ์—†์Šต๋‹ˆ๋‹ค.
  3. ๊ทธ๋“ค์€ ์ •์ฒด์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค:

```๊ฐ€๋‹ค
ํŒจํ‚ค์ง€ ๋ฉ”์ธ

์ˆ˜์ž…(
"fmt"
)

ํ•จ์ˆ˜ ๋ฉ”์ธ() {
์œ ํ˜• SearchRequest ์ •์ˆ˜
์ƒ์ˆ˜ (
๋ฒ”์šฉ ๊ฒ€์ƒ‰ ์š”์ฒญ = iota
ํŽธ๋ฌผ
)

const (
    Another SearchRequest = iota
    Foo
)

fmt.Println("Should be false: ", (Web == Foo))
    // Prints: "Should be false:  true"

}
````

Go๊ฐ€ ์ผ๋ฅ˜ ์‹œ๋ฏผ์œผ๋กœ์„œ ์ผ๋ถ€ ์—ด๊ฑฐํ˜•์ด ํ•„์š”ํ•˜๋‹ค๋Š” @derekperkins ์˜ ๋ง์— ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ์„์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, Go 1 ์œ ๋ฆฌ์ง‘์„ ๋ถ€์ˆ˜์ง€ ์•Š๊ณ  ๋Š” ๊ฐ€๋Šฅํ•  ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@md2perpe iota ๋Š” ์—ด๊ฑฐํ˜•์— ์ ‘๊ทผํ•˜๋Š” ๋งค์šฐ ์ œํ•œ๋œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ œํ•œ๋œ ์ƒํ™ฉ์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

  1. int ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  2. ์™ธ๋ถ€ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด์ง€ ์•Š๊ณ  ํŒจํ‚ค์ง€ ๋‚ด๋ถ€์—์„œ๋งŒ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์™ธ๋ถ€ ํ”Œ๋ž˜๊ทธ์— ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ž์—ด์ด๋‚˜ ๋‹ค๋ฅธ ์œ ํ˜•์„ ๋‚˜ํƒ€๋‚ด์•ผ ํ•˜๋Š” ์ฆ‰์‹œ iota ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™ธ๋ถ€/๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ‘œํ˜„๊ณผ ์ผ์น˜์‹œํ‚ค๋ ค๋ฉด iota ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์†Œ์Šค ์ฝ”๋“œ์—์„œ ์ˆœ์„œ๋ฅผ ์ง€์ •ํ•˜๊ณ  ์žฌ์ •๋ ฌํ•˜๋ฉด ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‹จ์ˆœํžˆ ์ฝ”๋“œ๋ฅผ ๋” ์งง๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํŽธ์˜์ƒ์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์˜ค๋Š˜๋‚  ์–ธ์–ด๋กœ ์‹œํ–‰ํ•  ์ˆ˜ ์—†๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ํ—ˆ์šฉํ•˜๋Š” ์ œ์•ˆ์ž…๋‹ˆ๋‹ค.

@ianlancetaylor

์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ๋žŒ๋“ค์€ ์œ ํšจํ•œ ์—ด๊ฑฐํ˜• ๊ฐ’ ์ง‘ํ•ฉ์„ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@bep์ด ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๊ฒฌ๊ณ ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต์€ ํ‘œ์ค€ Go ๋ฃจํ”„์ฒ˜๋Ÿผ ๋ณด์ด๊ณ  ์ •์˜๋œ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ˜๋ณต๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

for i, val := range SearchRequest {
...
}

Go์—์„œ iota ์ด์ƒ์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค๋ฉด ๊ทธ ์‹œ์ ์—์„œ ๋Œ€์ˆ˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ์„ ํƒํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ •์˜ ์ˆœ์„œ์— ๋”ฐ๋ฅธ ์ •๋ ฌ์„ ํ™•์žฅํ•˜๊ณ  protobuf์˜ ์˜ˆ๋ฅผ ๋”ฐ๋ฅด๋ฉด ํ•„๋“œ์˜ ๊ธฐ๋ณธ๊ฐ’์€ ์ฒซ ๋ฒˆ์งธ ์ •์˜๋œ ํ•„๋“œ๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@bep ํŽธ๋ฆฌํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๋‹ค์Œ ์†์„ฑ์„ ๋ชจ๋‘ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

package main

var SearchRequests []SearchRequest
type SearchRequest struct{ name string }
func (req SearchRequest) String() string { return req.name }

func Request(name string) SearchRequest {
    req := SearchRequest{name}
    SearchRequests = append(SearchRequests, req)
    return req
}

var (
    Universal = Request("Universal")
    Web       = Request("Web")

    Another = Request("Another")
    Foo     = Request("Foo")
)

func main() {
    fmt.Println("Should be false: ", (Web == Foo))
    fmt.Println("Should be true: ", (Web == Web))
    for i, req := range SearchRequests {
        fmt.Println(i, req)
    }
}

์ปดํŒŒ์ผ ํƒ€์ž„ ์ฒดํฌ๋œ ์—ด๊ฑฐํ˜•์€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” go๊ฐ€ ๋ฐ”๋กœ ์ง€๊ธˆ ์ด๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ถ”๋ก ์€

  • ์ปดํŒŒ์ผ ์‹œ ํ™•์ธ๋œ ์—ด๊ฑฐํ˜•์€ ์ถ”๊ฐ€ ๋˜๋Š” ์ œ๊ฑฐ์˜ ๊ฒฝ์šฐ์— ์—ญ๋ฐฉํ–ฅ ๋˜๋Š” ์ˆœ๋ฐฉํ–ฅ ํ˜ธํ™˜์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. #18130์€ ์ ์ง„์ ์ธ ์ฝ”๋“œ ๋ณต๊ตฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ๋‹นํ•œ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์˜€์Šต๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜•์€ ๊ทธ ๋…ธ๋ ฅ์„ ํŒŒ๊ดดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜• ์ง‘ํ•ฉ์„ ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ๋ชจ๋“  ํŒจํ‚ค์ง€๋Š” ์ž๋™์œผ๋กœ ๋ชจ๋“  ๊ฐ€์ ธ์˜ค๊ธฐ ๋„๊ตฌ๋ฅผ ๊ฐ•์ œ๋กœ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.
  • ์›๋ž˜ ์ฃผ์„์ด ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ protobuf(ํŠน์ • ์ด์œ  ๋•Œ๋ฌธ์—)๋Š” ์‹ค์ œ๋กœ ์—ด๊ฑฐํ˜• ํ•„๋“œ์˜ ์œ ํšจ์„ฑ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. proto2๋Š” enum์— ๋Œ€ํ•œ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ’์„ ์•Œ ์ˆ˜ ์—†๋Š” ํ•„๋“œ๋กœ ์ทจ๊ธ‰ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ง€์ •ํ•˜๊ณ  proto3์€ ์ƒ์„ฑ๋œ ์ฝ”๋“œ๊ฐ€ ์ธ์ฝ”๋”ฉ๋œ ๊ฐ’ ์œผ๋กœ ์ด๋ฅผ ํ‘œํ˜„ํ•  ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค(go๊ฐ€ ํ˜„์žฌ fake-enums์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ๊ฐ™์Šต๋‹ˆ๋‹ค).
  • ๊ฒฐ๊ตญ, ๊ทธ๊ฒƒ์€ ์‹ค์ œ๋กœ ๋งŽ์ด ์ถ”๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ŠคํŠธ๋ง๊ฑฐ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ŠคํŠธ๋งํ™”๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ผํ‹ฐ๋„ฌ MaxValidFoo const๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฐ˜๋ณต์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ์œ„์˜ ์ฃผ์˜ ์‚ฌํ•ญ ์ฐธ์กฐ. ์š”๊ตฌ ์‚ฌํ•ญ์ด ์—†์–ด์•ผ ํ•จ). ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‘ ๊ฐœ์˜ const-decls ๊ฐ€ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ™•์ธํ•˜๋Š” ๋„๊ตฌ๋ฅผ CI์— ํ†ตํ•ฉํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • ๋‚˜๋Š” int ์ด์™ธ์˜ ๋‹ค๋ฅธ ์œ ํ˜•์ด ์‹ค์ œ๋กœ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ŠคํŠธ๋ง๊ฑฐ ๋„๊ตฌ๋Š” ์ด๋ฏธ ์ŠคํŠธ๋ง๊ณผ ์ŠคํŠธ๋ง ๊ฐ„์˜ ๋ณ€ํ™˜์„ ๋‹ค๋ฃจ๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค("string-enum"์— ๋Œ€ํ•œ ๋น„๊ต๊ฐ€ ๋ฐ”์ดํŠธ๋ฅผ ๋ฐ˜๋ณตํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ง„์ง€ํ•˜๊ฒŒ ์ œ์•ˆํ•˜์ง€ ์•Š๋Š” ํ•œ...)

์ „๋ฐ˜์ ์œผ๋กœ ์ €์—๊ฒŒ๋Š” ์—„์ฒญ๋‚œ -1์ž…๋‹ˆ๋‹ค. ์•„๋ฌด๊ฒƒ๋„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ; ์ ๊ทน์ ์œผ๋กœ ์•„ํ”„๋‹ค.

Go์˜ ํ˜„์žฌ ์—ด๊ฑฐํ˜• ๊ตฌํ˜„์€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ  ์ถฉ๋ถ„ํ•œ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๊ฒ€์‚ฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๊ธฐ๋ณธ ํŒจํ„ด ์ผ์น˜๊ฐ€ ์žˆ๋Š” ์ผ์ข…์˜ Rust ์—ด๊ฑฐํ˜•์„ ๊ธฐ๋Œ€ํ•˜์ง€๋งŒ Go1 ๋ณด์ฆ์„ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ด๊ฑฐํ˜•์€ ํ•ฉ๊ณ„ ์œ ํ˜•์˜ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์ด๊ณ  ์ผ๋ฐ˜์ ์ธ ์ง€ํ˜œ๋Š” ํ•ฉ๊ณ„ ์œ ํ˜•์„ ์‹œ๋ฎฌ๋ ˆ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋Œ€๋‹ต์€ ๋ถ„๋ช…ํžˆ https://play.golang.org/p/1BvOakvbj2 ์ž…๋‹ˆ๋‹ค.

(ํ™•์‹คํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ: ์˜ˆ, ๋†๋‹ด์ž…๋‹ˆ๋‹ค. ๊ณ ์ „์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋จธ ๋ฐฉ์‹์—์„œ๋Š” ํ•œ ๋‹จ๊ณ„ ๋” ๋‚˜์•„๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.)

์ง„์ง€ํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด, ์ด ์Šค๋ ˆ๋“œ์—์„œ ๋…ผ์˜๋œ ๊ธฐ๋Šฅ์˜ ๊ฒฝ์šฐ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ๋„๊ตฌ๊ฐ€ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ŠคํŠธ๋ง๊ฑฐ ๋„๊ตฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ "๋ ˆ์ธ์ €" ๋„๊ตฌ๋Š” ์œ„์—์„œ ๋งํฌํ•œ ์ฝ”๋“œ์—์„œ Iter func์— ํ•ด๋‹นํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ์„ ์„ ํ†ตํ•ด ๋” ์‰ฝ๊ฒŒ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก {Binary,Text}{Marshaler,Unmarshaler} ๊ตฌํ˜„์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐ€๋” ์•„์ฃผ ์œ ์šฉํ•  ์ด์™€ ๊ฐ™์€ ์ž‘์€ ๊ฒƒ๋“ค์ด ๋งŽ์ด ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜๋œ ํ•ฉ๊ณ„ ์œ ํ˜•์˜ ์ฒ ์ €ํ•œ ๊ฒ€์‚ฌ๋ฅผ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ฒ€์‚ฌ/๋ฆฐํ„ฐ ๋„๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ€์ด์Šค๊ฐ€ ๋ˆ„๋ฝ๋˜๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ํ˜•์‹ํ™”๋˜์ง€ ์•Š์€ ์ƒ์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์•Œ๋ ค์ฃผ๋Š” iota ์—ด๊ฑฐํ˜•์— ๋Œ€ํ•œ ๊ฒƒ์ด ์—†์„ ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค(์•„๋งˆ๋„ 0 ์ด์™ธ์˜ ๋‹ค๋ฅธ ๊ฐ’์„ ๋ณด๊ณ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?).

์–ธ์–ด ๋ณ€๊ฒฝ ์—†์ด๋„ ๊ฐœ์„ ์˜ ์—ฌ์ง€๊ฐ€ ๋ถ„๋ช…ํžˆ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ด๊ฑฐํ˜•์€ ์ด๋ฏธ ํ™•๋ฆฝ๋œ ์œ ํ˜• ์‹œ์Šคํ…œ์„ ๋ณด์™„ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์˜ ๋งŽ์€ ์˜ˆ์—์„œ ๋ณด์—ฌ์ฃผ๋“ฏ์ด ์—ด๊ฑฐํ˜•์˜ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ด๋ฏธ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ฑ„๋„์ด ๋” ๋งŽ์€ ๊ธฐ๋ณธ ์œ ํ˜•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋†’์€ ์ˆ˜์ค€์˜ ์ถ”์ƒํ™”์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์—ด๊ฑฐํ˜•๋„ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋นŒ๋“œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ธ๊ฐ„์€ ์˜ค๋งŒํ•˜๊ณ  ์„œํˆฌ๋ฅด๋ฉฐ ๊ฑด๋ง์ฆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜•๊ณผ ๊ฐ™์€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์ธ๊ฐ„ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์˜ค๋ฅ˜๋ฅผ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

@bep ๋‚˜๋Š” ๋‹น์‹ ์˜ ์„ธ ๊ฐ€์ง€ ์š”์ ์— ๋ชจ๋‘ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Go ๊ด€์šฉ์  ์—ด๊ฑฐํ˜•์€ ์œ ํšจํ•œ ๊ฐ’์˜ ๋ฐ˜๋ณต์ด ์—†๊ณ  ๋ฌธ์ž์—ด๋กœ์˜ ์ž๋™ ๋ณ€ํ™˜์ด ์—†์œผ๋ฉฐ ๋ฐ˜๋“œ์‹œ ๊ณ ์œ ํ•œ ID๋ฅผ ๊ฐ–์ง€ ์•Š๋Š” C ์—ด๊ฑฐํ˜•๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ณต์€ ์žˆ์œผ๋ฉด ์ข‹์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋ฐ˜๋ณต์„ ์›ํ•  ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ ๊ฐ’๊ณผ ๋งˆ์ง€๋ง‰ ๊ฐ’์— ๋Œ€ํ•ด ์ƒ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. iota ๋Š” ์ž๋™์œผ๋กœ ๋งˆ์ง€๋ง‰ ๊ฐ’์„ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ ๊ฐ’์„ ์ถ”๊ฐ€ํ•  ๋•Œ ์—…๋ฐ์ดํŠธํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ธ์–ด ์ง€์›์ด ์˜๋ฏธ ์žˆ๋Š” ์ฐจ์ด๋ฅผ ๋งŒ๋“œ๋Š” ์ƒํ™ฉ์€ ์—ด๊ฑฐํ˜• ๊ฐ’์ด ์—ฐ์†์ ์ด์ง€ ์•Š์€ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด๋กœ์˜ ์ž๋™ ๋ณ€ํ™˜์€ ์ž‘์€ ๊ฐ’์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ์ด ์ œ์•ˆ์—์„œ ๋ฌธ์ž์—ด ๊ฐ’์€ int ๊ฐ’์— ํ•ด๋‹นํ•˜๋„๋ก ์ž‘์„ฑ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ์ง์ ‘ ๋ฌธ์ž์—ด ๊ฐ’ ๋ฐฐ์—ด์„ ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ œ์•ˆ์—์„œ๋Š” ๋” ๋งŽ์€ ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ณ€์ˆ˜ ์ด๋ฆ„์ด ๋ฌธ์ž์—ด ํ‘œํ˜„๊ณผ ์ผ์น˜ํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์—๋„ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, ๊ณ ์œ ํ•œ ์ •์ฒด์„ฑ์€ ์ „ํ˜€ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ธ์ง€ ํ™•์‹ ์ด ์„œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜•์€ Haskell๊ณผ ๊ฐ™์€ ํ•ฉ๊ณ„ ์œ ํ˜•์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์ด๋ฆ„์ด ์ง€์ •๋œ ์ˆซ์ž์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์—ด๊ฑฐํ˜•์„ ํ”Œ๋ž˜๊ทธ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ReadWriteMode = ReadMode | WriteMode ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ  ์ด๊ฒƒ์€ ์œ ์šฉํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด DefaultMode = ReadMode ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฐฉ๋ฒ•์œผ๋กœ๋„ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ const DefaultMode = ReadMode ๋ฅผ ์“ฐ๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ์„ ์–ธ์—์„œ ๋ฐœ์ƒํ•˜๋„๋ก ์š”๊ตฌํ•˜๋Š” ๋ฐ ์–ด๋–ค ๋ชฉ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@bep ๋‚˜๋Š” ๋‹น์‹ ์˜ ์„ธ ๊ฐ€์ง€ ์š”์ ์— ๋ชจ๋‘ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Go ๊ด€์šฉ์  ์—ด๊ฑฐํ˜•์€ ์œ ํšจํ•œ ๊ฐ’์˜ ๋ฐ˜๋ณต์ด ์—†๊ณ  ๋ฌธ์ž์—ด๋กœ์˜ ์ž๋™ ๋ณ€ํ™˜์ด ์—†์œผ๋ฉฐ ๋ฐ˜๋“œ์‹œ ๊ณ ์œ ํ•œ ID๋ฅผ ๊ฐ–์ง€ ์•Š๋Š” C ์—ด๊ฑฐํ˜•๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@alercah , ์ด idomatic Go ๋ฅผ "์Šน๋ฆฌ์ ์ธ ๋…ผ์Ÿ"์œผ๋กœ ๋…ผ์˜์— ๋Œ์–ด๋“ค์ด์ง€ ๋งˆ์‹ญ์‹œ์˜ค. Go์—๋Š” ๋‚ด์žฅ๋œ Enum์ด ์—†์œผ๋ฏ€๋กœ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ผ๋ถ€ idom์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

Go๋Š” ๋” ๋‚˜์€ C/C++ ๋˜๋Š” ๋œ ์žฅํ™ฉํ•œ Java ๋กœ ์ œ์ž‘๋˜์—ˆ์œผ๋ฏ€๋กœ ํ›„์ž์™€ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด ๋” ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Java์—๋Š” Enum type ๊ฐ€ ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค("Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์—ด๊ฑฐํ˜• ์œ ํ˜•์€ ๋‹ค๋ฅธ ์–ธ์–ด์˜ ์—ด๊ฑฐํ˜• ์œ ํ˜•๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค. "): https://docs.oracle.com/javase/tutorial/java /javaOO/enum.html

๊ทธ๋ฆฌ๊ณ  "ํ›จ์”ฌ ๋” ๊ฐ•๋ ฅํ•œ ๋ถ€๋ถ„"์— ๋™์˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ Java Enum ์œ ํ˜•์—๋Š” ๋‚ด๊ฐ€ ์–ธ๊ธ‰ํ•œ ์„ธ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์ด ๋ชจ๋‘ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” Go๊ฐ€ ๋” ๊ฐ€๋ณ๊ณ  ๋‹จ์ˆœํ•˜๋‹ค๋Š” ์ฃผ์žฅ์— ๊ฐ์‚ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๋ฐฉ์‹์„ ์œ ์ง€ํ•˜๋ ค๋ฉด ์•ฝ๊ฐ„์˜ ํƒ€ํ˜‘์ด ํ•„์š”ํ•˜๋ฉฐ, ์ด ์Šค๋ ˆ๋“œ์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ํ•ดํ‚น ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋ณด์•˜์ง€๋งŒ iota int๋งŒ์œผ๋กœ๋Š” ์—ด๊ฑฐํ˜•์„ ๋งŒ๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์—ด๊ฑฐ ๋ฐ ์ž๋™ ๋ฌธ์ž์—ด ๋ณ€ํ™˜์€ '์ƒ์„ฑ ์ด๋™' ๊ธฐ๋Šฅ์˜ ์ข‹์€ ํ›„๋ณด์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๋ช‡ ๊ฐ€์ง€ ์†”๋ฃจ์…˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Java ์—ด๊ฑฐํ˜•์€ ๊ณ ์ „์ ์ธ ์—ด๊ฑฐํ˜•๊ณผ ํ•ฉ๊ณ„ ์œ ํ˜•์˜ ์ค‘๊ฐ„์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ œ ์ƒ๊ฐ์—๋Š” ๋‚˜์œ ์–ธ์–ด ๋””์ž์ธ์ž…๋‹ˆ๋‹ค.
๊ด€์šฉ์ ์ธ Go์˜ ํ•ต์‹ฌ์€ X ์–ธ์–ด์—์„œ Y ์–ธ์–ด๋กœ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๋ณต์‚ฌํ•ด์•ผ ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ์ด์œ ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ์ต์ˆ™ํ•˜๋‹ค๋Š” ์ด์œ  ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์—ด๊ฑฐํ˜• ์œ ํ˜•์€ ๋‹ค๋ฅธ ์–ธ์–ด์˜ ์—ด๊ฑฐํ˜•๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ 10๋…„ ์ „์— ์‚ฌ์‹ค์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํ•ฉ๊ณ„ ์œ ํ˜• ๋ฐ ํŒจํ„ด ์ผ์น˜๋กœ ๊ตฌ๋™๋˜๋Š” Rust์˜ Option์˜ ์ตœ์‹  ์ œ๋กœ ๋น„์šฉ ๊ตฌํ˜„์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๊ด€์šฉ์ ์ธ Go์˜ ํ•ต์‹ฌ์€ X ์–ธ์–ด์—์„œ Y ์–ธ์–ด๋กœ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๋ณต์‚ฌํ•ด์•ผ ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ์ด์œ ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ์ต์ˆ™ํ•˜๋‹ค๋Š” ์ด์œ  ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ๊ธฐ์— ์ฃผ์–ด์ง„ ๊ฒฐ๋ก ์— ๊ทธ๋‹ค์ง€ ๋™์˜ํ•˜์ง€ ์•Š์ง€๋งŒ _ ๊ด€์šฉ์  ๋ฐ”๋‘‘_์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฐ”๋‘‘์„ ์˜ˆ์ˆ ์ ์ธ ๋ฐ›์นจ๋Œ€ ์œ„์— ์˜ฌ๋ ค๋†“๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์†Œํ”„ํŠธ์›จ์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ƒ๋‹นํžˆ ์ง€๋ฃจํ•˜๊ณ  ์‹ค์šฉ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ข…์ข… ๋“œ๋กญ๋‹ค์šด ์ƒ์ž๋ฅผ ์—ด๊ฑฐํ˜•์œผ๋กœ ์ฑ„์›Œ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

//go:generate enumerator Foo,Bar
ํ•œ ๋ฒˆ ์ž‘์„ฑํ•˜๋ฉด ๋ชจ๋“  ๊ณณ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ๋Š” ์ถ”์ƒ์ ์ž„์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.

@bep ์›๋ž˜ ๋Œ“๊ธ€์„ ์ž˜๋ชป ์ฝ์œผ์‹  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. "Go idiomatic enums"๋Š” Foo int + const-decl + iota ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ํ˜„์žฌ ๊ตฌ์„ฑ์„ ์ฐธ์กฐํ•ด์•ผ ํ•˜๋ฉฐ, "์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ด ๊ด€์šฉ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

@rsc Go2 ๋ ˆ์ด๋ธ”๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ด๋Š” ์ด ์ œ์•ˆ์„ ์ œ์ถœํ•œ ์ œ ์ถ”๋ก ์— ์–ด๊ธ‹๋‚ฉ๋‹ˆ๋‹ค. #19412๋Š” ์ „์ฒด ํ•ฉ๊ณ„ ์œ ํ˜• ์ œ์•ˆ์œผ๋กœ, ์—ฌ๊ธฐ์—์„œ ๋‚ด ๊ฐ„๋‹จํ•œ ์—ด๊ฑฐํ˜• ์ œ์•ˆ๋ณด๋‹ค ๋” ๊ฐ•๋ ฅํ•œ ์ƒ์œ„ ์ง‘ํ•ฉ์ด๋ฉฐ Go2์—์„œ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ด€์ ์—์„œ ๋ณผ ๋•Œ ํ–ฅํ›„ 5๋…„ ๋‚ด์— Go2๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์€ ํฌ๋ฐ•ํ•˜๊ณ  ๋” ์งง์€ ์‹œ๊ฐ„ ๋‚ด์— ๋ฌด์–ธ๊ฐ€๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์˜ˆ์•ฝ ํ‚ค์›Œ๋“œ enum ์— ๋Œ€ํ•œ ์ œ ์ œ์•ˆ์ด BC์—์„œ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์™„์ „ํ•œ ์–ธ์–ด ํ†ตํ•ฉ์ด๋“  go vet ์— ๋‚ด์žฅ๋œ ๋„๊ตฌ๋“  ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์— ๋งํ–ˆ๋“ฏ์ด ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด์„œ๋Š” ํŠน๋ณ„ํžˆ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์ง€๋งŒ ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ƒ๋‹นํ•œ ์ธ์ง€ ๋ถ€๋‹ด์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด์„œ ์˜ค๋Š˜๋‚  Go์— ๊ฐ€์น˜ ์žˆ๋Š” ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ๊ตณ๊ฒŒ ๋ฏฟ์Šต๋‹ˆ๋‹ค.

Go 2 ์ด์ „์—๋Š” ์ƒˆ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Go 1 ํ˜ธํ™˜์„ฑ ๋ณด์žฅ์— ๋Œ€ํ•œ ๋ช…๋ฐฑํ•œ ์œ„๋ฐ˜์ž…๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ, ๋‚˜๋Š” ์•„์ง ์—ด๊ฑฐํ˜•์— ๋Œ€ํ•œ ์„ค๋“๋ ฅ ์žˆ๋Š” ์ฃผ์žฅ์„ ๋ณด์ง€ ๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ฌธ์ œ์— ๊ด€ํ•ด์„œ๋Š” Go 2์˜ ๊ฒฝ์šฐ์—๋„ ํ•ฉ๊ณ„ ์œ ํ˜•์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ผ์–ด๋‚  ์ˆ˜ ์—†๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Go ์–ธ์–ด์˜ ๋ชฉํ‘œ ์ค‘ ํ•˜๋‚˜๋Š” ์–ธ์–ด์˜ ๋‹จ์ˆœ์„ฑ์ž…๋‹ˆ๋‹ค. ์–ธ์–ด ๊ธฐ๋Šฅ์ด ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์–ธ์–ด ๊ธฐ๋Šฅ์€ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์œ ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์•„๋ฌด๋„ ์ œ์•ˆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Go์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๊ธฐ๋Šฅ์— ์–ธ์–ด๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ๋งŒํผ ์ถฉ๋ถ„ํžˆ ๋งค๋ ฅ์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋งค๋ ฅ์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์ ์–ด๋„ ์ง€๊ธˆ์€ ํฐ ์–ด์ƒ‰ํ•จ์ด ์—†์ด๋Š” ๊ธฐ๋Šฅ ์—†์ด๋Š” ์ž‘์„ฑํ•  ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

Go์—์„œ ์—ด๊ฑฐํ˜•์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ œํ•œ๋œ ์ˆ˜์˜ ์œ ํšจํ•œ ์ž…๋ ฅ์ด ์žˆ๋Š” ๋…ธ์ถœ๋œ API(๋˜๋Š” ๋‚ด ์•ฑ ์™ธ๋ถ€์˜ ์ œํ•œ๋œ API๋กœ ์ž‘์—…)๋ฅผ ์ œํ•œํ•˜๊ณ  ์‹ถ์€ ์ž์‹ ์„ ๋Š์ž„์—†์ด ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ์ด๊ฒƒ์€ ์—ด๊ฑฐ ํ˜•์„์œ„ํ•œ ์™„๋ฒฝํ•œ ์žฅ์†Œ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ผ์ข…์˜ RPC ์Šคํƒ€์ผ API์— ์—ฐ๊ฒฐํ•˜๊ณ  ์ง€์ •๋œ ์ž‘์—…/์ž‘๋™ ์ฝ”๋“œ ์ง‘ํ•ฉ์ด ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ ์•ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด const ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€(์ €๋ฅผ ํฌํ•จํ•˜์—ฌ!)๊ฐ€ ์ž˜๋ชป๋œ ์ฝ”๋“œ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ๋™์ผํ•œ API์— ๋Œ€ํ•ด ์„œ๋ฒ„ ์ธก์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ์—ด๊ฑฐํ˜•์— switch ๋ฌธ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ ์˜ค๋ฅ˜(๋˜๋Š” ์ ์–ด๋„ ์ผ๋ถ€ go vet ๊ฒฝ๊ณ ) ์—ด๊ฑฐํ˜•์˜ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ๊ฐ’์ด ํ™•์ธ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ(๋˜๋Š” ์ตœ์†Œํ•œ default: ์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ).

๋‚˜๋Š” ์ด๊ฒƒ์ด (์—ด๊ฑฐํ˜•) Swift ๊ฐ€ ์ •๋ง๋กœ ์˜ณ์•˜ ๋˜ ์˜์—ญ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ผ์ข…์˜ RPC ์Šคํƒ€์ผ API์— ์—ฐ๊ฒฐํ•˜๊ณ  ์ง€์ •๋œ ์ž‘์—…/์ž‘๋™ ์ฝ”๋“œ ์ง‘ํ•ฉ์ด ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ ์•ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด const๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€(์ €๋ฅผ ํฌํ•จํ•˜์—ฌ!)๊ฐ€ ์ž˜๋ชป๋œ ์ฝ”๋“œ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.

์—ด๊ฑฐํ˜•์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์€ ๋”์ฐํ•œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐ‘์ž๊ธฐ RPC๊ฐ€ ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ๋กค๋ฐฑ ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์—†๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์ œ ์ƒˆ ์—ด๊ฑฐํ˜• ๊ฐ’์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. proto3 ์—์„œ ์ƒ์„ฑ๋œ ์—ด๊ฑฐํ˜• ์ฝ”๋“œ๊ฐ€ "์•Œ ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ" ๊ฐ’์„ ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ์ด๊ฒƒ์ด ๊ณ ํ†ต์„ ํ†ตํ•ด ๋ฐฐ์šด ๊ตํ›ˆ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค( proto2 ๊ฐ€ ์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•œ ๋ฐฉ๋ฒ•๊ณผ ๋น„๊ตํ•˜๋ฉด ๋” ์ข‹์ง€๋งŒ ์—ฌ์ „ํžˆ ๋งค์šฐ ๋‚˜์จ). ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ด ๊ฒฝ์šฐ๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

@Merovius ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ์กด์ค‘ํ•˜์ง€๋งŒ ์ •์ค‘ํ•˜๊ฒŒ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ ํšจํ•œ ๊ฐ’๋งŒ ์‚ฌ์šฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ์—ด๊ฑฐํ˜•์˜ ์ฃผ์š” ์šฉ๋„ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

์—ด๊ฑฐํ˜•์€ ๋ชจ๋“  ์ƒํ™ฉ์— ์ ํ•ฉํ•˜์ง€ ์•Š์ง€๋งŒ ์ผ๋ถ€ ์ƒํ™ฉ์—๋Š” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค! ์ ์ ˆํ•œ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋ฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ƒํ™ฉ์—์„œ ์ƒˆ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

uh-oh ์ƒํƒœ์˜ ์™ธ๋ถ€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ๋‹น์—ฐํžˆ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.

์—ด๊ฑฐํ˜•(๋˜๋Š” ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ด๊ณ  ์œ ์šฉํ•œ ํ•ฉ๊ณ„ ์œ ํ˜•)์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๊ฐ•์ œ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ํ•ฉ๊ณ„/์—ด๊ฑฐํ˜•์— ๋ช…์‹œ์  "์•Œ ์ˆ˜ ์—†๋Š”" ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋กํ•˜๊ณ  ๋‹ค์Œ ์š”์ฒญ์œผ๋กœ ์ด๋™).

์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” X ์ผ€์ด์Šค๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์„ ๋•Œ ํ•ฉ๊ณ„ ์œ ํ˜•์ด ํ”„๋กœ์„ธ์Šค ๋‚ด๋ถ€์— ๋” ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์ž‘์€ X์˜ ๊ฒฝ์šฐ ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ต์ง€ ์•Š์ง€๋งŒ ํฐ X์˜ ๊ฒฝ์šฐ ํŠนํžˆ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ €์—๊ฒŒ ์†Œ๋ฆฌ๋ฅผ ์ง€๋ฅด๋Š” ๊ฒƒ์— ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

API ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋” ์ ๊ณ  ํ™•์žฅ์„ฑ ์ธก๋ฉด์—์„œ ํ•ญ์ƒ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด์•ผ ํ•˜์ง€๋งŒ AST ๋˜๋Š” "day of ์ด ์‹œ์ ์—์„œ ๋ฒ”์œ„๊ฐ€ ๊ฑฐ์˜ ํ™•์ •๋˜๋Š” ์ฃผ" ๊ฐ’์ž…๋‹ˆ๋‹ค(์บ˜๋ฆฐ๋” ์‹œ์Šคํ…œ ์„ ํƒ๊นŒ์ง€).

@jimmyfrasche ์š”์ผ์„ ์•Œ๋ ค๋“œ๋ฆด ์ˆ˜๋Š” ์žˆ์ง€๋งŒ AST๋Š” ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ๋ฒ•์€ ์ง„ํ™”ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒƒ์ด ๋‚ด์ผ์€ ์™„์ „ํžˆ ์œ ํšจํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์—๋Š” AST์— ์ƒˆ๋กœ์šด ๋…ธ๋“œ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ ๊ฒ€์‚ฌ ํ•ฉ๊ณ„ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ์† ์—†์ด๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์™œ ์ด๊ฒƒ์ด ์ˆ˜์˜์‚ฌ ๊ฒ€์ง„์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฒ ์ €ํ•œ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์™„๋ฒฝํ•˜๊ฒŒ ์ ํ•ฉํ•œ ์ •์  ๊ฒ€์‚ฌ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์ ์ง„์ ์ธ ์ˆ˜๋ฆฌ ๊ฐ€๋Šฅ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„ API์šฉ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ธ์ˆ˜ ๋ฐ ๋ฐ˜ํ™˜ ๊ฐ’์€ API์˜ ์—ด๊ฑฐํ˜•์ž…๋‹ˆ๋‹ค. ์ด 45๊ฐœ์˜ ์—ด๊ฑฐํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Go์—์„œ ์—ด๊ฑฐํ˜• ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ์—ด๊ฑฐํ˜• ์œ ํ˜•์— ๋Œ€ํ•œ ์ผ๋ถ€ ๊ฐ’์ด ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ œ ๊ฒฝ์šฐ์—๋Š” ์‹คํ˜„ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์—์„œ Destroy ๊ฐ€ ๋‘ ๋ฒˆ ๋‚˜ํƒ€๋‚˜๋ฏ€๋กœ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ Destroy redeclared in this block ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

type TaskAllowedOperations int
const (
    _ TaskAllowedOperations = iota
    Cancel
    Destroy
)

type OnNormalExit int
const (
    _ OnNormalExit = iota
    Destroy
    Restart
)

๋”ฐ๋ผ์„œ ๋‚˜๋Š” ๋‹ค๋ฅธ ํ‘œํ˜„์„ ์ƒ๊ฐํ•ด ๋‚ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” IDE๊ฐ€ ์ฃผ์–ด์ง„ ์œ ํ˜•์— ๋Œ€ํ•ด ๊ฐ€๋Šฅํ•œ ๊ฐ’์„ ํ‘œ์‹œํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์šฉ์ž๊ฐ€ ๋” ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Go์—์„œ ์ผ๊ธ‰ ์‹œ๋ฏผ์œผ๋กœ enum์„ ๊ฐ–๋Š” ๊ฒƒ์€ ๊ทธ๊ฒƒ์„ ๋งŒ์กฑ์‹œํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@kongslund ์™„๋ฒฝํ•œ ๊ตฌํ˜„์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๊ท€ํ•˜๊ฐ€ ๊ด€์‹ฌ์„ ๊ฐ€์งˆ ๋งŒํ•œ ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ์„ ์–ธ ์œ„์˜ ์ฃผ์„์—์„œ ์—ด๊ฑฐํ˜•์„ ์„ ์–ธํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋‚˜๋จธ์ง€๋Š” ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

// ENUM(_, Cancel, Destroy)
type TaskAllowedOperations int

// ENUM(_, Destroy, Restart)
type OnNormalExit int

์ƒ์„ฑํ•  ๊ฒƒ์ด๋‹ค

const(
  _ TaskAllowedOperations = iota
  TaskAllowedOperationsCancel
  TaskAllowedOperationsDestroy
)

const(
  _ OnNormalExit = iota
  OnNormalExitDestroy
  OnNormalExitRestart
)

๋” ๋‚˜์€ ๋ถ€๋ถ„์€ ์ ‘๋‘์‚ฌ๋ฅผ ์ œ์™ธํ•˜๋Š” String() ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ "Destroy" ๋ฅผ TaskAllowedOperations ๋˜๋Š” OnNormalExit ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

https://github.com/abice/go-enum

์ด์ œ ํ”Œ๋Ÿฌ๊ทธ๊ฐ€ ๋น ์ ธ์„œ...

๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ enum์ด go ์–ธ์–ด์˜ ์ผ๋ถ€๋กœ ํฌํ•จ๋˜์ง€ ์•Š์€ ๊ฒƒ์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‚˜์˜ ์›๋ž˜ ๋Š๋‚Œ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ฒ˜์Œ ๊ฐ”์„ ๋•Œ ์™œ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ ์„ ํƒ์„ ํ–ˆ๋Š”์ง€์— ๋Œ€ํ•ด ์ข…์ข… ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๋ฐ˜์‘์„ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•œ ํ›„์—๋Š” ๊ทธ ์–ธ์–ด๊ฐ€ ๊ณ ์ˆ˜ํ•˜๋Š” ๋‹จ์ˆœํ•จ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ข‹์œผ๋ฉฐ, ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•œ ๊ฒƒ์ด ์žˆ์œผ๋ฉด ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๋„ ์ด๋ฅผ ํ•„์š”๋กœ ํ•˜๊ณ  ํŠน์ • ๋ฌธ์ œ๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ๋ฉ‹์ง„ ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์žฌ๋Ÿ‰์— ๋”ฐ๋ผ ํฌ๋Ÿฌํ”„ํŠธ์˜ ์–‘์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ด ํ† ๋ก ์—์„œ ๋งŽ์€ ์œ ํšจํ•œ ์š”์ ์ด ์ œ๊ธฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€๋Š” ์—ด๊ฑฐํ˜• ์ง€์›์— ์ฐฌ์„ฑํ•˜๊ณ  ๋งŽ์€ ์‚ฌ๋žŒ์€ ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค(์ตœ์†Œํ•œ ์ œ์•ˆ์ด ์ฒ˜์Œ์— "์—ด๊ฑฐํ˜•"์ด ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•ด ๋งํ•œ ํ•œ). ๋‚˜๋ฅผ ์œ„ํ•ด ํŠ€์–ด๋‚˜์˜จ ๋ช‡ ๊ฐ€์ง€:

  • ์†Œ๊ฐœ ์˜ˆ์ œ(์˜ค๋Š˜๋‚  Go์˜ ์—ด๊ฑฐํ˜•)๋Š” ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๊ฑฐ์˜ ์•„๋ฌด๋„ ์†์œผ๋กœ ๊ทธ๋Ÿฐ Go ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ์ œ์•ˆ(์–ธ์–ด ์ง€์›์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€)์€ ์‹ค์ œ๋กœ Go์—์„œ ์ด๋ฏธ ์ˆ˜ํ–‰ํ•œ ์ž‘์—…์— ํ›จ์”ฌ ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

  • @jediorange ๋Š” Swift๊ฐ€ "์ •๋ง๋กœ (์—ด๊ฑฐํ˜•) ์˜ณ์•˜๋‹ค"๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿด ์ˆ˜๋„ ์žˆ์ง€๋งŒ Swift ์—ด๊ฑฐํ˜•์€ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๊ฐœ๋…์„ ํ•จ๊ป˜ ํ˜ผํ•ฉํ•˜๋Š” ๋†€๋ผ์šธ ์ •๋„๋กœ ๋ณต์žกํ•œ ์ง์Šน์ž…๋‹ˆ๋‹ค. Go์—์„œ ์šฐ๋ฆฌ๋Š” ์˜๋„์ ์œผ๋กœ ๋‹ค๋ฅธ ์–ธ์–ด ๊ธฐ๋Šฅ๊ณผ ๊ฒน์น˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ”ผํ•˜๊ณ  ๊ทธ ๋Œ€๊ฐ€๋กœ ๋” ๋งŽ์€ ์ง๊ต์„ฑ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ๊ฒฐ๊ณผ๋Š” ์—ด๊ฑฐํ˜•์ด๋‚˜ ํด๋ž˜์Šค, ํ•ฉ๊ณ„ ์œ ํ˜•(์žˆ๋Š” ๊ฒฝ์šฐ) ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ค‘์—์„œ ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ• ์ง€ ๊ฒฐ์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • @ianlancetaylor ์˜ ์–ธ์–ด ๊ธฐ๋Šฅ์˜ ์œ ์šฉ์„ฑ์— ๋Œ€ํ•œ ์š”์ ์„ ๊ฐ€๋ณ๊ฒŒ ์—ฌ๊ฒจ์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ˆ˜๋งŽ์€ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์–ด๋–ค ๊ฒƒ์ด ์ง„์ •์œผ๋กœ ์„ค๋“๋ ฅ ์žˆ๊ณ  ๋น„์šฉ์„ ๋“ค์ผ ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”๊ฐ€(์–ธ์–ด์˜ ๋ณต์žก์„ฑ, ๋”ฐ๋ผ์„œ ๊ฐ€๋…์„ฑ, ๊ตฌํ˜„์˜ ์ถ”๊ฐ€ ๋ณต์žก์„ฑ)์ž…๋‹ˆ๋‹ค.

  • ์‚ฌ์†Œํ•œ ์ ์œผ๋กœ, Go์˜ iota ์ •์˜ ์ƒ์ˆ˜๋Š” ๋ฌผ๋ก  int๋กœ ์ œํ•œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒ์ˆ˜์ธ ํ•œ (์ด๋ฆ„ ์ง€์ • ๊ฐ€๋Šฅ) ๊ธฐ๋ณธ ์œ ํ˜•(float, ๋ถ€์šธ, ๋ฌธ์ž์—ด ํฌํ•จ: https://play.golang.org/p/lhd3jqqg5z)์œผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

  • @merovius ๋Š” (์ •์ !) ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๊ฒ€์‚ฌ์˜ ํ•œ๊ณ„์— ๋Œ€ํ•ด ์ข‹์€ ์ง€์ ์„ ํ•ฉ๋‹ˆ๋‹ค. ํ™•์žฅํ•  ์ˆ˜ ์—†๋Š” ์—ด๊ฑฐํ˜•์ด ํ™•์žฅ์ด ๋ฐ”๋žŒ์งํ•˜๊ฑฐ๋‚˜ ์˜ˆ์ƒ๋˜๋Š”(์žฅ์ˆ˜๋ช… API ํ‘œ๋ฉด์ด ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์ง„ํ™”ํ•˜๋Š”) ์—ฐ๊ฒฐ์— ์ ํ•ฉํ•œ์ง€ ๋งค์šฐ ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

์˜๋ฏธ ์žˆ๋Š” ์ง„์ „์ด ์žˆ๊ธฐ ์ „์— ๋‹ต๋ณ€์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด ์ œ์•ˆ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

1) ์ œ์•ˆ๋œ ์—ด๊ฑฐํ˜•์— ๋Œ€ํ•œ ์‹ค์ œ ๊ธฐ๋Œ€์น˜๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? @bep ์€ ์—ด๊ฑฐ ๊ฐ€๋Šฅ์„ฑ, ๋ฐ˜๋ณต ๊ฐ€๋Šฅ์„ฑ, ๋ฌธ์ž์—ด ํ‘œํ˜„, ์ •์ฒด์„ฑ์„ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ๋” ์žˆ๋‚˜์š”? ๋œ ์žˆ์Šต๋‹ˆ๊นŒ?

2) 1)์˜ ๋ชฉ๋ก์„ ๊ฐ€์ •ํ•˜๋ฉด ์—ด๊ฑฐํ˜•์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ? (๊ฐ™์€ ํŒจํ‚ค์ง€์—? ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—?) ํ™•์žฅํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ๊ทธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์‹ค๋ฌด์—์„œ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

3) ๋„ค์ž„์ŠคํŽ˜์ด์Šค: Swift์—์„œ enum ์œ ํ˜•์€ ์ƒˆ๋กœ์šด ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ด๋ฆ„์ด ๋ชจ๋“  ๊ณณ์—์„œ ๋ฐ˜๋ณต๋  ํ•„์š”๊ฐ€ ์—†๋„๋ก ํ•˜๋Š” ์ค‘์š”ํ•œ ๊ธฐ๊ณ„(๊ตฌ๋ฌธ ์„คํƒ•, ์œ ํ˜• ์ถ”๋ก )๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Month ์—ด๊ฑฐํ˜• ๊ฐ’์˜ ๊ฒฝ์šฐ ์˜ฌ๋ฐ”๋ฅธ ์ปจํ…์ŠคํŠธ์—์„œ Month.January(๋˜๋Š” ๋” ๋‚˜์œ ๊ฒฝ์šฐ MyPackage.Month.January) ๋Œ€์‹  .January๋ฅผ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜• ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์—ด๊ฑฐํ˜• ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ์–ด๋–ป๊ฒŒ ํ™•์žฅ๋ฉ๋‹ˆ๊นŒ? ์‹ค์ œ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ์–ด๋–ค ์ข…๋ฅ˜์˜ ๊ตฌ๋ฌธ ์„คํƒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

4) ์—ด๊ฑฐํ˜• ๊ฐ’์ด ์ƒ์ˆ˜์ž…๋‹ˆ๊นŒ? ๋ถˆ๋ณ€์˜ ๊ฐ€์น˜?

5) ์—ด๊ฑฐํ˜• ๊ฐ’์— ๋Œ€ํ•ด ์–ด๋–ค ์ข…๋ฅ˜์˜ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ(์˜ˆ: ๋ฐ˜๋ณต ์™ธ์—): ํ•˜๋‚˜๋Š” ์•ž์œผ๋กœ, ํ•˜๋‚˜๋Š” ๋’ค๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ถ”๊ฐ€ ๋‚ด์žฅ ํ•จ์ˆ˜ ๋˜๋Š” ์—ฐ์‚ฐ์ž๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? (๋ชจ๋“  ๋ฐ˜๋ณต์ด ์ˆœ์„œ๋Œ€๋กœ ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.) ๋งˆ์ง€๋ง‰ ์—ด๊ฑฐํ˜• ๊ฐ’์„ ์ง€๋‚˜ ์•ž์œผ๋กœ ์ด๋™ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ? ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜์ธ๊ฐ€์š”?

(https://github.com/golang/go/issues/19814#issuecomment-322771922์—์„œ ๋‹ค์Œ ๋‹จ๋ฝ์˜ ํ‘œํ˜„์„ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ๋ถ€์ฃผ์˜ํ•œ ๋‹จ์–ด ์„ ํƒ์— ๋Œ€ํ•ด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค.)

์ด๋Ÿฌํ•œ ์งˆ๋ฌธ์— ์‹ค์ œ๋กœ ๋‹ตํ•˜๋ ค๊ณ  ํ•˜์ง€ ์•Š์œผ๋ฉด ์ด ์ œ์•ˆ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค("๋‚˜๋Š” ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์„ ํ•˜๋Š” ์—ด๊ฑฐํ˜•์„ ์›ํ•ฉ๋‹ˆ๋‹ค"๋Š” ์ œ์•ˆ์ด ์•„๋‹™๋‹ˆ๋‹ค).

์ด๋Ÿฌํ•œ ์งˆ๋ฌธ์— ์‹ค์ œ๋กœ ๋‹ตํ•˜๋ ค๊ณ  ํ•˜์ง€ ์•Š์œผ๋ฉด ์ด ์ œ์•ˆ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@griesemer ๋‹น์‹ ์€ ๋งŽ์€ ์š”์ /์งˆ๋ฌธ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค -- ํ•˜์ง€๋งŒ ์ด ์งˆ๋ฌธ์— ๋‹ตํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ๋กœ ์ด ์ œ์•ˆ์— ๋ผ๋ฒจ์„ ๋ถ™์ด๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ์—ฌ์— ๋Œ€ํ•œ ๊ธฐ์ค€์€ ์ด ํ”„๋กœ์ ํŠธ์—์„œ ๋†’๊ฒŒ ์„ค์ •๋˜์–ด ์žˆ์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๋ฐ•์‚ฌ ํ•™์œ„ ์—†์ด๋„ _๋ฌด์–ธ๊ฐ€๋ฅผ ์ œ์•ˆ_ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ์ œ์•ˆ์ด _๊ตฌํ˜„ํ•  ์ค€๋น„๊ฐ€ ๋œ_ ๋””์ž์ธ์ผ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

  • Go๋Š” ๋งค์šฐ ํ•„์š”ํ•œ ํ† ๋ก ์„ ์‹œ์ž‘ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ œ์•ˆ์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค => ๊ฐ€์น˜์™€ ์˜๋ฏธ
  • ์ œ์•ˆ #21473 => ๊ฐ€์น˜์™€ ์˜๋ฏธ๋กœ๋„ ์ด์–ด์ง„๋‹ค๋ฉด

์†Œ๊ฐœ ์˜ˆ์ œ(์˜ค๋Š˜๋‚  Go์˜ ์—ด๊ฑฐํ˜•)๋Š” ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๊ฑฐ์˜ ์•„๋ฌด๋„ ์†์œผ๋กœ ๊ทธ๋Ÿฐ Go ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ์ œ์•ˆ(์–ธ์–ด ์ง€์›์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€)์€ ์‹ค์ œ๋กœ Go์—์„œ ์ด๋ฏธ ์ˆ˜ํ–‰ํ•œ ์ž‘์—…์— ํ›จ์”ฌ ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

@griesemer ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Go ๋ณ€์ˆ˜ ์ด๋ฆ„์— ์ „์ฒด ๋Œ€๋ฌธ์ž๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘์ง€ ๋ง์•˜์–ด์•ผ ํ–ˆ๋Š”๋ฐ, Go ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์กด๊ฒฝํ•˜๋Š” Google ์ง์›์ด ์ž‘์„ฑํ•œ ์†๊ธ€์”จ ์ฝ”๋“œ๊ฐ€ ์ œ ์ œ์•ˆ๊ณผ ๊ฑฐ์˜ ๊ฐ™์•„ ๋ณด์ด๋Š” ๊ณณ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๋™์ผํ•œ ํŒจํ„ด์„ ๋งค์šฐ ์ž์ฃผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ Google Cloud Go ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊ฐ€์ ธ์˜จ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

// ACLRole is the level of access to grant.
type ACLRole string

const (
    RoleOwner  ACLRole = "OWNER"
    RoleReader ACLRole = "READER"
    RoleWriter ACLRole = "WRITER"
)

๊ทธ๋“ค์€ ์—ฌ๋Ÿฌ ์žฅ์†Œ์—์„œ ๋™์ผํ•œ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
https://github.com/GoogleCloudPlatform/google-cloud-go/blob/master/bigquery/table.go#L78 -L116
https://github.com/GoogleCloudPlatform/google-cloud-go/blob/master/storage/acl.go#L27 -L49

๋‚˜์ค‘์— iota ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ดœ์ฐฎ๋‹ค๋ฉด ์ƒํ™ฉ์„ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํ† ๋ก ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ทธ ์ž์ฒด๋กœ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ œํ•œ๋œ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ด์ „ ๋Œ“๊ธ€์„ ์ฐธ์กฐํ•˜์„ธ์š”. https://github.com/golang/go/issues/19814#issuecomment -290948187

@bep ๊ณต์ •ํ•œ ํฌ์ธํŠธ; ๋ถ€์ฃผ์˜ํ•œ ๋‹จ์–ด ์„ ํƒ์— ๋Œ€ํ•ด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ์œ„์˜ ๋งˆ์ง€๋ง‰ ๋‹จ๋ฝ์„ ๋” ์ •์ค‘ํ•˜๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜์—ฌ ๋‹ค์‹œ ์‹œ๋„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜๋ฏธ ์žˆ๋Š” ์ง„์ „์„ ์ด๋ฃจ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด ์ œ์•ˆ์„ ์ง€์ง€ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์—ด๊ฑฐํ˜•์˜ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ข€ ๋” ์ •ํ™•ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด https://github.xml์—์„œ ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ์— ๋‹ตํ•จ์œผ๋กœ์จ). com/golang/go/issues/19814#issuecomment-322752526). ์ง€๊ธˆ๊นŒ์ง€์˜ ๋…ผ์˜์—์„œ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ƒ๋‹นํžˆ ๋ชจํ˜ธํ•˜๊ฒŒ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋กœ ๊ธฐ์กด Go๊ฐ€ ์–ด๋–ป๊ฒŒ (์ƒ๋‹นํžˆ) ๋ถ€์กฑํ•˜๊ณ  ์—ด๊ฑฐํ˜•์ด ๋ฌธ์ œ๋ฅผ ๋” ๋‚˜์€/๋น ๋ฅธ/๋ช…ํ™•ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋“ฑ์„ ๋ณด์—ฌ์ฃผ๋Š” ์‚ฌ๋ก€ ์—ฐ๊ตฌ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ๋งค์šฐ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Gophercon์—์„œ @rsc ์˜ ํ›Œ๋ฅญํ•œ ๊ฐ•์—ฐ ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. Go2 ์–ธ์–ด ๋ณ€๊ฒฝ์— ๋Œ€ํ•ด.

@derekperkins ๋‚˜๋Š” ์—ด๊ฑฐํ˜•์ด ์•„๋‹Œ (์œ ํ˜•์ด ์ง€์ •๋œ) ์ƒ์ˆ˜ ์ •์˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ์˜ ๋ถˆ์ผ์น˜๊ฐ€ "์—ด๊ฑฐํ˜•"์ด ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์ดํ•ด๋กœ ์ธํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์˜ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.

(๋‚ด ์ด์ „ https://github.com/golang/go/issues/19814#issuecomment-322774830์€ @derekparker ๊ฐ€ ์•„๋‹ˆ๋ผ @derekperkins๋กœ ๊ฐ”์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž๋™ ์™„์„ฑ์€ ์ €๋ฅผ ์ด๊ฒผ์Šต๋‹ˆ๋‹ค.)

@derekperkins ์ฝ”๋ฉ˜ํŠธ์—์„œ ํŒ๋‹จํ•˜๊ณ  ๋‚ด ์ž์‹ ์˜ ์งˆ๋ฌธ์— ๋ถ€๋ถ„์ ์œผ๋กœ ๋‹ตํ•˜๋ฉด Go "enum"์ด ์ตœ์†Œํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์„ฑ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • (์ƒˆ) ์œ ํ˜•์—์„œ ๊ฐ’ ์ง‘ํ•ฉ์„ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๊ธฐ๋Šฅ
  • ์ตœ์†Œํ•œ์˜ ๊ตฌ๋ฌธ ์˜ค๋ฒ„ํ—ค๋“œ ๋˜๋Š” ์ƒ์šฉ๊ตฌ๋กœ ํ•ด๋‹น ์œ ํ˜•์œผ๋กœ ์ด๋ฆ„(๋ฐ ํ•ด๋‹น ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๊ฐ’)์„ ์‰ฝ๊ฒŒ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ค๋ฆ„์ฐจ์ˆœ ์„ ์–ธ ์ˆœ์„œ๋กœ ์ด๋Ÿฌํ•œ ๊ฐ’์„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ธฐ๋Šฅ

๊ทธ ์†Œ๋ฆฌ๊ฐ€ ๋งž์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๋ชฉ๋ก์— ๋ฌด์—‡์„ ๋” ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๊ท€ํ•˜์˜ ์งˆ๋ฌธ์€ ๋ชจ๋‘ ์ข‹์€ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ œ์•ˆ๋œ ์—ด๊ฑฐํ˜•์— ๋Œ€ํ•œ ์‹ค์ œ ๊ธฐ๋Œ€์น˜๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? @bep ์€ ์—ด๊ฑฐ ๊ฐ€๋Šฅ์„ฑ, ๋ฐ˜๋ณต ๊ฐ€๋Šฅ์„ฑ, ๋ฌธ์ž์—ด ํ‘œํ˜„, ์ •์ฒด์„ฑ์„ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ๋” ์žˆ๋‚˜์š”? ๋œ ์žˆ์Šต๋‹ˆ๊นŒ?

1)์˜ ๋ชฉ๋ก์„ ๊ฐ€์ •ํ•˜๋ฉด ์—ด๊ฑฐํ˜•์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ? (๊ฐ™์€ ํŒจํ‚ค์ง€์—? ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—?) ํ™•์žฅํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ๊ทธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์‹ค๋ฌด์—์„œ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์—ด๊ฑฐํ˜•์ด ๋‘ ๊ฐ€์ง€ ์ด์œ ๋กœ ํ™•์žฅ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  1. ์—ด๊ฑฐํ˜•์€ ํ—ˆ์šฉ๋˜๋Š” ๊ฐ’์˜ ์ „์ฒด ๋ฒ”์œ„๋ฅผ ๋‚˜ํƒ€๋‚ด์•ผ ํ•˜๋ฏ€๋กœ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  2. ์ผ๋ฐ˜ Go ์œ ํ˜•์ด ์™ธ๋ถ€ ํŒจํ‚ค์ง€์—์„œ ํ™•์žฅ๋  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ด๋Š” ๋™์ผํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋ฐ ๊ฐœ๋ฐœ์ž ๊ธฐ๋Œ€์น˜๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๋„ค์ž„์ŠคํŽ˜์ด์Šค: Swift์—์„œ enum ์œ ํ˜•์€ ์ƒˆ๋กœ์šด ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ด๋ฆ„์ด ๋ชจ๋“  ๊ณณ์—์„œ ๋ฐ˜๋ณต๋  ํ•„์š”๊ฐ€ ์—†๋„๋ก ํ•˜๋Š” ์ค‘์š”ํ•œ ๊ธฐ๊ณ„(๊ตฌ๋ฌธ ์„คํƒ•, ์œ ํ˜• ์ถ”๋ก )๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Month ์—ด๊ฑฐํ˜• ๊ฐ’์˜ ๊ฒฝ์šฐ ์˜ฌ๋ฐ”๋ฅธ ์ปจํ…์ŠคํŠธ์—์„œ Month.January(๋˜๋Š” ๋” ๋‚˜์œ ๊ฒฝ์šฐ MyPackage.Month.January) ๋Œ€์‹  .January๋ฅผ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜• ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์—ด๊ฑฐํ˜• ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ์–ด๋–ป๊ฒŒ ํ™•์žฅ๋ฉ๋‹ˆ๊นŒ? ์‹ค์ œ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ์–ด๋–ค ์ข…๋ฅ˜์˜ ๊ตฌ๋ฌธ ์„คํƒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์–ธ๊ธ‰ํ•œ ๋ชจ๋“  ์˜ˆ์—์„œ ์œ ํ˜• ์ด๋ฆ„์„ ์ ‘๋‘์‚ฌ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒจ๋‚ฌ๋Š”์ง€ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฐ•ํ•˜๊ฒŒ ๋Š๋‚€๋‹ค๋ฉด ๋ฐ˜๋Œ€ํ•˜์ง€๋Š” ์•Š๊ฒ ์ง€๋งŒ, ์ด๋Š” ์ด ์ œ์•ˆ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฉ๋‹ˆ๋‹ค. ์ ‘๋‘์‚ฌ๋Š” ํ˜„์žฌ ์‹œ์Šคํ…œ์— ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค.

์—ด๊ฑฐํ˜• ๊ฐ’์€ ์ƒ์ˆ˜์ž…๋‹ˆ๊นŒ? ๋ถˆ๋ณ€์˜ ๊ฐ€์น˜?

๋‚˜๋Š” ์ƒ์ˆ˜๋ฅผ ์ƒ๊ฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ด๊ฑฐํ˜• ๊ฐ’์— ๋Œ€ํ•ด ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ(์˜ˆ: ๋ฐ˜๋ณต ์™ธ์—): ํ•˜๋‚˜๋Š” ์•ž์œผ๋กœ, ํ•˜๋‚˜๋Š” ๋’ค๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ถ”๊ฐ€ ๋‚ด์žฅ ํ•จ์ˆ˜ ๋˜๋Š” ์—ฐ์‚ฐ์ž๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? (๋ชจ๋“  ๋ฐ˜๋ณต์ด ์ˆœ์„œ๋Œ€๋กœ ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.) ๋งˆ์ง€๋ง‰ ์—ด๊ฑฐํ˜• ๊ฐ’์„ ์ง€๋‚˜ ์•ž์œผ๋กœ ์ด๋™ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ? ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜์ธ๊ฐ€์š”?

๋‚˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์Šฌ๋ผ์ด์Šค/๋ฐฐ์—ด(๋งต์ด ์•„๋‹˜)์— ๋Œ€ํ•œ ํ‘œ์ค€ Go ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜• ๊ฐ’์€ ์„ ์–ธ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ ๋ฒ”์œ„ ์ง€์›์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ์—ด๊ฑฐํ˜•์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๊ฐ•ํ•˜๊ฒŒ ๋Š๋ผ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฉด ์ž ์žฌ์ ์ธ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

์ง์ ‘ ํ• ๋‹น์ด๋“  ์œ ํ˜• ์บ์ŠคํŒ…์ด๋“  ์ƒ๊ด€์—†์ด ์—ด๊ฑฐํ˜•์— ์ž˜๋ชป๋œ ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด ์ƒˆ๋กœ์šด ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜(ํŒจ๋‹‰?)๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์š”์•ฝํ•˜๋ฉด ์ œ์•ˆํ•œ ์—ด๊ฑฐํ˜• ๊ฐ’์€ ์œ ํ˜•์ด ์ง€์ •๋œ ์ƒ์ˆ˜์™€ ๋น„์Šทํ•˜์ง€๋งŒ(์ƒ์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ์ƒ์ˆ˜ ๊ฐ’์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ) ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋˜ํ•œ ๋™์ผํ•œ ์„ ์–ธ์—์„œ ์—ด๊ฑฐํ˜• ๊ฐ’๊ณผ ์—ฐ๊ฒฐ๋œ ์—ด๊ฑฐํ˜• ์œ ํ˜•์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ƒ์ˆ˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค).
  • ์„ ์–ธ ์™ธ๋ถ€์—์„œ ๊ธฐ์กด ์—ด๊ฑฐํ˜• ์œ ํ˜•์˜ ์—ด๊ฑฐํ˜• ๊ฐ’์„ ์บ์ŠคํŒ…/์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๊ฒƒ๋“ค์„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค

๊ทธ ๋ง์ด ๋งž๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ? (์ด๊ฒƒ์€ Pascal์ด ์•ฝ 45๋…„ ์ „์— ๊ฐœ์ฒ™ํ•œ ์—ด๊ฑฐํ˜•์— ๋Œ€ํ•ด ์–ธ์–ด๊ฐ€ ์ทจํ•œ ๊ณ ์ „์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค).

์˜ˆ, ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ์ œ๊ฐ€ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

switch ๋ฌธ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ œ์•ˆ์˜ ์ฃผ์š” ๋™์ธ ์ค‘ ํ•˜๋‚˜์ธ AIUI.

์—ด๊ฑฐํ˜•์„ ์ผค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฌด์—‡์ด๋“  ์ผค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•”์‹œ๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์Šค์œ„์น˜์˜ ์—ด๊ฑฐ ํ˜•์„ ์™„์ „ํžˆ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ swift์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์ง€๋งŒ ์ˆ˜์˜์‚ฌ๊ฐ€ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค.

@jediorange ๋‚˜๋Š” ํŠนํžˆ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์งˆ๋ฌธ, ์ฆ‰ ์ œ์•ˆ์„ ์™„์ „ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ฒ ์ €ํ•œ ๊ฒ€์‚ฌ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. "์•„๋‹ˆ์˜ค"๋Š” ๋ฌผ๋ก  ์™„๋ฒฝํ•˜๊ฒŒ ์ข‹์€ ๋Œ€๋‹ต์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์˜ ์›๋ž˜ ๋ฉ”์‹œ์ง€ ๋Š” protobuf๋ฅผ ๋™๊ธฐ๋กœ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ง€๊ธˆ ์ฃผ์–ด์ง„ ์˜๋ฏธ๋ก ์„ ์‚ฌ์šฉํ•˜์—ฌ protobuf-compiler๊ฐ€ ๋ชจ๋“  ์—ด๊ฑฐํ˜•์— ๋Œ€ํ•ด ์ถ”๊ฐ€ "์ธ์‹ํ•  ์ˆ˜ ์—†๋Š”" ๊ฒฝ์šฐ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๋ช…์‹œ์ ์œผ๋กœ ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ผ๋ถ€ ์ด๋ฆ„ ๋งน๊ธ€๋ง ์ฒด๊ณ„๋ฅผ ์˜๋ฏธํ•จ). ๋˜ํ•œ ๋””์ฝ”๋”ฉ๋œ ์—ด๊ฑฐํ˜• ๊ฐ’์ด ์ปดํŒŒ์ผ๋œ ๋ฒ”์œ„์— ์—†๋Š” ๊ฒฝ์šฐ ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ ๊ตฌ์กฐ์ฒด์— ์ถ”๊ฐ€ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ž๋ฐ” ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋˜๋Š” int ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋” ๋†’์Šต๋‹ˆ๋‹ค.

@Merovius ๋‚ด ์›๋ž˜ ์ œ์•ˆ์€ ์ œ์•ˆ์˜ ์ฃผ์š” ๋™๊ธฐ๊ฐ€ ์•„๋‹Œ ์˜ˆ๋กœ protobufs๋ฅผ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ทธ ํ†ตํ•ฉ์— ๋Œ€ํ•ด ์ข‹์€ ์ง€์ ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ง๊ต ๋ฌธ์ œ๋กœ ์ทจ๊ธ‰๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณธ ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” ์ƒ์„ฑ๋œ protobuf ์œ ํ˜•์„ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜๋Š” ์•ฑ ์ˆ˜์ค€ ๊ตฌ์กฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. protobuf๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ  ๊ณ„์†๋  ์ˆ˜ ์žˆ๊ณ  ์•ฑ ์ œ์ž‘์ž๊ฐ€ ์ด๋ฅผ Go ์—ด๊ฑฐํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋ณ€ํ™˜ ํ”„๋กœ์„ธ์Šค์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ทน๋‹จ์ ์ธ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์ œ ์ƒ๊ฐ์— ์ดํ•ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

@derekperkins ์ถ”๊ฐ€ ์งˆ๋ฌธ:

  • ๋ช…์‹œ์ ์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์—ด๊ฑฐํ˜• ๋ณ€์ˆ˜์˜ 0 ๊ฐ’์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ผ๋ฐ˜์ ์œผ๋กœ 0์ด ๋  ์ˆ˜ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค(๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น/์ดˆ๊ธฐํ™”๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ํ•จ).

  • ์—ด๊ฑฐํ˜• ๊ฐ’์œผ๋กœ ์ œํ•œ๋œ ์‚ฐ์ˆ ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด, Pascal์—์„œ(๋‚ด๊ฐ€ ํ•œ ๋ฒˆ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•œ ๊ฒƒ์„ ์˜›๋‚ ๋กœ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋ฉด) ๋†€๋ž๊ฒŒ๋„ 1๋‹จ๊ณ„ ์ด์ƒ์œผ๋กœ ๋ฐ˜๋ณตํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ์—ด๊ฑฐํ˜• ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฐ˜๋ณต๊ณผ ๊ด€๋ จํ•˜์—ฌ go ์ƒ์„ฑ ์ƒ์„ฑ ๋ฐ˜๋ณต(๋ฐ stringify) ์ง€์›์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋ช…์‹œ์ ์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์—ด๊ฑฐํ˜• ๋ณ€์ˆ˜์˜ 0 ๊ฐ’์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ผ๋ฐ˜์ ์œผ๋กœ 0์ด ๋  ์ˆ˜ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค(๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น/์ดˆ๊ธฐํ™”๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ํ•จ).

์ดˆ๊ธฐ ์ œ์•ˆ์„œ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด๊ฒƒ์€ ๋” ์—„๊ฒฉํ•œ ๊ฒฐ์ • ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ •์˜ ์ˆœ์„œ๊ฐ€ ๋ฐ˜๋ณต์— ์ค‘์š”ํ•˜๋‹ค๋ฉด ์ฒซ ๋ฒˆ์งธ ์ •์˜๋œ ๊ฐ’์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ํ•˜๋Š” ๊ฒƒ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์—ด๊ฑฐํ˜• ๊ฐ’์œผ๋กœ ์ œํ•œ๋œ ์‚ฐ์ˆ ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด, Pascal์—์„œ(๋‚ด๊ฐ€ ํ•œ ๋ฒˆ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•œ ๊ฒƒ์„ ์˜›๋‚ ๋กœ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋ฉด) ๋†€๋ž๊ฒŒ๋„ 1๋‹จ๊ณ„ ์ด์ƒ์œผ๋กœ ๋ฐ˜๋ณตํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ์—ด๊ฑฐํ˜• ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ˆซ์ž ๊ธฐ๋ฐ˜ ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜๋“  ๋ฌธ์ž์—ด ๊ธฐ๋ฐ˜ ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜๋“  ๋ชจ๋“  ์—ด๊ฑฐํ˜•์— ์•”์‹œ์  0 ๊ธฐ๋ฐ˜ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜์ด ์•„๋‹Œ ์ง€์›๋˜๋Š” range ๋ฐ˜๋ณต์—๋งŒ ์˜์กดํ•œ๋‹ค๊ณ  ์•ž์„œ ์–ธ๊ธ‰ํ•œ ์ด์œ ๋Š” ๋ฐฐ์—ด์ด๋‚˜ ๋งต ๋˜๋Š” ๊ทธ ์•„๋ž˜์— ์žˆ๋Š” ๋ฌด์—‡์ด๋“  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ๊ตฌํ˜„์„ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ์—ด๊ฑฐํ˜•์— ์•ก์„ธ์Šคํ•ด์•ผ ํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ ๊ทธ๊ฒƒ์ด ์œ ์ตํ•œ ์ด์œ ๊ฐ€ ์žˆ๋‹ค๋ฉด ํ—ˆ์šฉํ•˜์ง€ ์•Š์„ ์ด์œ ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ณต๊ณผ ๊ด€๋ จํ•˜์—ฌ go ์ƒ์„ฑ ์ƒ์„ฑ ๋ฐ˜๋ณต(๋ฐ stringify) ์ง€์›์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋ฐ˜๋ณต์€ ๊ฐœ์ธ์ ์œผ๋กœ ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ œ์•ˆ์— ๊ฐ€์น˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์›๋™๋ ฅ์ด๋ผ๋ฉด go generate ์ด๋ฉด ์ถฉ๋ถ„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๊ฐ€์น˜ ์•ˆ์ „์„ ๋ณด์žฅํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Stringer() ์ธ์ˆ˜๋Š” ์›์‹œ ๊ฐ’์ด iota ๋˜๋Š” int ๋˜๋Š” "์‹ค์ œ" ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋‹ค๋ฅธ ์œ ํ˜•์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ (Un)MarshalJSON , (Un)MarshalBinary , Scanner/Valuer ๋ฐ Stringer ๊ฐ’์ด ํ†ต์‹ ์— ์‚ฌ์šฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํƒ€ ์ง๋ ฌํ™” ๋ฐฉ๋ฒ•์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Go๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ.

@griesemer ์ ์–ด๋„ ๊ฐ’ ์ถ”๊ฐ€/์ œ๊ฑฐ์™€ ๊ด€๋ จํ•˜์—ฌ ์—ด๊ฑฐํ˜•์˜ ํ™•์žฅ์„ฑ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์งˆ๋ฌธ์— ์™„์ „ํžˆ ๋Œ€๋‹ตํ•˜์ง€ ๋ชปํ–ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์„ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์€ ์ด ์ œ์•ˆ์˜ ํ•„์ˆ˜์ ์ธ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

@Merovius ์—์„œ https://github.com/golang/go/issues/19814#issuecomment -290969864

์—ด๊ฑฐํ˜• ์ง‘ํ•ฉ์„ ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ๋ชจ๋“  ํŒจํ‚ค์ง€๋Š” ์ž๋™์œผ๋กœ ๋ชจ๋“  ๊ฐ€์ ธ์˜ค๊ธฐ ๋„๊ตฌ๋ฅผ ๊ฐ•์ œ๋กœ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‹ค๋ฅธ ์ฃผ์š” API ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์œ ํ˜•, ๊ธฐ๋Šฅ ๋˜๋Š” ๊ธฐ๋Šฅ ์„œ๋ช…์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ BC๋ฅผ ์ •์ค‘ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ํŒจํ‚ค์ง€ ์ž‘์„ฑ์ž์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„์˜ ๊ด€์ ์—์„œ ๊ธฐ๋ณธ๊ฐ’์ด ๋ชจ๋‘ 0์ด ์•„๋‹Œ ์œ ํ˜•์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚ ์—๋Š” ๊ทธ๋Ÿฌํ•œ ์œ ํ˜•์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์€ ์ด ์•„์ด๋””์–ด์— ๋ฐ˜๋Œ€๋˜๋Š” ํ‘œ์‹œ๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์–ธ์–ด์—์„œ ์ฑ„๋„์„ ๋งŒ๋“œ๋Š” ๋ฐ make ๊ฐ€ ํ•„์š”ํ•œ ์œ ์ผํ•œ ์ด์œ ๋Š” ์ฑ„๋„ ์œ ํ˜•์— ๋Œ€ํ•ด ์ด ๊ธฐ๋Šฅ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด make ๋Š” ์„ ํƒ ์‚ฌํ•ญ์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ฑ„๋„ ๋ฒ„ํผ ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ๋ณ€์ˆ˜์— ์ƒˆ ์ฑ„๋„์„ ํ• ๋‹นํ•˜๋Š” ๋ฐ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

@derekperkins ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ API ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ ์ง„์ ์ธ ๋ณต๊ตฌ๋ฅผ ์œ„ํ•ด ์กฐ์ •๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Russ Cox ์„ค๋ช… ์„ ์ฝ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ๋‚ด์šฉ์ด ๋งค์šฐ ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค.

(ํ˜„์žฌ const+iota ๊ตฌ์กฐ์™€ ๊ฐ™์€) ๊ฐœ๋ฐฉํ˜• ์—ด๊ฑฐํ˜•์€ (์˜ˆ๋ฅผ ๋“ค์–ด) a) ์ƒˆ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ •์˜ํ•˜๊ณ , b) ์ƒˆ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์—ญ ์ข…์†์„ฑ์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ , c) ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•จ์œผ๋กœ์จ ์ ์ง„์ ์ธ ๋ณต๊ตฌ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ๊ฐ’์„ ์ œ๊ฑฐํ•˜๋ ค๋ฉด a) ๊ฐ’ ์‚ฌ์šฉ์„ ์ค‘์ง€ํ•˜๊ณ  b) ์ œ๊ฑฐํ•  ๊ฐ’์„ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š๋„๋ก ์—ญ ์ข…์†์„ฑ์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  c) ๊ฐ’์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ซํžŒ(์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ฒ ์ €ํ•œ ๊ฒ€์‚ฌ) ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’ ์ฒ˜๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์ƒˆ ๊ฐ’์„ ์ •์˜ํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ˆ„๋ฝ๋œ ์Šค์œ„์น˜ ์ผ€์ด์Šค์— ๋Œ€ํ•ด ์ฆ‰์‹œ ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ’์„ ์ •์˜ํ•˜๊ธฐ ์ „์— ๊ฐ’ ์ฒ˜๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ๊ฐœ๋ณ„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ค‘๋‹จ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ(๋ถ„๋ฆฌ๋  ์ˆ˜ ์žˆ์Œ) ์ค‘๋‹จ๋˜์ง€ ์•Š๋Š” ๋ถ„์‚ฐ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์— ๋Œ€ํ•ด ์ค‘๋‹จ๋˜์ง€ ์•Š๋Š” ์ปค๋ฐ‹ ์‹œํ€€์Šค๊ฐ€ โ€‹โ€‹์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ตฌํ˜„์˜ ๊ด€์ ์—์„œ ๊ธฐ๋ณธ๊ฐ’์ด ๋ชจ๋‘ 0์ด ์•„๋‹Œ ์œ ํ˜•์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚ ์—๋Š” ๊ทธ๋Ÿฌํ•œ ์œ ํ˜•์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์€ ์ด ์•„์ด๋””์–ด์— ๋ฐ˜๋Œ€๋˜๋Š” ํ‘œ์‹œ๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@ianlancetaylor ํ™•์‹คํžˆ ์ „์ฒด ๊ตฌํ˜„์— ๋Œ€ํ•ด ๋งํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ์—ด๊ฑฐํ˜•์ด 0 ๊ธฐ๋ฐ˜ ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„๋œ ๊ฒฝ์šฐ( @griesemer ๊ฐ€ ์ฐฌ์„ฑํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆผ) ์ธ๋ฑ์Šค๊ฐ€ 0์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. "all-bits-zero"๋กœ ๋‘ ๋ฐฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ซํžŒ(์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ฒ ์ €ํ•œ ๊ฒ€์‚ฌ) ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

@Merovius go vet ๋˜๋Š” @jediorange ๊ฐ€ ์ œ์•ˆํ•œ ๊ฒƒ๊ณผ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์‹œํ–‰ํ•œ ์œ ์‚ฌํ•œ ๋„๊ตฌ๋กœ ์™„์ „์„ฑ์„ ํ™•์ธํ–ˆ๋‹ค๋ฉด ๊ฑฑ์ •์„ ๋œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@derekperkins ๊ทธ๋“ค์˜ ์œ ํ•ด์„ฑ์— ๋Œ€ํ•ด ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์œ ์šฉ์„ฑ์ด ๋ถ€์กฑํ•ด์„œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ฒ„์ „ ์™œ๊ณก์˜ ๋™์ผํ•œ ๋ฌธ์ œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ณ ๋ ค๋˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€(์‹œ์Šคํ…œ ํ˜ธ์ถœ, ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ, ํŒŒ์ผ ํ˜•์‹, ๊ณต์œ  ๊ฐœ์ฒด ๋“ฑ)์—์„œ๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. proto3์—๋Š” ๊ฐœ๋ฐฉํ˜• ์—ด๊ฑฐํ˜•์ด ํ•„์š”ํ•˜๊ณ  proto2์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š์€ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋งŽ์€ ์ค‘๋‹จ๊ณผ ๋ฐ์ดํ„ฐ ์†์ƒ ์‚ฌ๊ฑด์—์„œ ๋ฐฐ์šด ๊ตํ›ˆ์ž…๋‹ˆ๋‹ค. Google์€ ์ด๋ฏธ ๋ฒ„์ „ ์™œ๊ณก์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ฝค ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ด€์ ์—์„œ๋Š” ๊ธฐ๋ณธ ์ผ€์ด์Šค๊ฐ€ ์žˆ๋Š” ๊ฐœ๋ฐฉํ˜• ์—ด๊ฑฐํ˜•์ด ์˜ฌ๋ฐ”๋ฅธ ์†”๋ฃจ์…˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž˜๋ชป๋œ ๊ฐ’์— ๋Œ€ํ•œ ์•ˆ์ „์„ฑ ์ฃผ์žฅ๊ณผ๋Š” ๋ณ„๊ฐœ๋กœ, ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ๊ทธ๊ฒƒ๋“ค์€ ์‹ค์ œ๋กœ ํ…Œ์ด๋ธ”์— ๋งŽ์€ ๊ฒƒ์„ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์„ ๋งํ•˜์ง€๋งŒ, ๋‚˜๋Š” ๊ฒฐ์ •์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

@derekperkins https://github.com/golang/go/issues/19814#issuecomment -322818206์—์„œ (๊ท€ํ•˜์˜ ๊ด€์ ์—์„œ) ๋‹ค์Œ์„ ํ™•์ธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์—ด๊ฑฐํ˜• ์„ ์–ธ์€ ๋ช…๋ช…๋œ ์—ด๊ฑฐํ˜• ๊ฐ’(์ƒ์ˆ˜)๊ณผ ํ•จ๊ป˜ ์—ด๊ฑฐํ˜• ์œ ํ˜•์„ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๊ฒƒ๋“ค์„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค
  • ์„ ์–ธ ์™ธ๋ถ€์˜ ์—ด๊ฑฐํ˜•์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    ๊ทธ๋ฆฌ๊ณ  ๋‚˜์ค‘์—: ์—ด๊ฑฐํ˜•์— ๋Œ€ํ•œ ์ „ํ™˜์€ ์ฒ ์ €ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋˜๋Š” ์•„๋‹ ์ˆ˜๋„ ์žˆ์Œ)(๋œ ์ค‘์š”ํ•ด ๋ณด์ž„)

https://github.com/golang/go/issues/19814#issuecomment -322895247์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ฒซ ๋ฒˆ์งธ ์ •์˜๋œ ๊ฐ’์€ ์•„๋งˆ๋„ ๊ธฐ๋ณธ(์˜) ๊ฐ’์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ด๊ฒƒ์€ ๋ฐ˜๋ณต์— ์ค‘์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์—ด๊ฑฐํ˜• ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค)
  • ๋ฐ˜๋ณต์€ ์ฃผ์š” ๋™๊ธฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  https://github.com/golang/go/issues/19814#issuecomment -322903714์—์„œ "ํŽธ์ง‘ ๊ธฐ๋Šฅ์ด ์ด ์ œ์•ˆ์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„"์ด๋ผ๊ณ  ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ˜๋ณต์€ ์ฃผ์š” ๋™๊ธฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ƒ์ˆ˜์ธ ์—ด๊ฑฐํ˜• ๊ฐ’์˜ ์—ด๊ฑฐํ˜• ์„ ์–ธ์„ ์ตœ์†Œํ•œ ๋‚จ๊ฒจ๋‘๊ณ  ์„ ์–ธ ์™ธ๋ถ€๋กœ ํ™•์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€๊ธˆ ๋‹น์‹ ์€ ๊ทธ๊ฒƒ๋“ค์„ ํŽธ์ง‘ํ•˜๋Š” ๋Šฅ๋ ฅ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ๋ฌด์Šจ ๋œป์ด์•ผ? ํ™•์‹คํžˆ ๊ทธ๊ฒƒ๋“ค์ด ํ™•์žฅ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค(๋ชจ์ˆœ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค). ๊ทธ๋“ค์€ ๋ณ€์ˆ˜์ž…๋‹ˆ๊นŒ? (๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋“ค์€ ์ƒ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค).

https://github.com/golang/go/issues/19814#issuecomment -322903714์—์„œ ์—ด๊ฑฐํ˜•์„ 0 ๊ธฐ๋ฐ˜ ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์—ด๊ฑฐํ˜• ์„ ์–ธ์ด 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ƒ์ˆ˜ ์ธ๋ฑ์Šค์ธ ์—ด๊ฑฐํ˜• ์ด๋ฆ„์˜ ์ •๋ ฌ๋œ ๋ชฉ๋ก๊ณผ ํ•จ๊ป˜ ์—ด๊ฑฐํ˜• ๊ฐ’์˜ ๋ฐฐ์—ด(๊ณต๊ฐ„์ด ์ž๋™์œผ๋กœ ์˜ˆ์•ฝ๋จ)์— ์ƒˆ๋กœ์šด ์œ ํ˜•์„ ๋„์ž…ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒŒ ๋„ค๊ฐ€ ๋งํ•˜๋Š”๊ฑฐ์•ผ? ๊ทธ๋ ‡๋‹ค๋ฉด ๊ณ ์ • ํฌ๊ธฐ ๋ฐฐ์—ด๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ƒ์ˆ˜ ์ธ๋ฑ์Šค ๋ชฉ๋ก์„ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ฐฐ์—ด ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ๋Š” ์—ด๊ฑฐํ˜• ๋ฒ”์œ„๋ฅผ "ํ™•์žฅ"ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋ฐ˜๋ณต์ด ์ด๋ฏธ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ž๋™์œผ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ฌด์—‡์„ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ˜๋ณต์€ ์ฃผ์š” ๋™๊ธฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ข‹์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ด๊ฑฐํ˜•์„ ์›ํ•˜๋Š” ๋‚ด ๋‚˜๋ฆ„์˜ ์ด์œ ๊ฐ€ ์žˆ์œผ๋ฉฐ @bep ์™€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์„ ํฌํ•จํ•˜์—ฌ ์ด ์Šค๋ ˆ๋“œ์˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ œ์•ˆ์˜ ํ•„์š”ํ•œ ๋ถ€๋ถ„์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์„ ๊ณ ๋ คํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Š” ์ƒ์ˆ˜์ธ ์—ด๊ฑฐํ˜• ๊ฐ’์˜ ์—ด๊ฑฐํ˜• ์„ ์–ธ์„ ์ตœ์†Œํ•œ ๋‚จ๊ฒจ๋‘๊ณ  ์„ ์–ธ ์™ธ๋ถ€๋กœ ํ™•์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€๊ธˆ ๋‹น์‹ ์€ ๊ทธ๊ฒƒ๋“ค์„ ํŽธ์ง‘ํ•˜๋Š” ๋Šฅ๋ ฅ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ๋ฌด์Šจ ๋œป์ด์•ผ? ํ™•์‹คํžˆ ๊ทธ๊ฒƒ๋“ค์ด ํ™•์žฅ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค(๋ชจ์ˆœ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค). ๊ทธ๋“ค์€ ๋ณ€์ˆ˜์ž…๋‹ˆ๊นŒ? (๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋“ค์€ ์ƒ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค).

๋‚ด๊ฐ€ ํŽธ์ง‘ํ•˜๋ผ๊ณ  ๋งํ•  ๋•Œ @Merovius ์˜ ์š”์ ์€ ๊ทธ๊ฒƒ๋“ค์ด ์—ด๋ฆฐ ์—ด๊ฑฐํ˜•์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋นŒ๋“œ ์‹œ ์ƒ์ˆ˜์ด์ง€๋งŒ ์˜์›ํžˆ ์ž ๊ฒจ ์žˆ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

#19814(์ฃผ์„)์—์„œ ์—ด๊ฑฐํ˜•์„ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ https://github.com/golang/go/issues/19814#issuecomment -322884746 ๋ฐ @ianlancetaylor ์˜ https๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์—ฌ ๋ฐฐํ›„์—์„œ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋‚ด ๊ธ‰์—ฌ ์ˆ˜์ค€์„ ๋„˜์–ด ์ถ”์ธกํ•œ ๊ฒƒ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. //github.com/golang/go/issues/19814#issuecomment -322899668

"์—ด๊ฑฐํ˜• ๊ฐ’์œผ๋กœ ์ œํ•œ๋œ ์‚ฐ์ˆ ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด, Pascal์—์„œ(๋‚ด๊ฐ€ ํ•œ ๋ฒˆ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•œ ๊ฒƒ์„ ์˜›๋‚ ๋กœ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋ฉด) ๋†€๋ž๊ฒŒ๋„ ์ข…์ข… > 1๋‹จ๊ณ„์—์„œ ๋ฐ˜๋ณตํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ์—ด๊ฑฐํ˜• ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค."

์ •์ˆ˜๊ฐ€ ์•„๋‹Œ ์—ด๊ฑฐํ˜•์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ํ•  ๊ณ„ํš์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ์‚ฐ์ˆ ์ด ์—ด๊ฑฐํ˜•์˜ ๊ฐ ๋ฉค๋ฒ„์— ์„ ์–ธ ์ˆœ์„œ์— ๋”ฐ๋ผ ์•”์‹œ์ ์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ํ• ๋‹นํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ์ œ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ตฌํ˜„์˜ ๊ด€์ ์—์„œ ๊ธฐ๋ณธ๊ฐ’์ด ๋ชจ๋‘ 0์ด ์•„๋‹Œ ์œ ํ˜•์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚ ์—๋Š” ๊ทธ๋Ÿฌํ•œ ์œ ํ˜•์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์€ ์ด ์•„์ด๋””์–ด์— ๋ฐ˜๋Œ€๋˜๋Š” ํ‘œ์‹œ๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ชฐ๋ผ์„œ ๋Œ€ํ™”๋ฅผ ๊ณ„์†ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์ €๋Š” ๊ธ‰์ง„์ ์ธ ๊ฒƒ์„ ์ œ์•ˆํ•˜๋ ค๊ณ  ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ „์— ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด "์ด๊ฒƒ์€ Pascal์ด ์•ฝ 45๋…„ ์ „์— ๊ฐœ์ฒ™ํ•œ ์—ด๊ฑฐํ˜•์— ๋Œ€ํ•ด ์–ธ์–ด๊ฐ€ ์ทจํ•œ ๊ณ ์ „์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ์ผ์น˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค", ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์ฒญ๊ตฌ์„œ์— ๋งž์Šต๋‹ˆ๋‹ค.

๊ด€์‹ฌ์„ ํ‘œ๋ช…ํ•˜์‹  ๋‹ค๋ฅธ ๋ถ„๋“ค์€ ๋ถ€๋‹ด ์—†์ด ์ฐธ์—ฌํ•ด ์ฃผ์‹ญ์‹œ์˜ค.

๋˜ ๋‹ค๋ฅธ ์งˆ๋ฌธ์€ ์ด๋Ÿฌํ•œ ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์ด๋‚˜ ์Šฌ๋ผ์ด์Šค๋กœ ์ƒ‰์ธ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ์Šฌ๋ผ์ด์Šค๋Š” ์ข…์ข… enum->value ๋งคํ•‘์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋งค์šฐ ํšจ์œจ์ ์ด๊ณ  ๊ฐ„๊ฒฐํ•œ ๋ฐฉ๋ฒ•์ด๋ฉฐ ๋งต์„ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์€ ๋ถˆํ–‰ํ•œ ์ผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@derekperkins ๊ทธ๋ž˜, ์šฐ๋ฆฌ(๋˜๋Š” ์ ์–ด๋„ ๋‚˜)๊ฐ€ ๋‹ค์‹œ ์›์ ์œผ๋กœ ๋Œ์•„๊ฐ€๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๊ฑฑ์ •๋œ๋‹ค. ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๊ฐ€ ํ˜„์žฌ ์ƒ์ˆ˜์™€ ์•„๋งˆ๋„ iota๋กœ ํ•˜๋Š” ์ผ์„ ์ž‘์„ฑํ•˜๋Š” ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์›ํ•˜์‹ญ๋‹ˆ๊นŒ? ์ฆ‰, (์•„๋งˆ๋„) ์ง€๋‚˜์น˜๊ฒŒ ๋ถ€๋‹ด์Šค๋Ÿฌ์šด ํ‘œ๊ธฐ๋ฒ•์— ๋Œ€ํ•œ ์ผ๋ถ€ ๊ตฌ๋ฌธ ์„คํƒ•? (๊ทธ๋ƒฅ ์ดํ•ดํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๋Š” ์ข‹์€ ๋Œ€๋‹ต์ž…๋‹ˆ๋‹ค.)

๋‹น์‹ ์€ ๊ทธ๊ฒƒ๋“ค์„ ์›ํ•˜๋Š” ์ž์‹ ๋งŒ์˜ ์ด์œ ๊ฐ€ ์žˆ๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ทธ ์ด์œ ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์กฐ๊ธˆ ๋” ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๋งจ ์ฒ˜์Œ์— ์ค€ ์˜ˆ๋Š” ๋‚˜์—๊ฒŒ๋ณ„๋กœ ์˜๋ฏธ๊ฐ€ ์—†์ง€๋งŒ ์•„๋งˆ๋„ ๋‚˜๋Š” ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์žˆ๋Š” ๊ทธ๋Œ€๋กœ ๋ชจ๋“  ์‚ฌ๋žŒ์€ ์ด ์ œ์•ˆ("์—ด๊ฑฐํ˜•")์ด ์ˆ˜๋ฐ˜ํ•˜๋Š” ๋‚ด์šฉ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„์”ฉ ๋‹ค๋ฅธ ์ดํ•ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์‘๋‹ต์—์„œ ๋ถ„๋ช…ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. Pascal ์—ด๊ฑฐํ˜•๊ณผ Swift ์—ด๊ฑฐํ˜• ์‚ฌ์ด์—๋Š” ์—„์ฒญ๋‚œ ๋ฒ”์œ„์˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ (๋˜๋Š” ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€)์ด ์ œ์•ˆ๋œ ๋‚ด์šฉ์„ ๋งค์šฐ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ง€ ์•Š๋Š” ํ•œ(๋‚˜๋Š” ๊ตฌํ˜„์„ ์š”๊ตฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ช…์‹ฌํ•˜์‹ญ์‹œ์˜ค), ์˜๋ฏธ ์žˆ๋Š” ์ง„์ „์„ ์ด๋ฃจ๊ฑฐ๋‚˜ ์ด ์ œ์•ˆ์˜ ์žฅ์ ์— ๋Œ€ํ•ด ํ† ๋ก ํ•˜๋Š” ๊ฒƒ์กฐ์ฐจ ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ง์ด ๋ผ?

@griesemer ๊ทธ๊ฒƒ์€ ์™„์ „ํžˆ ๋ง์ด ๋˜๋ฉฐ @rsc๊ฐ€ Gophercon ์—์„œ ์ด์•ผ๊ธฐํ•œ ํ†ต๊ณผ ๊ธฐ์ค€์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋ถ„๋ช…ํžˆ ๋‚˜๋ณด๋‹ค ํ›จ์”ฌ ๋” ๊นŠ์€ ์ดํ•ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. #21473์—์„œ vars์— ๋Œ€ํ•œ iota๋Š” ๋‹น์‹œ์— ๋งค๋ ฅ์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. enum ๊ฐ€ ์ฒ˜์Œ๋ถ€ํ„ฐ ํฌํ•จ๋˜์ง€ ์•Š์€ ๊ฒƒ๊ณผ ๊ฐ™์€ ์ด์œ ์ธ๊ฐ€์š”? ๊ทธ๊ฒƒ์ด Go์— ๊ฐ€์น˜๋ฅผ ๋”ํ•  ๊ฒƒ์ธ์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด, ์–ด๋””์—์„œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@derekperkins https://github.com/golang/go/issues/19814#issuecomment -323144075์˜ ์งˆ๋ฌธ๊ณผ ๊ด€๋ จํ•˜์—ฌ: ๋‹น์‹œ (Go์˜ ๋””์ž์ธ์—์„œ) ์šฐ๋ฆฌ๋Š” ๋น„๊ต์  ๋‹จ์ˆœํ•œ(Pascal ๋˜๋Š” C ์Šคํƒ€์ผ) ์—ด๊ฑฐํ˜•๋งŒ ๊ณ ๋ คํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๊ธฐ์–ตํ•˜์ง€ ๋ชปํ•˜์ง€๋งŒ ์—ด๊ฑฐํ˜•์— ํ•„์š”ํ•œ ์ถ”๊ฐ€ ๊ธฐ๊ณ„์— ๋Œ€ํ•œ ์ด์ ์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๋Š” ๋Š๋‚Œ์€ ํ™•์‹คํžˆ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ๋“ค์ด ๋ณธ์งˆ์ ์œผ๋กœ ๋ฏธํ™”๋˜๋Š” ์ง€์†์ ์ธ ์„ ์–ธ์ด๋ผ๊ณ  ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ „ํ†ต์ ์ธ ์—ด๊ฑฐํ˜•์—๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฐ์ˆ  ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ(๊ทธ๋ƒฅ ์ •์ˆ˜์ž„) "(์—ด๊ฑฐํ˜•) ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚จ"์€ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? Go์—์„œ๋Š” ์ƒ์ˆ˜์ผ ๋ฟ์ด๋ฉฐ "๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚จ"์€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋ฐ˜๋ณต์ž…๋‹ˆ๋‹ค. Pascal์—๋Š” enum ์œ ํ˜•์˜ ๋ณ€์ˆ˜ ๊ฐ’์„ ์•ž๋’ค๋กœ ์ „์ง„์‹œํ‚ค๋Š” ํŠน๋ณ„ํ•œ ๋‚ด์žฅ ํ•จ์ˆ˜(SUCC ๋ฐ PRED๋กœ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(C์—์„œ๋Š” ++ ๋˜๋Š” --๋งŒ ์ˆ˜ํ–‰). ๊ทธ๋Ÿฌ๋‚˜ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์—ฌ๊ธฐ์—๋„ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋์„ ๋„˜์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ(++ ๋˜๋Š” Pascal์— ํ•ด๋‹นํ•˜๋Š” SUCC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ด๊ฑฐํ˜• ๊ฐ’์— ๊ฑธ์ณ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•˜๋Š” for ๋ฃจํ”„์˜ ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ). ๋งˆ์ง€๋ง‰์œผ๋กœ ์—ด๊ฑฐํ˜• ์„ ์–ธ์€ ์š”์†Œ๊ฐ€ ์—ด๊ฑฐํ˜• ๊ฐ’์ธ ์ƒˆ ์œ ํ˜•์„ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ’์—๋Š” ์ด๋ฆ„(์—ด๊ฑฐํ˜• ์„ ์–ธ์— ์ •์˜๋œ ๊ฐ’)์ด ์žˆ์ง€๋งŒ ํ•ด๋‹น ์ด๋ฆ„์€ ์œ ํ˜•๊ณผ ๋™์ผํ•œ ๋ฒ”์œ„์— ์žˆ์Šต๋‹ˆ๋‹ค(Pascal, C์˜ ๊ฒฝ์šฐ). ์ด๊ฒƒ์€ ์•ฝ๊ฐ„ ๋ถˆ๋งŒ์กฑ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์—ด๊ฑฐํ˜•์„ ์„ ์–ธํ•  ๋•Œ ๊ฐ ์—ด๊ฑฐํ˜• ์œ ํ˜•์— ๋Œ€ํ•ด ์ถฉ๋Œ ์—†์ด ๋™์ผํ•œ ์—ด๊ฑฐํ˜• ๊ฐ’ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ํฌ๋งํ•˜์ง€๋งŒ ์ด๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  Go๋Š” ๊ทธ๊ฒƒ์„ ํ•ด๊ฒฐํ•˜์ง€๋„ ๋ชปํ•˜์ง€๋งŒ ์ƒ์ˆ˜ ์„ ์–ธ ์—ญ์‹œ ์ƒˆ๋กœ์šด ์ด๋ฆ„ ๊ณต๊ฐ„์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋” ์ข‹์€ ์†”๋ฃจ์…˜์€ ๊ฐ ์—ด๊ฑฐํ˜•์— ์ด๋ฆ„ ๊ณต๊ฐ„์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ ์—ด๊ฑฐํ˜• ๊ฐ’์ด ์‚ฌ์šฉ๋  ๋•Œ๋งˆ๋‹ค ์—ด๊ฑฐํ˜• ์œ ํ˜• ์ด๋ฆ„์œผ๋กœ ํ•œ์ •ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์„ฑ๊ฐ€์‹  ์ผ์ž…๋‹ˆ๋‹ค. Swift๋Š” ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์—ด๊ฑฐํ˜• ์œ ํ˜•์„ ์ถ”๋ก ํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๋‹ค์Œ ์ ์ด ์ ‘๋‘์‚ฌ๋กœ ๋ถ™์€ ์—ด๊ฑฐํ˜• ๊ฐ’ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๊ฝค ๋งŽ์€ ๊ธฐ๊ณ„์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ๋•Œ๋•Œ๋กœ(์ข…์ข… ๊ณต๊ฐœ API์—์„œ) ์—ด๊ฑฐํ˜• ์„ ์–ธ์„ ํ™•์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค๋ฉด(๊ท€ํ•˜๊ฐ€ ์ฝ”๋“œ๋ฅผ ์†Œ์œ ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ) ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๋” ๋งŽ์€ ๊ฒƒ์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ƒ๊ฐ๋‚˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ง๊ต ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Go์—์„œ ์—ด๊ฑฐํ˜•์„ ์—๋ฎฌ๋ ˆ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ํ• ๋‹น์„ ๋œ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์ •์ˆ˜ ์œ ํ˜•๊ณผ ๊ตฌ๋ฌธ ์„คํƒ•์— ๋Œ€ํ•œ iota ๋ฉ”์ปค๋‹ˆ์ฆ˜(๋ฐ ๋Šฅ๋ ฅ์€ ๋ฐ˜๋ณต๋˜๋Š” ์ดˆ๊ธฐํ™” ํ‘œํ˜„์‹์„ ์ƒ๋žตํ•จ)์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‚ด ์งˆ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•ฝ๊ฐ„์˜ ๊ตฌ๋ฌธ ์˜ค๋ฒ„ํ—ค๋“œ๋กœ Go์—์„œ ์ ์ ˆํ•˜๊ฒŒ ์—๋ฎฌ๋ ˆ์ดํŠธํ•  ์ˆ˜ ์—†๋Š” ํŠน์ˆ˜ ์—ด๊ฑฐํ˜• ์„ ์–ธ์—์„œ ๋ฌด์—‡์„ ์–ป๊ณ ์ž ํ•ฉ๋‹ˆ๊นŒ? ์—ด๊ฑฐํ˜•๊ณผ ์„ ์–ธ ์™ธ๋ถ€๋กœ ํ™•์žฅํ•  ์ˆ˜ ์—†๋Š” ์—ด๊ฑฐํ˜• ์œ ํ˜•์„ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Swift์—์„œ์ฒ˜๋Ÿผ ์—ด๊ฑฐํ˜• ๊ฐ’์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Go์˜ go Generator๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ด๊ฑฐ๋ฅผ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ŠคํŠธ๋ง๊ฑฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•์žฅ์„ ์ œํ•œํ•˜๋Š” ๊ฒƒ์€ API ๊ฒฝ๊ณ„์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜• ๊ฐ’์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ๊ธฐ๋Šฅ(์˜ˆ: Swift์—์„œ)์€ ๋งŽ์€ ์ง๊ต ๊ฐœ๋…์„ ํ˜ผํ•ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— Go์™€ ๋งค์šฐ ๋‹ค๋ฅด๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค. Go์—์„œ๋Š” ๊ธฐ๋ณธ ๋นŒ๋”ฉ ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@griesemer ์‚ฌ๋ ค ๊นŠ์€ ๋‹ต๋ณ€์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜๊ด‘์Šค๋Ÿฌ์šด ์ƒ์ˆ˜ ์„ ์–ธ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Go์—์„œ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๊ฐ–๋Š” ๊ฒƒ์€ ํ›Œ๋ฅญํ•˜๊ณ , enum ๊ฐ€ ๋‚˜์—๊ฒŒ ๊ฐœ์ธ์ ์œผ๋กœ ์ œ๊ณตํ•  ์ฃผ์š” ๊ฐ€์น˜๋Š” ๊ฐ€์น˜ ์•ˆ์ „์„ฑ์ด๋‹ค. ์˜ค๋Š˜๋‚  Go์—์„œ ์ด๋ฅผ ๋ชจ๋ฐฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ๋ชจ๋“  ์ง„์ž…์ ์—์„œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์žฅํ™ฉํ•˜๊ณ  ์‹ค์ˆ˜ํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ ์˜ค๋Š˜๋‚ ๊ณผ ๊ฐ™์€ ์–ธ์–ด๋กœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋ฏธ ์—ด๊ฑฐํ˜• ์•ž์— ์œ ํ˜• ์ด๋ฆ„์„ ์ ‘๋‘์‚ฌ๋กœ ๋ถ™์—ฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ–ˆ๋Š”๋ฐ, ์žฅํ™ฉํ•˜์ง€๋งŒ ํฐ ๋ฌธ์ œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ iota ์— ๋Œ€ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์„ ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค. ๋ฉ‹์ง€๊ธด ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ enum ๊ฐ™์€ ๊ฐ’์€ db ๋˜๋Š” ์™ธ๋ถ€ API์™€ ๊ฐ™์€ ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค์— ๋งคํ•‘๋˜๋ฉฐ, ์žฌ์ •๋ ฌํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๋” ๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. iota ๋Š” ๋ฌธ์ž์—ด ๊ฐ’ ๋ชฉ๋ก์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— enum ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์žฅ์†Œ์—์„œ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ์ด ์ œ์•ˆ์„ ์–ผ๋งˆ๋‚˜ ๋” ๋ช…ํ™•ํžˆ ํ•  ์ˆ˜ ์žˆ์„์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋‘‘์— ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  ์ง€์›์„ ํ•ด์ค€๋‹ค๋ฉด ์ •๋ง ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ๊ตฌํ˜„์— ๊ด€๊ณ„์—†์ด ์—ฌ์ „ํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ฝ”๋“œ๋ฅผ ๋” ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Go๊ฐ€ ์˜ค๋Š˜ ์—ด๊ฑฐํ•˜๋Š” ํ‘œ์ค€ ๋ฐฉ์‹(https://github.com/golang/go/issues/19814#issuecomment-290909885 ์ฐธ์กฐ)์ด ๊ฑฐ์˜ ์ •ํ™•ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๋ช‡ ๊ฐ€์ง€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ทธ๊ฒƒ๋“ค์€ ๋ฐ˜๋ณต๋  ์ˆ˜ ์—†๋‹ค
  2. ๊ทธ๋“ค์€ ๋ฌธ์ž์—ด ํ‘œํ˜„์ด ์—†์Šต๋‹ˆ๋‹ค
  3. ํด๋ผ์ด์–ธํŠธ๋Š” ๊ฐ€์งœ ์—ด๊ฑฐํ˜• ๊ฐ’์„ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” #1 ์—†์–ด๋„ ๊ดœ์ฐฎ์•„.
go:generate + stringer๋Š” #2์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ "์—ด๊ฑฐํ˜•"์˜ ๊ธฐ๋ณธ ์œ ํ˜•์„ int ๋Œ€์‹  ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“ค๊ณ  ๋ฌธ์ž์—ด ์ƒ์ˆ˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

3์€ ์˜ค๋Š˜์˜ ๋ฐ”๋‘‘์—์„œ ๋‹ค๋ฃจ๊ธฐ ํž˜๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ์ž˜ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์–ด๋ฆฌ์„์€ ์ œ์•ˆ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ํ˜• ์ •์˜์— explicit ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ‚ค์›Œ๋“œ๋Š” ํ•ด๋‹น ์œ ํ˜•์ด ์ •์˜๋œ ํŒจํ‚ค์ง€์˜ const ๋ธ”๋ก์—์„œ ๋ณ€ํ™˜์„ ์ œ์™ธํ•˜๊ณ  ์ด ์œ ํ˜•์œผ๋กœ์˜ ๋ณ€ํ™˜์„ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค. (๋˜๋Š” restricted ? ์•„๋‹ˆ๋ฉด enum ๊ฐ€ explicit type ?)

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์˜ˆ๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉํ•˜์—ฌ,

//go:generate stringer -type=SearchRequest
explicit type SearchRequest int

const (
    Universal SearchRequest = iota
    Web
    Images
    Local
    News
    Products
    Video
)

const ๋ธ”๋ก ๋‚ด์—์„œ int ์—์„œ SearchRequest ๋กœ์˜ ๋ณ€ํ™˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŒจํ‚ค์ง€ ์ž‘์„ฑ์ž๋งŒ ์ƒˆ SearchRequest ๊ฐ’์„ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹ค์ˆ˜๋กœ ๊ฐ’์„ ๋„์ž…ํ•  ๊ฐ€๋Šฅ์„ฑ์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค(์˜ˆ SearchRequest ๋ฅผ ์˜ˆ์ƒํ•˜๋Š” ํ•จ์ˆ˜์— int ์ „๋‹ฌ).

์ €๋Š” ์ด ์†”๋ฃจ์…˜์„ ์ ๊ทน์ ์œผ๋กœ ์ œ์•ˆํ•˜๊ณ  ์žˆ์ง€๋Š” ์•Š์ง€๋งŒ, don't-accidentally-construct-an-invalid-one์€ ์˜ค๋Š˜๋‚  Go์—์„œ ์บก์ฒ˜ํ•  ์ˆ˜ ์—†๋Š” ์—ด๊ฑฐํ˜•์˜ ๋‘๋“œ๋Ÿฌ์ง„ ์†์„ฑ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ณด๋‚ด์ง€ ์•Š์€ ํ•„๋“œ ๊ฒฝ๋กœ).

์—ด๊ฑฐํ˜•์˜ ํฅ๋ฏธ๋กœ์šด ์œ„ํ—˜์€ ์œ ํ˜•์ด ์ง€์ •๋˜์ง€ ์•Š์€ ์ƒ์ˆ˜์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์  ํ˜•์‹ ๋ณ€ํ™˜์„ ์ž‘์„ฑํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ์ž์‹ ์ด ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ์ƒํ™ฉ์—์„œ Go๊ฐ€ ๋ช…์‹œ์  ์œ ํ˜• ๋ณ€ํ™˜์„ ๊ธˆ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ธฐ๊บผ์ด ๊ณ ๋ คํ•˜๊ฒ ์ง€๋งŒ, ์ด๋Š” ์—ด๊ฑฐํ˜• ์œ ํ˜•์˜ ๊ฐœ๋…๊ณผ ์™„์ „ํžˆ ์ผ์น˜ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์œ ํ˜•์— ์ ์šฉ๋˜๋Š” ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํ˜•์‹ํ™”๋˜์ง€ ์•Š์€ ์ƒ์ˆ˜๋Š” ๋ช…์‹œ์  ํ˜•์‹ ๋ณ€ํ™˜์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ์‹ค์ˆ˜๋กœ ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ํ˜•์‹ ๊ฐ’์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ explicit ์— ๋Œ€ํ•œ @randall77 ์˜ ์ œ์•ˆ์€ ๋‹จ์ˆœํ•˜๊ฒŒ ํ˜•์‹ํ™”๋˜์ง€ ์•Š์€ ์ƒ์ˆ˜๊ฐ€ ์•”์‹œ์ ์œผ๋กœ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ๋กœ ๋‹จ์ˆœํ™”๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์  ํ˜•์‹ ๋ณ€ํ™˜์€ ํ•ญ์ƒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ • ์ƒํ™ฉ์—์„œ Go๊ฐ€ ๋ช…์‹œ์  ์œ ํ˜• ๋ณ€ํ™˜์„ ๊ธˆ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ธฐ๊บผ์ด ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ianlancetaylor ๋ช…์‹œ์ ์ด๋“  ์•”์‹œ์ ์ด๋“  ์„ ํƒ์ ์œผ๋กœ ์œ ํ˜• ๋ณ€ํ™˜์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ฒ˜์Œ์— ์ด ์ œ์•ˆ์„ ๋งŒ๋“ค๊ฒŒ ๋œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์›๋ž˜ ํŒจํ‚ค์ง€๋งŒ ์ƒ์„ฑํ•˜์—ฌ ๋ชจ๋“  ์œ ํ˜•์„ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. const ์„ ์–ธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ์œ ํ˜•์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ๋ฉด์—์„œ๋Š” enum ์†”๋ฃจ์…˜๋ณด๋‹ค ํ›จ์”ฌ ๋‚ซ์Šต๋‹ˆ๋‹ค.

@randall77 , @ianlancetaylor explicit ์ œ์•ˆ์ด ํ•ด๋‹น ์œ ํ˜•์˜ 0 ๊ฐ’๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@derekperkins ์œ ํ˜• ๋ณ€ํ™˜์„ ๋ชจ๋‘ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด encoding/* ํŒจํ‚ค์ง€์™€ ๊ฐ™์€ ์ผ๋ฐ˜ ์ธ์ฝ”๋”/๋””์ฝ”๋”์—์„œ ์ด๋Ÿฌํ•œ ์œ ํ˜•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@Merovius ๋‚ด ์ƒ๊ฐ์— @ianlancetaylor ๋Š” ์•”์‹œ์  ๋ณ€ํ™˜(์˜ˆ: ์ œํ•œ๋œ ์œ ํ˜•์— ์œ ํ˜•์ด ์ง€์ •๋˜์ง€ ์•Š์€ ์ƒ์ˆ˜ ํ• ๋‹น)์— ๋Œ€ํ•ด์„œ๋งŒ ์ œํ•œ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์  ๋ณ€ํ™˜์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

@griesemer ์•Œ์•„์š” :) ํ•˜์ง€๋งŒ @derekperkins ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์„ ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ช…์‹œ์  ๋ณ€ํ™˜์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์ด "๋ช…์‹œ์ " ํ•œ์ •์ž์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๋ฐ”๋กœ ๊ทธ ์ด์œ ๋ฅผ ํ›ผ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ž„์˜์˜ ๊ฐ’์„ "๋ช…์‹œ์ " ์œ ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ฃผ์–ด์ง„ ๊ฐ’์ด ์ง€๊ธˆ๋ณด๋‹ค ์—ด๊ฑฐ๋œ ์ƒ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋ผ๋Š” ๋ณด์žฅ์ด ๋” ์ด์ƒ ์—†์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์œ ํ˜•์ด ์ง€์ •๋˜์ง€ ์•Š์€ ์ƒ์ˆ˜์˜ ์šฐ์—ฐํ•˜๊ฑฐ๋‚˜ ์˜๋„ํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์— ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ช…์‹œ์  ๋ณ€ํ™˜์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด "๋ฐ”๋‘‘์˜ ์ •์‹ "์— ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•ด ์งˆ๋ฌธํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ช…์‹œ์  ๋ณ€ํ™˜์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์ฝ”๋“œ ์ž‘์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์œ ํ˜•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํฐ ์ง„์ „์„ ์ด๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Go๊ฐ€ ํ›„์ž์— ๋Œ€ํ•ด ๋ถ„๋ช…ํ•œ ์ž…์žฅ์„ ์ทจํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

@griesemer @Merovius @ianlancetaylor ์˜ ์ธ์šฉ๋ฌธ์„ ๋‹ค์‹œ ๊ฒŒ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ œ ์ œ์•ˆ์ด ์•„๋‹ˆ๋ผ ๊ทธ์˜ ์ œ์•ˆ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํŠน์ • ์ƒํ™ฉ์—์„œ Go๊ฐ€ ๋ช…์‹œ์  ์œ ํ˜• ๋ณ€ํ™˜์„ ๊ธˆ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ธฐ๊บผ์ด ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@rogpeppe ์™€ @Merovius ๋Š” ๋ชจ๋‘ ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด ์ข‹์€ ์ ์„ ์ง€์ ํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ์  ๋ณ€ํ™˜์„ ํ—ˆ์šฉํ•˜์ง€๋งŒ ์•”์‹œ์  ๋ณ€ํ™˜์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์œ ํšจํ•œ ์œ ํ˜•์„ ๋ณด์žฅํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜์ง€๋งŒ ์ผ๋ฐ˜ ์ธ์ฝ”๋”ฉ์„ ์žƒ๋Š” ๊ฒƒ์€ ๊ฝค ํฐ ๋‹จ์ ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์ €๊ธฐ์„œ ์šฐ์—ฌ๊ณก์ ˆ์ด ๋งŽ์•˜์ง€๋งŒ ์ข‹์€ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์•„์š”. ์—ฌ๊ธฐ์— ๋‚ด๊ฐ€ ๋ณด๊ณ  ์‹ถ์€ ๊ฒƒ(๋˜๋Š” ์œ ์‚ฌํ•œ ๊ฒƒ)์ด ์š”์•ฝ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋งํ•œ ๊ฒƒ๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์–ธ์–ด ๋””์ž์ด๋„ˆ๋‚˜ ์ปดํŒŒ์ผ๋Ÿฌ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ๊ณต๊ฐœ์ ์œผ๋กœ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์ž˜ ์ž‘๋™ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ๊ธฐ๋ณธ ์œ ํ˜•(string, uint, int, rune ๋“ฑ)์—๋งŒ ๊ธฐ๋ฐ˜์„ ๋‘” ์—ด๊ฑฐํ˜•. ๊ธฐ๋ณธ ์œ ํ˜•์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ uint?
  2. ์—ด๊ฑฐํ˜•์˜ ๋ชจ๋“  ์œ ํšจํ•œ ๊ฐ’์€ ์œ ํ˜• ์„ ์–ธ -- ์ƒ์ˆ˜๋กœ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜•์‹ ์„ ์–ธ์— ์„ ์–ธ๋˜์ง€ ์•Š์€ ์ž˜๋ชป๋œ ๊ฐ’์€ ์—ด๊ฑฐํ˜• ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  3. ๋””๋ฒ„๊น…์„ ์œ„ํ•œ ์ž๋™ ๋ฌธ์ž์—ด ํ‘œํ˜„(์žˆ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค).
  4. ์ปดํŒŒ์ผ ํƒ€์ž„์€ ์—ด๊ฑฐํ˜•์˜ switch ๋ฌธ์—์„œ ์™„์ „์„ฑ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ์ ์œผ๋กœ ( go vet ?๋ฅผ ํ†ตํ•ด) default ์ผ€์ด์Šค๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ–ฅํ›„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์ด๋ฏธ ์ฒ ์ €ํ•œ(์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š”) ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
  5. 0 ๊ฐ’์€ ๋ณธ์งˆ์ ์œผ๋กœ ์œ ํšจํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค(์—ด๊ฑฐํ˜• ์„ ์–ธ์— ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹˜). ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์Šฌ๋ผ์ด์Šค๊ฐ€ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ nil ๊ฐ€ ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ๊ฒƒ์€ _์•„๋งˆ๋„_ ์•ฝ๊ฐ„ ๋…ผ๋ž€์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ํšจ๊ณผ๊ฐ€ ์žˆ์„์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์ง€๋งŒ ์˜๋ฏธ์ƒ์œผ๋กœ ์ ํ•ฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. nil ์Šฌ๋ผ์ด์Šค๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ nil ์— ๋Œ€ํ•œ ์ˆ˜ํ‘œ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ณต์— ๊ด€ํ•ด์„œ๋Š” ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ทธ๋กœ ์ธํ•œ ํ”ผํ•ด๋Š” ๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์„ ์–ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์˜ ์˜ˆ:

type MetadataBlockType enum[uint] {
    StreamInfo:    0
    Padding:       1
    Application:   2
    SeekTable:     3
    VorbisComment: 4
    CueSheet:      5
    Picture:       6
}

๋˜ํ•œ ์œ ํ˜•์„ ์œ ์ถ”ํ•˜๊ณ  "์  ๊ตฌ๋ฌธ"์„ ์‚ฌ์šฉํ•˜๋Š” Swift ์Šคํƒ€์ผ์€ _์ข‹์€_์ด์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค .

์—ด๊ฑฐํ˜• ์ •์ˆ˜ํ˜•
์ƒ์ˆ˜ (
์•Œ ์ˆ˜ ์—†๋Š” EnumA = iota
AAA
)


์œ ํ˜• EnumB int
์ƒ์ˆ˜ (
์•Œ ์ˆ˜ ์—†๋Š” EnumB = iota
๋น„๋น„๋น„
)

๋‹จ์ผ Go ํŒŒ์ผ์ด๋‚˜ ๋™์ผํ•œ ํŒจํ‚ค์ง€์— ๋‘ ๊ฐœ์˜ ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์‹ฌ์ง€์–ด ํ•˜๋‚˜๋ผ๋„ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Enum์„ ๊ตฌํ˜„ํ•˜๋Š” C# ๋ฐฉ์‹์„ ๊ตฌํ˜„ํ•˜์‹ญ์‹œ์˜ค.
์œ ํ˜• ์š”์ผ ์—ด๊ฑฐํ˜• {Sat, Sun, Mon, Tue, Wed, Thu, Fri}
type Days enum[int] { Sat:1 , Sun, Tue, Wed, Thu, Fri}
type Days enum[string] { Sat: "Saturay" , Sun:"Sunday" ๋“ฑ}

@KamyarM ๊ทธ๋ณด๋‹ค ๋‚˜์€ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

type Days int
const (
  Sat Days = 1+iota
  Sun
  ...
)

๊ทธ๋ฆฌ๊ณ 

type Days string
const (
  Sat Days = "Saturday"
  Sun      = "Sunday"
  ...
)

์ƒˆ๋กœ์šด ์ ‘๊ทผ ๋ฐฉ์‹/์ธ์ˆ˜์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ์ œํ•œํ•˜๋„๋ก ์นœ์ ˆํ•˜๊ฒŒ ์š”์ฒญํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ด ์Šค๋ ˆ๋“œ๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์†Œ์Œ/๋ฐ˜๋ณต์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋“ค์˜ ์‹œ๊ฐ„๊ณผ ๊ด€์‹ฌ์„ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ธ์‹๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. โ†‘ ์ด์ „ ๋Œ“๊ธ€์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‹ต๋ณ€์„ ํฌํ•จํ•˜์—ฌ ๋งŽ์€ ํ† ๋ก ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋งํ•œ ๋ชจ๋“  ๊ฒƒ์— ๋™์˜ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๊ณ  ์–ด๋Š ์ชฝ๋„ ์ง€๊ธˆ๊นŒ์ง€ ๊ทธ ๋…ผ์˜์˜ ๊ฒฐ๊ณผ๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹จ์ˆœํžˆ ๊ทธ๊ฒƒ์„ ๋ฌด์‹œํ•ด๋„ ์ƒ์‚ฐ์ ์ธ ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜์•„๊ฐ€๋Š” ๋ฐ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ช…๋ช… ์ถฉ๋Œ ๋ฌธ์ œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์–ธ๊ธ‰ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์—†๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์ž˜ ๊ตฌ์„ฑํ–ˆ์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ํ•ญ๋ชฉ์„ ์ œํ•œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์œ ํ˜•์˜ ๊ฐ์ฒด์— ์š”์ผ์ด ์•„๋‹Œ ์ •์ˆ˜๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
var a ์ผ
a = 10
์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์‹ค์ œ๋กœ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์—ด๊ฑฐํ˜•์€ ๋ณ„๋กœ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ ์™ธ์—๋Š” GoLand์™€ ๊ฐ™์€ IDE์—์„œ ๋” ์ž˜ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๋Ÿฐ ๊ฒƒ์„๋ณด๊ณ  ์‹ถ๋‹ค

type WeekDay enum string {
  Monday "mon"
  Tuesday "tue"
  // etc...
}

๋˜๋Š” ์ž๋™ iota ์‚ฌ์šฉ:

// this assumes that iota automatically assigned to the first declared enum key
// and values have unsigned integer type
// value is positional, so if you decide to rename your key 
// you don't have to change everything in db
// also it is easy to grow your lists
type WeekDay enum {
  Monday
  Tuesday
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‚ฌ์šฉ์ด ๊ฐ„ํŽธํ•˜๊ณ  ๊ฐ„ํŽธํ•ด์ง‘๋‹ˆ๋‹ค.

func makeItWorkOn(day WeekDay) {
  // your implementation
}

๋˜ํ•œ enum์—๋Š” ๊ฐ’์„ ๊ฒ€์ฆํ•˜๋Š” ๋‚ด์žฅ ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์–ด์•ผ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

if day in WeekDay {
  makeItWorkOn(day)
}

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ๊ฒƒ๋“ค:

if day == WeekDay.Monday {
 // whatever
}

์†”์งํžˆ ๋งํ•ด์„œ, ๋‚ด๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ๊ตฌ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค(KISS).

// type automatically inferred from values or `iota`
enum WeekDay {
  Monday "mon"
  Tuesday "tue"
}

@zoonman ๋งˆ์ง€๋ง‰ ์˜ˆ์ œ๋Š” Go์˜ ๋‹ค์Œ ์›์น™์„ ๋”ฐ๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์„ ์–ธ์€ func ๋กœ ์‹œ์ž‘ํ•˜๊ณ , ์œ ํ˜• ์„ ์–ธ์€ type ๋กœ ์‹œ์ž‘ํ•˜๊ณ , ๋ณ€์ˆ˜ ์„ ์–ธ์€ var ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. , ...

@md2perpe ์ €๋Š” Go "์œ ํ˜•" ์›์น™์„ ๋”ฐ๋ฅด๋ ค๊ณ  ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งค์ผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ œ๊ฐ€ ๋”ฐ๋ฅด๋Š” ์œ ์ผํ•œ ์›์น™์€ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
_์›์น™์„ ๋”ฐ๋ฅด๊ธฐ ์œ„ํ•ด_ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ๋ณด๋‹ค ๋” ๋งŽ์€ ์‹œ๊ฐ„์ด ๋‚ญ๋น„๋ฉ๋‹ˆ๋‹ค.
TBH ๋ฐ”๋‘‘ ์ดˆ๋ณด์ž์ง€๋งŒ ๋น„ํŒํ•  ๋ถ€๋ถ„์ด ๋งŽ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด:

struct User {
  Id uint
  Email string
}

๋ณด๋‹ค ์“ฐ๊ธฐ ์‰ฝ๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

type User struct {
  Id uint
  Email string
}

์œ ํ˜•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์˜ˆ๋ฅผ ์•Œ๋ ค๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// this is terrible because it blows your mind off
// especially if you Go newbie
// this should not be allowed by compiler/linter:
w := map[string]interface{}{"type": 0, "connected": true}

// it has to be splitted into type definition
type WeirdJSON map[string]interface{}

// and used like
w := WeirdJSON{"type": 0, "connected": true}

๋‚˜๋Š” Asm, C, C++, Pascal, Perl, PHP, Ruby, Python, JavaScript, TypeScript, ์ง€๊ธˆ์€ Go๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ๋ชจ๋“  ๊ฒƒ์„ ๋ณด์•˜๋‹ค. ์ด ๊ฒฝํ—˜์€ ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฝ๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์•ผ ํ•จ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

๊ธฐ๊ณ„ ํ•™์Šต ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  MIDI ํŒŒ์ผ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ฑฐ๊ธฐ์—์„œ SMPTE ํƒ€์ž„์ฝ”๋“œ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” iota์™€ ๊ด€์šฉ์  ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฝค ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์ง€๋งŒ, ๊ทธ๊ฒƒ์ด ๋‚˜๋ฅผ ๋ง‰์ง€๋Š” ๋ชปํ•œ๋‹ค)

const (
        SMTPE0 int8 = ((-24 - (1 + (iota - 1) * 3) % 6 * (iota - 1) / ((iota - 1) | 0x01)) - 10 * ((iota - 1) % 2) - 5 * (iota / 3 - iota / 4) ) * iota / (iota | 0x01)
    SMTPE24 
    SMTPE25
    SMTPE29
    SMTPE30
)
const (
   _SMTPE0 int8 = 0 
   _SMTPE24 int8 = -24
   _SMTPE25 int8 = -25
   _SMTPE29 int8 = -29
   _SMTPE30 int8 = -30
)

๋ฌผ๋ก  ๋ฐฉ์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค...

func IsSMTPE(status int8) bool {
    j := 4
    for i:= 0; i >= -30; i -= j % 6{
        if i == int(status){ 
            return true
        }
        j+=3
    }

    return status == 0
}

ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ์ฐธ์กฐ

์—ด๊ฑฐํ˜•์€ ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ๋ผ์ด๋ธŒ๋ฅผ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜•์€ ๋„๊ตฌ์ผ ๋ฟ์ด๋ฏ€๋กœ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•˜๊ณ  ์ƒ์‚ฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. C++, C# ๋˜๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๊ฐ™์ด Go 2์—์„œ ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ๋Š” ๋†๋‹ด์ด์ง€๋งŒ โ€‹โ€‹๋ฌธ์ œ๋ฅผ ๋ถ„๋ช…ํžˆ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

@treeter12 ๊ท€ํ•˜์˜ ์˜ˆ๊ฐ€ "๋ฌธ์ œ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์—ฌ ์ฃผ๋Š”" ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜•์ด ์–ด๋–ป๊ฒŒ ์ด ์ฝ”๋“œ๋ฅผ ๋” ๋‚ซ๊ฑฐ๋‚˜ ๋” ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค๊นŒ์š”?

enum๊ณผ ๋™์ผํ•œ ๋…ผ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•œ C# ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 public enum SMTPE : sbyte
   {
        SMTPE0 = 0,
        SMTPE24 = -24,
        SMTPE25 = -25,
        SMTPE29 = -29,
        SMTPE30 = -30
   }

   public class TestClass
   {
        public readonly SMTPE smtpe;

        public TestClass(SMTPE smtpe)
        {
            this.smtpe = smtpe;
        }
   } 

์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  2. ํŒ€๋ณ„ ์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑ์„ ํฌ๊ฒŒ ์ค„์ž…๋‹ˆ๋‹ค(์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์ž˜๋ชป๋œ ๊ฐ’์„ ์ „๋‹ฌํ•  ์ˆ˜ ์—†์Œ).
  3. ๊ทธ๊ฒƒ์€ iota ๊ฐœ๋…๊ณผ ๋ชจ์ˆœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  4. ์ƒ์ˆ˜์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ์ด๋ฆ„์ด ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ๋…ผ๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค(์ƒ์ˆ˜๊ฐ€ ์ผ๋ถ€ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ํ”„๋กœํ† ์ฝœ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•จ).
  5. ToString() ๋ฉ”์„œ๋“œ๋ฅผ ์•„๋‚ ๋กœ๊ทธ๋กœ ๋งŒ๋“ค์–ด ๊ฐ’์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (CONNECTION_ERROR.NO_INTERNET์€ 0x12๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค). ์ŠคํŠธ๋ง๊ฑฐ์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•œ ๋ช…์‹œ์  ์ฝ”๋“œ ์ƒ์„ฑ์€ ์—†์Šต๋‹ˆ๋‹ค.
  6. ์ผ๋ถ€ ์–ธ์–ด์—์„œ๋Š” ๊ฐ’, ๋ฒ”์œ„ ๋“ฑ์˜ ๋ฐฐ์—ด์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  7. ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๋™์•ˆ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค(๋จธ๋ฆฌ์—์„œ ๊ณ„์‚ฐํ•  ํ•„์š” ์—†์Œ).

๊ฒฐ๊ตญ ๋ช‡ ๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ ์ธ์  ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์„ฑ๋Šฅ์„ ์ ˆ์•ฝํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

@streeter12 ์˜๋ฏธ๋ฅผ ๋ช…ํ™•ํžˆ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ Go ์ƒ์ˆ˜์— ๋น„ํ•ด ์œ ์ผํ•œ ์žฅ์ ์€ ์œ ํ˜• ์‹œ์Šคํ…œ์ด ์—ด๊ฑฐํ˜• ๊ฐ’ ์ค‘ ํ•˜๋‚˜ ์™ธ์— ๋‹ค๋ฅธ ๊ฐ’์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ž˜๋ชป๋œ ๊ฐ’์„ ๋„์ž…ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ์ง€๋งŒ ๋Œ€๊ฐ€๋„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ด ์—ด๊ฑฐํ˜•์„ ํ•ด๋‹น ์ฝ”๋“œ ์™ธ๋ถ€๋กœ ํ™•์žฅํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ์™ธ๋ถ€ ์—ด๊ฑฐํ˜• ํ™•์žฅ์€ Go์—์„œ ํ‘œ์ค€ ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ์ฃผ์š” ์ด์œ  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

์ผ๋ถ€ ํ™•์žฅ์ด ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ํ•„์š”์— ๋‹ตํ•˜์‹ญ์‹œ์˜ค.
FE๋Š” ์ƒํƒœ ๋จธ์‹ ์ด ์—ด๊ฑฐํ˜• ๋Œ€์‹  ์ƒํƒœ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ด๊ฑฐํ˜•์—๋Š” ๊ณ ์œ ํ•œ ๋ฒ”์œ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ด๊ฑฐ ํ˜•์—†์ด ๋ช‡ ๊ฐ€์ง€ ํฐ ํ”„๋กœ์ ํŠธ๋ฅผ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค. enum ์™ธ๋ถ€ ์ •์˜ ์ฝ”๋“œ๋ฅผ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์€ ๋”์ฐํ•œ ์•„ํ‚คํ…์ฒ˜ ๊ฒฐ์ •์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋‹น์‹ ์˜ ๋™๋ฃŒ๊ฐ€ ํ•˜๋Š” ์ผ์„ ํ†ต์ œํ•  ์ˆ˜ ์—†๊ณ  ๊ทธ๊ฒƒ์€ ๋ช‡ ๊ฐ€์ง€ ์žฌ๋ฏธ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค)

๊ทธ๋ฆฌ๊ณ  ๋งŽ์€ ๊ฒฝ์šฐ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ์˜ค๋ฅ˜๋ฅผ ํฌ๊ฒŒ ์ค„์ด๋Š” ์ธ์  ์š”์†Œ ์—ด๊ฑฐ๋ฅผ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค.

@streeter12 ๋ถˆํ–‰ํžˆ๋„ ํ˜„์‹ค์€ ์ข…์ข… ์—ด๊ฑฐํ˜•์„ ํ™•์žฅํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

enum/sum ์œ ํ˜•์„ ํ™•์žฅํ•˜๋Š” @griesemer ๋Š” ๋ณ„๋„์˜ ๋•Œ๋กœ๋Š” ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ์œ ํ˜•์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์—ด๊ฑฐํ˜•/ํ•ฉ๊ณ„์— ๋Œ€ํ•œ ๋ช…์‹œ์  ์œ ํ˜•์ด ์—†๋”๋ผ๋„ Go์—์„œ๋Š” ์—ฌ์ „ํžˆ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€์— {1, 2, 3} ๊ฐ’์ด ํ•„์š”ํ•œ "์—ด๊ฑฐํ˜• ์œ ํ˜•"์ด ์žˆ๊ณ  "ํ™•์žฅ๋œ ์—ด๊ฑฐํ˜• ์œ ํ˜•"์—์„œ 4๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์—ฌ์ „ํžˆ ์•”์‹œ์  "์œ ํ˜•"์˜ ๊ณ„์•ฝ์„ ์œ„๋ฐ˜ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ด๊ฑฐํ˜•/ํ•ฉ๊ณ„๋ฅผ ํ™•์žฅํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋•Œ๋•Œ๋กœ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ช…์‹œ์  To/From ๋ณ€ํ™˜ ํ•จ์ˆ˜๋„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ ๋˜๋Š” #19412์™€ ๊ฐ™์€ ์œ ์‚ฌํ•œ ์ œ์•ˆ์— ๋Œ€ํ•œ ๊ทธ ์ฃผ์žฅ๊ณผ ์‚ฌ๋žŒ๋“ค ์‚ฌ์ด์˜ ๋‹จ์ ˆ์€ "๋•Œ๋•Œ๋กœ ๋ณ€ํ™˜ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ" ๋Œ€์‹  "์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ฝ”๋“œ๋ฅผ ํ•ญ์ƒ ์ž‘์„ฑ"ํ•˜๋Š” ๊ฒƒ์ด ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„๋ผ๋Š” ๊ฒƒ์ด ์ด์ƒํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๋‹ค์‹œ ์จ์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค."

์–ด๋Š ์ชฝ์ด ์˜ณ๋‹ค ๊ทธ๋ฅด๋‹ค๊ฑฐ๋‚˜ ๊ทธ๊ฒƒ์ด ๊ณ ๋ ค๋˜์–ด์•ผ ํ•  ์œ ์ผํ•œ ์ ˆ์ถฉ์•ˆ์ด๋ผ๋Š” ๋ง์€ ์•„๋‹ˆ์ง€๋งŒ, ๋‚˜๋Š” ๋‚ด๊ฐ€ ์•Œ์•„์ฐจ๋ฆฐ ์–‘์ชฝ ์‚ฌ์ด์˜ ์˜์‚ฌ์†Œํ†ต์—์„œ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์‹๋ณ„ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ ๋˜๋Š” #19412์™€ ๊ฐ™์€ ์œ ์‚ฌํ•œ ์ œ์•ˆ์— ๋Œ€ํ•œ ๊ทธ ์ฃผ์žฅ๊ณผ ์‚ฌ๋žŒ๋“ค ์‚ฌ์ด์˜ ๋‹จ์ ˆ์€ "๋•Œ๋•Œ๋กœ ๋ณ€ํ™˜ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ" ๋Œ€์‹  "์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ฝ”๋“œ๋ฅผ ํ•ญ์ƒ ์ž‘์„ฑ"ํ•˜๋Š” ๊ฒƒ์ด ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„๋ผ๋Š” ๊ฒƒ์ด ์ด์ƒํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๋‹ค์‹œ ์จ์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค."

์•„์ฃผ ์ž˜ ์ง„์ˆ 

@jimmyfrasche ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ๊ฐœ์ธ์ ์œผ๋กœ ์ ˆ์ถฉ์•ˆ์„ ์„ค๋ช…ํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ €๋Š” "์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ฝ”๋“œ๋ฅผ ํ•ญ์ƒ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ"๊ณผ "Go๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋ฐฐ์šฐ๊ณ  ์ดํ•ดํ•ด์•ผ ํ•˜๋Š” ์œ ํ˜• ์‹œ์Šคํ…œ์— ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๊ฐœ๋…์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ"์ด๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ์‹์œผ๋กœ ๋งํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ, Go์˜ ์—ด๊ฑฐํ˜• ์œ ํ˜•์—์„œ ๋ˆ„๋ฝ๋œ ์œ ์ผํ•œ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์€ ์œ ํ˜•ํ™”๋˜์ง€ ์•Š์€ ์ƒ์ˆ˜์˜ ํ• ๋‹น ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์—†๊ณ  ๋ช…์‹œ์  ๋ณ€ํ™˜์— ๋Œ€ํ•œ ๊ฒ€์‚ฌ๊ฐ€ ์—†์œผ๋ฉฐ ๋ชจ๋“  ๊ฐ’์ด ์Šค์œ„์น˜. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ ๋ชจ๋‘ ์—ด๊ฑฐ๋œ ์œ ํ˜•์˜ ๊ฐœ๋…๊ณผ ๋…๋ฆฝ์ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด๊ฐ€ ์—ด๊ฑฐํ˜•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด Go์—๋„ ์—ด๊ฑฐํ˜•์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒฐ๋ก ์— ์ด๋ฅด๊ฒŒ ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ, ์—ด๊ฑฐํ˜•์€ ์ด๋Ÿฌํ•œ ๋ˆ„๋ฝ๋œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ๋“ค์„ ์–ป๊ธฐ ์œ„ํ•ด ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ •๋ง๋กœ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ์–ธ์–ด ๋ณต์žก์„ฑ์˜ ์ฆ๊ฐ€๊ฐ€ ์ด์ ์„ ๋ˆ„๋ฆด ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@ianlancetaylor ์–ธ์–ด์— ๋ณต์žก์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ๊ณ ๋ คํ•ด์•ผ ํ•  ์œ ํšจํ•œ ์‚ฌํ•ญ์ด๋ฉฐ "๋‹ค๋ฅธ ์–ธ์–ด์— ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—"๋Š” ํ™•์‹คํžˆ ๋…ผ์Ÿ๊ฑฐ๋ฆฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์—ด๊ฑฐํ˜•์ด ๊ทธ ์ž์ฒด๋กœ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋“ค์˜ ์ผ๋ฐ˜ํ™”, ํ•ฉ๊ณ„ ์œ ํ˜•์€ ํ™•์‹คํžˆ ๋‚˜์—๊ฒŒ ๋งŽ์€ ์ƒ์ž๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค).

์œ ํ˜•์ด ํ• ๋‹น ๊ฐ€๋Šฅ์„ฑ์„ ์„ ํƒ ํ•ด์ œํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์€ ์ข‹์„ ๊ฒƒ์ด์ง€๋งŒ ์ด๊ฒƒ์ด ๊ธฐ๋ณธ ํ˜•์‹ ์™ธ๋ถ€์—์„œ ์–ผ๋งˆ๋‚˜ ๋„๋ฆฌ ์œ ์šฉํ• ์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์œ ํšจํ•œ ๊ฐ’์˜ ์ „์ฒด ๋ชฉ๋ก์„ ์•Œ๋ ค์ฃผ์ง€ ์•Š๊ณ  "์Šค์œ„์น˜์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ชจ๋“  ๊ฐ’ ํ™•์ธ"์ด๋ผ๋Š” ๊ฐœ๋…์ด ์–ผ๋งˆ๋‚˜ ์ผ๋ฐ˜ํ™”๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜• ๋ฐ ํ•ฉ๊ณ„ ์œ ํ˜• ์™ธ์— ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ Ada์˜ ๋ฒ”์œ„ ์œ ํ˜•๊ณผ ๊ฐ™์€ ๊ฒƒ์ด์ง€๋งŒ ๋ณ€ํ™˜ ๋˜๋Š” ๋ฐ˜์˜๋  ๋•Œ๋งˆ๋‹ค ์˜คํ”„์…‹์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด 0์ด ๋ฒ”์œ„์— ์žˆ๊ฑฐ๋‚˜ ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด 0 ๊ฐ’๊ณผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—. (๋‹ค๋ฅธ ์–ธ์–ด์—๋Š” ์œ ์‚ฌํ•œ ์œ ํ˜•์˜ ํŒจ๋ฐ€๋ฆฌ๊ฐ€ ์žˆ๊ณ  ์ผ๋ถ€๋Š” ํŒŒ์Šค์นผ ํŒจ๋ฐ€๋ฆฌ์— ์žˆ์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” Ada๊ฐ€ ์œ ์ผํ•ฉ๋‹ˆ๋‹ค)

์–ด์จŒ๋“ , ๋‚˜๋Š” ๊ตฌ์ฒด์ ์œผ๋กœ ๋‹ค์Œ์„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ Go ์ƒ์ˆ˜์— ๋น„ํ•ด ์œ ์ผํ•œ ์žฅ์ ์€ ์œ ํ˜• ์‹œ์Šคํ…œ์ด ์—ด๊ฑฐํ˜• ๊ฐ’ ์ค‘ ํ•˜๋‚˜ ์™ธ์— ๋‹ค๋ฅธ ๊ฐ’์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ž˜๋ชป๋œ ๊ฐ’์„ ๋„์ž…ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ์ง€๋งŒ ๋Œ€๊ฐ€๋„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ด ์—ด๊ฑฐํ˜•์„ ํ•ด๋‹น ์ฝ”๋“œ ์™ธ๋ถ€๋กœ ํ™•์žฅํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ์™ธ๋ถ€ ์—ด๊ฑฐํ˜• ํ™•์žฅ์€ Go์—์„œ ํ‘œ์ค€ ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ์ฃผ์š” ์ด์œ  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ 

๋ถˆํ–‰ํžˆ๋„ ํ˜„์‹ค์€ ์ข…์ข… ์—ด๊ฑฐํ˜•์„ ํ™•์žฅํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งํ•œ ์ด์œ  ๋•Œ๋ฌธ์— ๊ทธ ์ฃผ์žฅ์€ ๋‚˜์—๊ฒŒ ํšจ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@jimmyfrasche ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค; ์–ด๋ ค์šด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Go์—์„œ ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ์ƒ์ˆ˜ ๊ฐ’์„ ๋ฐ˜๋ณตํ•  ํ•„์š” ์—†์ด ์ƒ์ˆ˜ ์‹œํ€€์Šค๋ฅผ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค.

(์ง€์—ฐ ๋ฐœ์†ก - https://github.com/golang/go/issues/19814#issuecomment-349158748์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ๋ฐœ์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค.)

@griesemer ์‹ค์ œ๋กœ Go 1์— ๋Œ€ํ•œ ์˜ฌ๋ฐ”๋ฅธ ์š”์ฒญ์ด์—ˆ์ง€๋งŒ ์ผ๋ถ€๋Š” Go 2์— ๋Œ€ํ•ด ์žฌํ‰๊ฐ€ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ธ์–ด์—๋Š” ์—ด๊ฑฐํ˜•์—์„œ ์›ํ•˜๋Š” _๊ฑฐ์˜_ ๋ชจ๋“  ๊ฒƒ์„ ์–ป์„ ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜• ์ •์˜๋ณด๋‹ค ๋” ๋งŽ์€ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ์ƒ์„ฑ๊ธฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์—ด๊ฑฐํ˜• ์œ ํ˜•๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์–ป๋Š” ๋Œ€์‹  ์ƒํ™ฉ์— ๋งž๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ https://play.golang.org/p/7ud_3lrGfx ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  1. ์ •์˜ ํŒจํ‚ค์ง€ ๋‚ด์˜ ์•ˆ์ „
  2. ์™„์ „์„ฑ์„ ์œ„ํ•ด ์Šค์œ„์น˜๋ฅผ ๋ฆฐํŠธํ•˜๋Š” ๊ธฐ๋Šฅ

๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ž‘๊ณ  ๋‹จ์ˆœํ•œ ํ•ฉ๊ณ„ ์œ ํ˜•โ€ ์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ๋” ์–ด์ƒ‰ํ•˜๋ฏ€๋กœ https://github.com/golang/go/issues/19412#issuecomment -323208336๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์ถ”๊ฐ€๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์–ธ์–ด๋Š” ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ์—์„œ ๋ฌธ์ œ 1๊ณผ 2๋ฅผ ํ”ผํ•˜๋Š” ์—ด๊ฑฐํ˜• ์œ ํ˜•์„ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ€  ์ด ๊ตฌ์„ฑ์˜ json.Token ์Šค์ผ€์น˜๋Š” https://play.golang.org/p/YFffpsvx5e ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์šฐ๋ฆฌ๋Š” ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„๊ฐ€ "์–ด์จŒ๋“  ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๋ณ€ํ™˜ ํ•จ์ˆ˜๋ฅผ ๊ฐ€๋” ์ž‘์„ฑ" ๋Œ€์‹  "ํ•ญ์ƒ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ"ํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ - ์ ์ง„์ ์ธ ์ˆ˜๋ฆฌ ๋ฅผ ๊ฐ•๋ ฅํžˆ ์ง€์ง€ํ•˜๋Š” ์ง„์˜์˜ ๋Œ€ํ‘œ์ž - ์ด๊ฒƒ์€ ์˜ฌ๋ฐ”๋ฅธ(ish) ์ ˆ์ถฉ์•ˆ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์†”์งํžˆ, ์ ์ง„์  ์ˆ˜๋ฆฌ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜์ง€ ์•Š๋”๋ผ๋„ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋” ๋‚˜์€ ๋ฉ˜ํƒˆ ๋ชจ๋ธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฒซ์งธ, type-checked enum์€ ์–ด์จŒ๋“  ์†Œ์Šค ์ฝ”๋“œ์— ์‚ฝ์ž…๋œ ๊ฐ’๋งŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜•์ด ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ด๋™ํ•˜๊ฑฐ๋‚˜ ๋””์Šคํฌ์— ์œ ์ง€๋˜๊ฑฐ๋‚˜ ํ”„๋กœ์„ธ์Šค ๊ฐ„์— ๊ตํ™˜๋˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ๋ฒ ํŒ…์ด ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค(๋Œ€๋ถ€๋ถ„์˜ ์—ด๊ฑฐํ˜• ์‚ฌ์šฉ์ด ์ด ๋ฒ”์ฃผ์— ์†ํ•จ). ๋”ฐ๋ผ์„œ ๋Ÿฐํƒ€์ž„์— ๋น„ํ˜ธํ™˜์„ฑ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์œ ํšจํ•˜์ง€ ์•Š์€ ์—ด๊ฑฐํ˜• ๊ฐ’์„ ๋งŒ๋‚ฌ์„ ๋•Œ ๋ณดํŽธ์ ์œผ๋กœ ์ ์šฉ๋˜๋Š” ๊ธฐ๋ณธ ๋™์ž‘์€ ์—†์Šต๋‹ˆ๋‹ค. ์ข…์ข… ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๊ฐ•์ œ ๋ณ€ํ™˜ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์žฌ์ง๋ ฌํ™” ์‹œ ์†์‹ค๋˜์ง€ ์•Š๋„๋ก ๋ณด์กดํ•˜๊ณ  ์ „๋‹ฌํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์œ ํšจ์„ฑ์ด ํ™•์ธ๋˜๊ณ  ํ•„์š”ํ•œ ๋™์ž‘์ด ๊ตฌํ˜„๋˜๋Š” ์‹ ๋ขฐ ๊ฒฝ๊ณ„๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ํ•ด๋‹น ๊ฒฝ๊ณ„ ๋‚ด์˜ ๋ชจ๋“  ๊ฒƒ์ด ํ•ด๋‹น ๋™์ž‘์„ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ •์‹ ์  ๋ชจ๋ธ์€ ์ด ์‹ ๋ขฐ ๊ฒฝ๊ณ„๊ฐ€ ๊ณผ์ •์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ๋ชจ๋“  ์ฝ”๋“œ๋Š” ์›์ž์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜๊ณ  ๋‚ด๋ถ€์ ์œผ๋กœ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ์ •์‹ ์  ๋ชจ๋ธ์€ ์ ์ง„์ ์ธ ์ˆ˜๋ฆฌ๋ผ๋Š” ์•„์ด๋””์–ด์— ์˜ํ•ด ์นจ์‹๋ฉ๋‹ˆ๋‹ค. ๊ฐ‘์ž๊ธฐ, ์ž์—ฐ์ ์ธ ์‹ ๋ขฐ ๊ฒฝ๊ณ„๋Š” ์›์ž์  ์ˆ˜๋ฆฌ๋ฅผ ์ ์šฉํ•˜๋Š” ๋‹จ์œ„์™€ ์ผ๊ด€์„ฑ์ด ์žˆ๋‹ค๊ณ  ์‹ ๋ขฐํ•˜๋Š” ๋‹จ์œ„๋กœ์„œ ํŒจํ‚ค์ง€(๋˜๋Š” ์ €์žฅ์†Œ)๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ฐœ์ธ์ ์œผ๋กœ ์ €๋Š” ๊ทธ๊ฒƒ์ด ์ž๊ธฐ ์ผ๊ด€์„ฑ์˜ ๋งค์šฐ ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ํ›Œ๋ฅญํ•œ ๋‹จ์œ„๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๋Š” ์˜๋ฏธ ์ฒด๊ณ„, ๊ทœ์น™ ๋ฐ ๊ทœ์น™์„ ๋จธ๋ฆฟ์†์— ๊ฐ„์งํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์ปค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ์œ ํ˜• ์ˆ˜์ค€์ด ์•„๋‹Œ ํŒจํ‚ค์ง€ ์ˆ˜์ค€์—์„œ ์ž‘๋™ํ•˜๋Š” ์ด์œ ์™€ ์ตœ์ƒ์œ„ ์„ ์–ธ์˜ ๋ฒ”์œ„๊ฐ€ ํ”„๋กœ๊ทธ๋žจ ์ˆ˜์ค€์ด ์•„๋‹Œ ํŒจํ‚ค์ง€ ์ˆ˜์ค€์ธ ์ด์œ ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ์ˆ˜์ค€์—์„œ๋„ ์•Œ ์ˆ˜ ์—†๋Š” ์—ด๊ฑฐํ˜• ๊ฐ’์˜ ์˜ฌ๋ฐ”๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ™•์ธํ•˜๊ณ  ๋‚ด๋ถ€์ ์œผ๋กœ ์›ํ•˜๋Š” ๋™์ž‘์„ ์œ ์ง€ํ•˜๋Š” ๋‚ด๋ณด๋‚ด์ง€ ์•Š์€ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ฒ ์ €ํ•œ ๊ฒ€์‚ฌ๋ฅผ ํฌํ•จํ•˜์—ฌ ์œ ํ˜• ๊ฒ€์‚ฌ๋œ ์—ด๊ฑฐํ˜•์„ ๊ฐ–๋Š” ์ œ์•ˆ๋ณด๋‹ค ๋ชจ๋“  ์Šค์œ„์น˜์— ๊ธฐ๋ณธ ์ผ€์ด์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ์ œ์•ˆ์— ํ›จ์”ฌ ๋” ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

@Merovius ์šด์˜ ์ฒด์ œ ํ”„๋กœ์„ธ์Šค์™€ ํŒจํ‚ค์ง€๋Š” ๋‘˜ ๋‹ค ์‹ ๋ขฐ ๊ฒฝ๊ณ„์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค ์™ธ๋ถ€์—์„œ ๋“ค์–ด์˜ค๋Š” ์ •๋ณด๋Š” ์œ ์ž…๋  ๋•Œ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•ด์•ผ ํ•˜๋ฉฐ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ํ‘œํ˜„์œผ๋กœ ๋น„์ •๋ ฌํ™”๋˜์–ด์•ผ ํ•˜๋ฉฐ ์‹คํŒจํ•  ๊ฒฝ์šฐ ์ ์ ˆํ•œ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๊ฒฐ์ฝ” ์‚ฌ๋ผ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฑฐ๊ธฐ์— ํ•ฉ๊ณ„/์—ด๊ฑฐํ˜• ์œ ํ˜•์— ํŠน์ •ํ•œ ๊ฒƒ์„ ์‹ค์ œ๋กœ ๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•ด์„œ๋„ ๊ฐ™์€ ๋ง์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ์ถ”๊ฐ€ ํ•„๋“œ๋‚˜ ๋„ˆ๋ฌด ์ ์€ ํ•„๋“œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ฒด๋Š” ์—ฌ์ „ํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์—ด๊ฑฐํ˜• ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ชจ๋ธ๋งํ•˜๋Š” ํŠน์ • ์‚ฌ๋ก€๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด

type FromTheNetwork enum {
  // pretend all the "valid" values are listed here
  Missing // the value was not included in the message
  Unknown // the value was not in the set of the valid values
  Error // there was an error attempting to read the value
}

ํ•ฉ๊ณ„ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋” ๋‚˜์•„๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type FromTheNetwork pick {
  Missing struct{} // Not included in message
  Valid somepkg.TheSumBeingReceived // Include valid states with composition
  Unknown []byte // Raw bytes of unknown value received
  Error error // The error from attempting to read the value
}

(์ „์ž๋Š” ์˜ค๋ฅ˜ ์‚ฌ๋ก€์— ํŠน์ •ํ•œ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ๊ตฌ์กฐ์ฒด์—์„œ ์œ ์ง€๋˜์ง€ ์•Š๋Š” ํ•œ ์œ ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ ํ•ด๋‹น ํ•„๋“œ์˜ ์œ ํšจ์„ฑ์€ ์—ด๊ฑฐํ˜• ๊ฐ’์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. sum ์œ ํ˜•์€ ๋ณธ์งˆ์ ์œผ๋กœ a์ด๋ฏ€๋กœ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ•„๋“œ๋งŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์ฒด์ž…๋‹ˆ๋‹ค.)

ํŒจํ‚ค์ง€ ์ˆ˜์ค€์—์„œ ์—ฌ์ „ํžˆ ๋†’์€ ์ˆ˜์ค€์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜์ง€๋งŒ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋Š” ์œ ํ˜•๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์œ ํ˜•์˜ ๋„๋ฉ”์ธ์„ ์ค„์ด๋ฉด ํŒจํ‚ค์ง€๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๋จธ๋ฆฌ ์†์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํŽธ์ง‘๊ธฐ๊ฐ€ ๋ชจ๋“  case X: ํ–‰์„ ์ž‘์„ฑํ•˜๊ณ  ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์ฑ„์šฐ๋„๋ก ๋‚จ๊ฒจ๋‘๊ฑฐ๋‚˜ ๋ฆฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„๊ตฌ์— ๋Œ€ํ•œ ์˜๋„๊ฐ€ ๋” ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค. ์ด์ „์— ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ฒ ์ €ํ•จ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค).

๋‚˜๋Š” ๊ฑฐ๊ธฐ์— ํ•ฉ๊ณ„/์—ด๊ฑฐํ˜• ์œ ํ˜•์— ํŠน์ •ํ•œ ๊ฒƒ์„ ์‹ค์ œ๋กœ ๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•ด์„œ๋„ ๊ฐ™์€ ๋ง์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ์ถ”๊ฐ€ ํ•„๋“œ๋‚˜ ๋„ˆ๋ฌด ์ ์€ ํ•„๋“œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ฒด๋Š” ์—ฌ์ „ํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

(ํ˜„์žฌ iota์—์„œ ๊ตฌ์„ฑํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€) ๊ฐœ๋ฐฉํ˜• ์—ด๊ฑฐํ˜•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๋‹น์—ฐํžˆ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋‹ซํžŒ ์—ด๊ฑฐํ˜•(์‚ฌ๋žŒ๋“ค์ด ์—ด๊ฑฐํ˜•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ)์ด๋‚˜ ์ฒ ์ €ํ•œ ๊ฒ€์‚ฌ๊ฐ€ ํฌํ•จ๋œ ์—ด๊ฑฐํ˜•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ ํ™•์‹คํžˆ ํŠน๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ํ™•์žฅํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ตฌ์กฐ์ฒด์™€์˜ ๋น„์œ ๋Š” ์ด๊ฒƒ์„ ๋‹ค์†Œ ์™„๋ฒฝํ•˜๊ฒŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. Go 1 ํ˜ธํ™˜์„ฑ ์•ฝ์†์€ ํ‚ค๊ฐ€ ์—†๋Š” ๊ตฌ์กฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์„ ๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ‚ค๊ฐ€ ์žˆ๋Š” ๊ตฌ์กฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ go vet์ด ์ด๋ฅผ ํ™•์ธํ•˜๋Š” "์ตœ๊ณ "๋กœ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๊ฐ„์ฃผ๋˜๋Š” ๊ด€ํ–‰์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์œ ๋Š” ์ •ํ™•ํžˆ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ‚ค๊ฐ€ ์—†๋Š” ๊ตฌ์กฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ตฌ์กฐ์ฒด๋Š” ๋” ์ด์ƒ ํ™•์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋„ค. ์ด์™€ ๊ด€๋ จํ•˜์—ฌ ๊ตฌ์กฐ์ฒด๋Š” ์—ด๊ฑฐํ˜•๊ณผ ์ •ํ™•ํžˆ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค๋Š” ๋ฐ ์ปค๋ฎค๋‹ˆํ‹ฐ๋กœ์„œ ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, ์—ด๊ฑฐํ˜• ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ชจ๋ธ๋งํ•˜๋Š” ํŠน์ • ์‚ฌ๋ก€๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์˜ˆ๋Š” ํŒจํ‚ค์ง€ ๊ฒฝ๊ณ„๊ฐ€ ์•„๋‹Œ ํ”„๋กœ์„ธ์Šค ๊ฒฝ๊ณ„(๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•จ์œผ๋กœ์จ)๋งŒ ๋‹ค๋ฃน๋‹ˆ๋‹ค. FromTheNetwork ์— "InvalidInternalState"๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ํŒจํ‚ค์ง€๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜๊ธฐ ์ „์— ์Šค์œ„์น˜๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ ์ง„์  ๋ณต๊ตฌ ๋ชจ๋ธ์—์„œ๋Š” ํ™•์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์— ์ปดํŒŒ์ผํ•˜๋ ค๋ฉด ๊ธฐ๋ณธ ์ผ€์ด์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋ฉด ์—ด๊ฑฐํ˜•์— ์•„๋ฌด๋Ÿฐ ์˜๋ฏธ๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์—ด๊ฑฐํ˜•์„ ์—ฌ๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์œ ํ˜•์˜ ๋„๋ฉ”์ธ์„ ์ค„์ด๋ฉด ํŒจํ‚ค์ง€๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๋จธ๋ฆฌ ์†์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋„๊ตฌ์— ๋Œ€ํ•œ ์˜๋„๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜์—ฌ ํŽธ์ง‘๊ธฐ๊ฐ€ ๋ชจ๋“  ๋Œ€์†Œ๋ฌธ์ž X: ํ–‰์„ ์ž‘์„ฑํ•˜๊ณ  ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์ฑ„์šฐ๋„๋ก ๋‚จ๊ฒจ๋‘๊ฑฐ๋‚˜ ๋ฆฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฅผ ์œ„ํ•ด ์œ ํ˜•์œผ๋กœ ์‹ค์ œ ์—ด๊ฑฐํ˜•์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ linting ๋„๊ตฌ๋Š” iota ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ $ const -declarations ๋ฅผ ๋ฐœ๊ฒฌ์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ชจ๋“  ์ผ€์ด์Šค๋Š” ์ง€์ •๋œ ์œ ํ˜•์ด๊ณ  "์—ด๊ฑฐํ˜•"์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ์›ํ•˜๋Š” ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์Šค์œ„์น˜์— ๊ธฐ๋ณธ๊ฐ’์ด ์žˆ์–ด์•ผ ํ•˜๊ฑฐ๋‚˜ ๋ชจ๋“  (์•Œ๋ ค์ง„) ๊ฒฝ์šฐ๋ฅผ ํ™•์ธํ•ด์•ผ ํ•˜๋Š” ์ž๋™ ์™„์„ฑ ๋˜๋Š” ๋ฆฐํŒ…์„ ๋•๊ธฐ ์œ„ํ•ด ์ด๋Ÿฌํ•œ "๊ด€๋ก€์— ๋”ฐ๋ฅธ ์—ด๊ฑฐํ˜•"์„ ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„ ๊ทธ๋ ‡๊ฒŒ ํ–‰๋™ํ•˜๋Š” enum-keyword๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์—ด๊ฑฐํ˜•์ด ์—ด๋ ค ์žˆ๊ณ (๋ชจ๋“  ์ •์ˆ˜ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ) ์ถ”๊ฐ€ ๋ฒ”์œ„๋ฅผ ์ œ๊ณตํ•˜๊ณ  ๋ชจ๋“  ์Šค์œ„์น˜์— ๊ธฐ๋ณธ๊ฐ’์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋‚ด ์ผ์ •์„ ํ•ด์น˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค). ๊ทธ๊ฒƒ์ด ์ œ์•ˆ๋œ ๊ฒƒ์ด๋ผ๋ฉด - ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ์ œ์•ˆ์„ ์ง€์ง€ํ•˜๋Š” ๋Œ€๋‹ค์ˆ˜(๋ฌผ๋ก  ์ดˆ๊ธฐ ํ…์ŠคํŠธ๋Š” ์•„๋‹˜)๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ ์ง„์ ์ธ ๋ณต๊ตฌ์™€ ํ™•์žฅ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์˜ ์ค‘์š”์„ฑ์— ๋Œ€ํ•ด ๋™์˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์€ ์˜๋ฏธ๋ก ์  ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ๋“ค์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ ํ•œ๋‹ค๋ฉด ์—ด๊ฑฐํ˜•์„ ํ•ด๋กญ๊ฑฐ๋‚˜ ๋ฌด์˜๋ฏธํ•˜๋‹ค๊ณ  ๋ณด๋Š” ๊ฒƒ์ด ์™„๋ฒฝํ•˜๊ฒŒ ํƒ€๋‹นํ•˜๊ณ  ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ๋Œ€๋‹ตํ•˜๊ณ  ์žˆ๋˜ ์งˆ๋ฌธ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ํ™•์ธํ•˜๋Š” ๋Œ€์‹  ๋ชจ๋“  ๊ณณ์—์„œ ํ™•์ธ์„ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์„ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์ ˆ์ถฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•. ๋‹ต๋ณ€: API์˜ ํ™•์žฅ์„ฑ๊ณผ ์ง„ํ™”๋ฅผ ์ค‘์‹œํ•จ์œผ๋กœ์จ ์–ด์จŒ๋“  ์‚ฌ์šฉ ์‚ฌ์ดํŠธ์—์„œ ์ด๋Ÿฌํ•œ ํ™•์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋•Œ๋•Œ๋กœ enum์˜ ๋ฐ˜๋Œ€์ž๋“ค์€ ํ™•์žฅํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ๋งํ–ˆ์ง€๋งŒ ์ง๋ ฌํ™”/์ „ํ™˜ ํ›„์—๋„ ์—ฌ์ „ํžˆ ํ™•์ธ์ด ํ•„์š”ํ•˜๋ฉฐ ํ˜ธํ™˜์„ฑ ๋“ฑ์„ ๋‹ค์‹œ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์—ด๊ฑฐํ˜• ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ ์ฃผ์š” ๋ฌธ์ œ๋Š” ๊ฐœ๋ฐœ ๋ฐ ๊ตฌ์„ฑ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ„ฐ๋ฌด๋‹ˆ์—†๋Š” ์˜ˆ๋ฅผ ์ œ์‹œํ•˜๋ ค๊ณ  ํ•˜์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์ƒํ™ฉ์„ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ˆ 1. ์ €๋Š” ์ €์ˆ˜์ค€ ๊ฐœ๋ฐœ์ž์ด๊ณ  ์ผ๋ถ€ ๋ ˆ์ง€์Šคํ„ฐ ์ฃผ์†Œ, ํ™•๋ฆฝ๋œ ์ €์ˆ˜์ค€ ํ”„๋กœํ† ์ฝœ ๊ฐ’ ๋“ฑ์— ๋Œ€ํ•ด const๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ Go์—์„œ๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์†”๋ฃจ์…˜์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ๊ฒฝ์šฐ์— ์ถ”์•…ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— iota ์—†์ด const๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. . ํ•˜๋‚˜์˜ ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ์ƒ์ˆ˜ ๋ธ”๋ก์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” 20๊ฐœ์˜ ์ƒ์ˆ˜๋ฅผ ๋ชจ๋‘ ์–ป์—ˆ๊ณ  ๊ทธ๋“ค์ด ๊ฐ™์€ ์œ ํ˜•๊ณผ ๋น„์Šทํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๊ฐ€ ํฌ๋ฉด ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉ์–ด์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ, TDD๋กœ ์ด๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ์ค‘๋ณต ๊ฒ€์‚ฌ ์ฝ”๋“œ(์ค‘๋ณต ์ฝ”๋“œ = ์ค‘๋ณต ์˜ค๋ฅ˜/ํ…Œ์ŠคํŠธ)๋ฅผ ์ฐจ๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ „์†ก์„ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์‚ฌํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ด ๊ฒฝ์šฐ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(ํ”„๋กœ๋•์…˜์—์„œ ๋ ˆ์ง€์Šคํ„ฐ ์ฃผ์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ์ƒํ™ฉ์„ ์ฐพ์•„๋ณด์‹ญ์‹œ์˜ค.)). ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ๊ฐ€๋” ํŒŒ์ผ/๋„ท ๋“ฑ์—์„œ ์–ป์€ ๊ฐ’์ด ๋ฒ”์œ„ ๋‚ด์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์ง€๋งŒ ์ด๋ฅผ ์ค‘์•™ ์ง‘์ค‘ํ™”ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค(c# Enum.TryParse ์ฐธ์กฐ).์˜ˆ๋ฅผ ๋“ค์–ด). enum์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๊ฒฝ์šฐ ๊ฐœ๋ฐœ ์‹œ๊ฐ„๊ณผ ์„ฑ๋Šฅ์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ 2. ์ƒํƒœ/์˜ค๋ฅ˜ ๋กœ์ง์ด ์žˆ๋Š” ์ž‘์€ ๋ชจ๋“ˆ์„ ๊ฐœ๋ฐœ ์ค‘์ž…๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜•์„ ๋น„๊ณต๊ฐœ๋กœ ์„ค์ •ํ•˜๋ฉด ์•„๋ฌด๋„ ์ด ์—ด๊ฑฐํ˜•์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•˜๋ฉฐ 1์˜ ๋ชจ๋“  ์ด์ ๊ณผ ํ•จ๊ป˜ ๋ฌธ์ œ ์—†์ด ๋ณ€๊ฒฝ/ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋น„๊ณต๊ฐœ ๋…ผ๋ฆฌ์— ๊ธฐ๋ฐ˜ํ•œ ๊ฒฝ์šฐ ๊ฐœ๋ฐœ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ 3. ๊ด‘๋ฒ”์œ„ํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์œ„ํ•ด ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“ˆ์„ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต๊ฐœ ๋…ผ๋ฆฌ/์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์—ด๊ฑฐํ˜• ๋˜๋Š” ๋‹ค๋ฅธ ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ด์ƒํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜์— ์ƒˆ ์—ด๊ฑฐํ˜• ๋ฒˆํ˜ธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ๋ชจ๋ธ ์ƒํƒœ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๊ณ  ๋””์Šคํฌ์— ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ๋ณด๋‹ค ์ถฉ๋Œ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์—ญ์ˆœ์‘์„ฑ/ํ™•์žฅ ๋ฌธ์ œ๊ฐ€ ์—ด๊ฑฐํ˜•์ด ์•„๋‹ˆ๋ผ ๊ฐœ๋ฐœ ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์–ด๋–ค ์—ด๊ฑฐํ˜•์ด ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•œ๋‹ค๋ฉด ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ์ถฉ๋ถ„ํ•œ ๋Šฅ๋ ฅ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์ƒ๊ฐ์— consts์™€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ enum์˜ ์ฃผ์š” ์ฐจ์ด์ ์€ enum์—๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๊ณ„์•ฝ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. ๋„ค์ด๋ฐ ๊ณ„์•ฝ.
  2. ๊ฐ€์น˜ ๊ณ„์•ฝ.
    ์ด ๋‹จ๋ฝ์— ๋Œ€ํ•œ ์ฐฌ์„ฑ๊ณผ ๋ฐ˜๋Œ€์˜ ๋ชจ๋“  ์ฃผ์žฅ์€ ์ด์ „์— ๊ณ ๋ ค๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    ๊ณ„์•ฝ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ด๊ฒƒ์˜ ์ด์ ์„ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋‹ค๋ฅธ ๊ฒƒ๋“ค์— ๋‹จ์ ์ด ์žˆ๋Š”์ง€ ์—ด๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
๋ธŒ๋ ˆ์ดํฌ ํ˜ธํ™˜์„ฑ ์—†์ด๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ SOLID ์›์น™์—์„œ O๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์ด๋Š” ์—ด๊ฑฐํ˜•๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ผ๋ฐ˜์ ์ธ ๊ฐœ๋ฐœ์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๋Š” ๋ณ‘๋ ฌ ๋…ผ๋ฆฌ์™€ ๊ฐ€๋ณ€ ๊ตฌ์กฐ์ฒด๋กœ ๋‚ด ํ”„๋กœ๊ทธ๋žจ์„ ๋ชป์ƒ๊ฒผ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋ณ€ ๊ตฌ์กฐ๋ฅผ ๊ธˆ์ง€ํ•˜์ž? ์ด ๋Œ€์‹  ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ/๋ณ€๊ฒฝ ๋ถˆ๊ฐ€ ๊ตฌ์กฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ฐœ๋ฐœ์ž๊ฐ€ ์„ ํƒํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ƒ์œผ๋กœ Iota์—๋„ ๋‹จ์ ์ด ์žˆ๋‹ค๋Š” ์ ์„ ๋ง์”€๋“œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  1. ํ•ญ์ƒ int ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๋จธ๋ฆฌ์— ๊ฐ’์„ ๊ณ„์‚ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์„ ํ—ˆ๋น„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฌธ์ œ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
    enums/const๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด F12๋ฅผ ๋ˆŒ๋Ÿฌ ๋ชจ๋“  ๊ฐ’์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. Iota ํ‘œํ˜„์‹์€ ์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ฝ”๋“œ ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค.
    ์ผ๋ถ€ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ iota ์‚ฌ์šฉ์„ ์™„์ „ํžˆ ๊ฑฐ๋ถ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ด๊ฑฐ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ฆฌ์„์€ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์‹ญ์‹œ์˜ค.

๋ฌด๋š๋šํ•œ ๋ง์„ ํ•ด์„œ ์‹ค๋ก€ํ•ฉ๋‹ˆ๋‹ค๋งŒ, ์ด ๋Œ“๊ธ€ ์ดํ›„์— ๋‹น์‹ ์ด ์—ฌ๊ธฐ์— ์„ค ๊ทผ๊ฑฐ๊ฐ€ ๋ณ„๋กœ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ๋‹น์‹ ์ด ๋งํ•œ ๋Œ€๋กœ ํ•˜์ง€๋„ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์ด ์–ผ๋งˆ๋‚˜ ํ•„์š”ํ•œ์ง€ ๋ณด์—ฌ์ฃผ๊ณ  ๊ทธ๋“ค์ด ์–ผ๋งˆ๋‚˜ ์ƒ์ฒ˜๋ฅผ ์ฃผ๋Š”์ง€ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์˜ˆ๋ฅผ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋™์˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ ์–ด๋„ ๋ชจ๋‘๊ฐ€ ์„ ์˜๋กœ ๋…ผ์Ÿํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์‹œ์˜ˆ 1

๋‚˜๋Š” ๋‹น์‹ ์—๊ฒŒ "๋“ฑ๋ก ์ด๋ฆ„"์„ ์ •๋ง๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์œผ๋กœ ์ค„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ํ”„๋กœํ† ์ฝœ ๊ฐ’๊ณผ ๊ด€๋ จํ•˜์—ฌ ํ™•์žฅ์„ฑ๊ณผ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ์ž„์˜์˜ ๊ฐ’์„ ์ทจํ•˜๋„๋ก ํ•˜๋Š” ์ž…์žฅ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ๋‹จํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, proto2 -> proto3์—๋Š” ์ •ํ™•ํžˆ ๊ทธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ํ•™์Šต๋œ ๊ฒฝํ—˜์—์„œ ๊ทธ๋ ‡๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์–ด๋Š ์ชฝ์ด๋“ , ๋‚˜๋Š” ๋ฆฐํ„ฐ๊ฐ€ ์ด๊ฒƒ์„ ์žก์ง€ ๋ชปํ•˜๋Š” ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” 20๊ฐœ์˜ ์ƒ์ˆ˜๋ฅผ ๋ชจ๋‘ ์–ป์—ˆ๊ณ  ๊ทธ๋“ค์ด ๊ฐ™์€ ์œ ํ˜•๊ณผ ๋น„์Šทํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๊ฐ€ ํฌ๋ฉด ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฆ„์„ ์ž˜๋ชป ์ž…๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ ์—ด๊ฑฐํ˜•์„ ๋‹ซ์•„๋„ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐํ˜ธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  int/string-literals๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ.

์‹ค์‹œ์˜ˆ 2

๊ฐœ์ธ์ ์œผ๋กœ 'ํฐ ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹ˆ๋‹ค'๋ผ๋Š” ์„ ์— '๋‹จ์ผ ํŒจํ‚ค์ง€'๋ฅผ ํ™•๊ณ ํžˆ ๋‘๋Š” ํŽธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์—ด๊ฑฐํ˜•์„ ํ™•์žฅํ•  ๋•Œ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ์žŠ๊ฑฐ๋‚˜ ์ฝ”๋“œ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•  ๊ฐ€๋Šฅ์„ฑ์ด ํ›จ์”ฌ ์ ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์–ด๋Š ์ชฝ์ด๋“ , ๋‚˜๋Š” ๋ฆฐํ„ฐ๊ฐ€ ์ด๊ฒƒ์„ ์žก์ง€ ๋ชปํ•˜๋Š” ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์‹ค์‹œ์˜ˆ 3

์ด๊ฒƒ์ด ์—ด๊ฑฐํ˜•์— ๋Œ€ํ•ด ์ œ์‹œ๋˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ์‚ฌ๋ก€: ์ด ํŠน์ • ๋ฌธ์ œ๋Š” ์ด๋ฅผ ๊ทผ๊ฑฐ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž์ฃผ ์–ธ๊ธ‰๋˜๋Š” ๋˜ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋Š” ์œ„์žฅ๋œ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜์ธ syscall์ž…๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์˜ ์ผ๋ฐ˜ํ™”๋Š” "๋‘ ๊ฐœ ์ด์ƒ์˜ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœ๋œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ด๋Ÿฌํ•œ ๊ฐ’์„ ๊ตํ™˜ํ•˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ"๋กœ, ๋ฏฟ์„ ์ˆ˜ ์—†์„ ์ •๋„๋กœ ๊ด‘๋ฒ”์œ„ํ•˜๋ฉฐ, ์ด์— ๋Œ€ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ ์ ์ง„์  ์ˆ˜๋ฆฌ ๋ชจ๋ธ์—์„œ๋Š” ๋‚ด๋ณด๋‚ธ ๋ชจ๋“  API๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. .

FTR, ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์—ด๊ฑฐํ˜•์ด ํ•ด๋กญ๋‹ค๋Š” ๊ฒƒ์„ ๋ˆ„๊ตฌ์—๊ฒŒ๋„ ๋‚ฉ๋“์‹œํ‚ค๋ ค ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์ €๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค). ๋‚ด๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ทธ๋“ค์ด ๊ทธ๋Ÿฌํ•œ ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์™œ ๋‚ด๊ฐ€ ๊ทธ๋“ค์—๊ฒŒ ์œ ๋ฆฌํ•œ ์ฃผ์žฅ์ด ์„ค๋“๋ ฅ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.

ํ•ญ์ƒ int ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

iota ๋Š” (๋ฐ˜๋“œ์‹œ ๊ทธ๋ ‡์ง€๋Š” ์•Š์ง€๋งŒ ๋ฌด์—‡์ด๋“ ), const ๋ธ”๋ก์€ ๊ทธ๋ ‡์ง€ ์•Š๊ณ  ๋‹ค์–‘ํ•œ ์ƒ์ˆ˜ ์œ ํ˜•์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์ œ์•ˆ๋˜๋Š” ์—ด๊ฑฐํ˜• ๊ตฌํ˜„์˜ ์ƒ์œ„ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.

๋จธ๋ฆฌ์— ๊ฐ’์„ ๊ณ„์‚ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ด๊ฒƒ์„ ์—ด๊ฑฐํ˜•์„ ์œ„ํ•œ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜• ์„ ์–ธ์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ƒ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Iota ํ‘œํ˜„์‹์€ ์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ฝ”๋“œ ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  ํ‘œํ˜„์‹์„ ํ…Œ์ŠคํŠธํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์ฆ‰์‹œ ๋ช…๋ฐฑํ•˜๋‹ค๋ฉด, ํ…Œ์ŠคํŠธ๋Š” ๊ณผ์ž‰์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ƒ์ˆ˜๋ฅผ ์ ์–ด ๋‘์‹ญ์‹œ์˜ค. ์–ด์จŒ๋“  ํ…Œ์ŠคํŠธ์—์„œ ๊ทธ๋ ‡๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

iota ๋Š” ํ˜„์žฌ Go์—์„œ ์—ด๊ฑฐํ˜•์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค. const ์„ ์–ธ์€ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. iota ๋Š” ์—ฐ์†์ ์ด๊ฑฐ๋‚˜ ํ˜•์‹์ ์ธ const ์„ ์–ธ์„ ์ž‘์„ฑํ•  ๋•Œ ํƒ€์ดํ•‘์„ ์ €์žฅํ•˜๋Š” ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์˜ˆ, Go์˜ ๊ฐœ๋ฐฉํ˜• ์—ด๊ฑฐํ˜•์—๋Š” ๋ถ„๋ช…ํžˆ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ์œ„์—์„œ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์–ธ๊ธ‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์Šค์œ„์น˜์˜ ๊ฒฝ์šฐ๋ฅผ ์žŠ์–ด๋ฒ„๋ ค ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ˆ˜๋กœ ์ž˜๋ชป๋œ ๊ฐ’์ด ๋˜๋Š”(๋ฒ„๊ทธ๋กœ ์ด์–ด์ง€๋Š”) ๋น„ ๊ธฐํ˜ธ ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๊ณ ์ •๋œ ์†”๋ฃจ์…˜(์—ด๊ฑฐํ˜• ์œ ํ˜•)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ํŠน์ • ์ ˆ์ถฉ์ ์— ๋Œ€ํ•ด ๋…ผ์Ÿํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ด๋Ÿฌํ•œ ๋‹จ์ ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์ œ์•ˆ๋œ ์†”๋ฃจ์…˜์˜ ๋‹จ์ ์— ๋Œ€ํ•ด ์ธก์ •ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ƒ์‚ฐ์ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ ๋Œ€๋ถ€๋ถ„์˜ ๋‹จ์ ์€ ํŠน์ • ์ข…๋ฅ˜์˜ const ์„ ์–ธ์„ ๊ฐ์ง€ํ•˜๊ณ  ์‚ฌ์šฉ๋ฒ•์„ ํ™•์ธํ•˜๋Š” linter-tool์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ์–ธ์–ด์—์„œ ๋Œ€๋ถ€๋ถ„ ์‹ค์šฉ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„ค์ž„ ์ŠคํŽ˜์ด์‹ฑ์€ ์ด๋Ÿฐ ์‹์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ…๋„ ์—ด๊ฑฐํ˜•๊ณผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์—๊ฒŒ "๋“ฑ๋ก ์ด๋ฆ„"์„ ์ •๋ง๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์œผ๋กœ ์ค„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ํ”„๋กœํ† ์ฝœ ๊ฐ’๊ณผ ๊ด€๋ จํ•˜์—ฌ ํ™•์žฅ์„ฑ๊ณผ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ์ž„์˜์˜ ๊ฐ’์„ ์ทจํ•˜๋„๋ก ํ•˜๋Š” ์ž…์žฅ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ๋‹จํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, proto2 -> proto3์—๋Š” ์ •ํ™•ํžˆ ๊ทธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ํ•™์Šต๋œ ๊ฒฝํ—˜์—์„œ ๊ทธ๋ ‡๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ํ™•๋ฆฝ๋œ ๊ฐ€์น˜๋ฅผ ๋งํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค. Fe wav ํ˜•์‹ ๊ธฐ๋ฐ˜์€ ์ˆ˜๋…„ ๋™์•ˆ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ๋›ฐ์–ด๋‚œ ๋ฐฑ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ฐ’์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜๊ณ  ์ผ๋ถ€ ๊ฐ’์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฆ„์„ ์ž˜๋ชป ์ž…๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ ์—ด๊ฑฐํ˜•์„ ๋‹ซ์•„๋„ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐํ˜ธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  int/string-literals๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ.

์˜ˆ, ์ข‹์€ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๋ฐ๋Š” ๋„์›€์ด ๋˜์ง€ ์•Š์ง€๋งŒ ํ•œ ์ด๋ฆ„์œผ๋กœ ๋ช‡ ๊ฐ€์ง€ ๊ฐ’์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ๋Š” ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ž๋™ ํƒ€์ดํ•‘์„ ํ†ตํ•ด ๋ณ€ํ˜• ์ˆ˜๋ฅผ ํ•˜๋‚˜๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์—ด๊ฑฐํ˜•์— ๋Œ€ํ•ด ์ œ์‹œ๋˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ์‚ฌ๋ก€: ์ด ํŠน์ • ๋ฌธ์ œ๋Š” ์ด๋ฅผ ๊ทผ๊ฑฐ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž์ฃผ ์–ธ๊ธ‰๋˜๋Š” ๋˜ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋Š” ์œ„์žฅ๋œ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜์ธ syscall์ž…๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์˜ ์ผ๋ฐ˜ํ™”๋Š” "๋‘ ๊ฐœ ์ด์ƒ์˜ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœ๋œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ด๋Ÿฌํ•œ ๊ฐ’์„ ๊ตํ™˜ํ•˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ"๋กœ, ๋ฏฟ์„ ์ˆ˜ ์—†์„ ์ •๋„๋กœ ๊ด‘๋ฒ”์œ„ํ•˜๋ฉฐ, ์ด์— ๋Œ€ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ ์ ์ง„์  ์ˆ˜๋ฆฌ ๋ชจ๋ธ์—์„œ๋Š” ๋‚ด๋ณด๋‚ธ ๋ชจ๋“  API๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. .

๊ทธ๋Ÿฌ๋‚˜ ์ƒ์ˆ˜/์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉ/์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์„ ์ œ๊ฑฐํ•˜์ง€ ์•Š์œผ๋ฉฐ ์—ฌ์ „ํžˆ ์—ญ์ˆœ์‘์„ฑ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฌธ์ œ๊ฐ€ enums/const๊ฐ€ ์•„๋‹ˆ๋ผ ์šฐ๋ฆฌ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์žˆ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ 'ํฐ ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹ˆ๋‹ค'๋ผ๋Š” ์„ ์— '๋‹จ์ผ ํŒจํ‚ค์ง€'๋ฅผ ํ™•๊ณ ํžˆ ๋‘๋Š” ํŽธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์—ด๊ฑฐํ˜•์„ ํ™•์žฅํ•  ๋•Œ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ์žŠ๊ฑฐ๋‚˜ ์ฝ”๋“œ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•  ๊ฐ€๋Šฅ์„ฑ์ด ํ›จ์”ฌ ์ ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ์—๋„ ์ด๋ฆ„ ๋ณ€ํ™˜ ๋ฐ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ํ™•์ธ์˜ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ํ‘œํ˜„์‹์„ ํ…Œ์ŠคํŠธํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์ฆ‰์‹œ ๋ช…๋ฐฑํ•˜๋‹ค๋ฉด, ํ…Œ์ŠคํŠธ๋Š” ๊ณผ์ž‰์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ƒ์ˆ˜๋ฅผ ์ ์–ด ๋‘์‹ญ์‹œ์˜ค. ์–ด์จŒ๋“  ํ…Œ์ŠคํŠธ์—์„œ ๊ทธ๋ ‡๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Ofcouuse ๋‚˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ ๋ผ์ธ์„ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ์„ ๋ก€๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ด๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ฑฐ๋‚˜ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ iota ์—†์ด ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๋‚˜์˜ ์˜ค๋ž˜๋œ ์˜ˆ๋Š” ๋‹จ์ง€ ๋†๋‹ด์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ด๊ฒƒ์„ ์—ด๊ฑฐํ˜•์„ ์œ„ํ•œ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜• ์„ ์–ธ์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ƒ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ด๊ฑฐํ˜•์— ๋Œ€ํ•œ ์ธ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

@๋ฉ”๋กœ๋น„์šฐ์Šค

์šฐ๋ฆฌ๊ฐ€ ๋‹ซํžŒ ์—ด๊ฑฐํ˜•(์‚ฌ๋žŒ๋“ค์ด ์—ด๊ฑฐํ˜•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ)์ด๋‚˜ ์ฒ ์ €ํ•œ ๊ฒ€์‚ฌ๊ฐ€ ํฌํ•จ๋œ ์—ด๊ฑฐํ˜•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ ํ™•์‹คํžˆ ํŠน๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ํ™•์žฅํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์•ˆ์ „ํ•˜๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด

package p
type Enum int
const (
  A Enum = iota
  B
  C
)
func Make() Enum {...}
func Take(Enum) {...}

๊ทธ๋ฆฌ๊ณ 

package q
import "p"
const D enum = p.C + 1

q ๋‚ด์—์„œ $#$ D ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค( p Enum(3) ์— ๋Œ€ํ•œ ์ž์ฒด ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ํ•œ). ๋‹ค์‹œ p ๋กœ ์ „๋‹ฌ: p.Make ์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์ƒํƒœ๋ฅผ D ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ p.Take ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. q.D ์ „๋‹ฌ๋˜์ง€ ์•Š๊ณ  A , B , C ์ค‘ ํ•˜๋‚˜๋งŒ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

package q
import "p"
type Enum int
const (
    A = p.A
    B = p.B
    C = p.C
    D = C + 1
)
// needs to return an error if passed D or an unknown state of Enum
func To(Enum) (p.Enum, error) {...}
// needs to return an error if p.Enum has a value not known to the author
// at the time this package was written.
func From(p.Enum) (Enum, error) {...}

์–ธ์–ด์— ๋‹ซํžŒ ์œ ํ˜•์ด ์žˆ๋“  ์—†๋“  ๋‹น์‹ ์€ ๋‹ซํžŒ ์œ ํ˜•์„ ๊ฐ–๋Š” ๋ชจ๋“  ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‹น์‹ ์„ ๊ฐ์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์˜ˆ๋Š” ํŒจํ‚ค์ง€ ๊ฒฝ๊ณ„๊ฐ€ ์•„๋‹Œ ํ”„๋กœ์„ธ์Šค ๊ฒฝ๊ณ„(๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•จ์œผ๋กœ์จ)๋งŒ ๋‹ค๋ฃน๋‹ˆ๋‹ค. FromTheNetwork์— "InvalidInternalState"๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ํŒจํ‚ค์ง€๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜๊ธฐ ์ „์— ์Šค์œ„์น˜๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ ์ง„์  ๋ณต๊ตฌ ๋ชจ๋ธ์—์„œ๋Š” ํ™•์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์— ์ปดํŒŒ์ผํ•˜๋ ค๋ฉด ๊ธฐ๋ณธ ์ผ€์ด์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋ฉด ์—ด๊ฑฐํ˜•์— ์•„๋ฌด๋Ÿฐ ์˜๋ฏธ๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์—ด๊ฑฐํ˜• ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์œ„์™€ ๊ฐ™์ด ์ˆ˜ํ–‰ํ•˜๊ณ  ์ถ”๊ฐ€ ์ƒํƒœ ๋ฐ ์“ฐ๊ธฐ ๋ณ€ํ™˜ ๊ธฐ๋Šฅ์œผ๋กœ ๊ณ ์œ ํ•œ ๋ฒ„์ „์„ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ sum ์œ ํ˜•์€ ์—ด๊ฑฐํ˜•์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ์—๋„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋งค์šฐ ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ "ํ™•์žฅ"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์˜ˆ๋ฅผ ๋“ค์—ˆ์ง€๋งŒ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์ฃผ์–ด์ง„

package p
type Enum pick {
  A, B, C struct{}
}

Enum ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด "ํ™•์žฅ"๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

package q
import "p"
type Enum pick {
  P p.Enum
  D struct{}
}

์ด๋ฒˆ์—๋Š” p D ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์™„์ „ํžˆ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ์œ ์ผํ•œ ๋‹จ์ ์€ q.Enum p.Enum ์ƒํƒœ๋กœ ์ด๋™ํ•˜๋ ค๋ฉด ์ด์ค‘ ์ „ํ™˜ํ•ด์•ผ ํ•˜์ง€๋งŒ ๋ช…์‹œ์ ์ด๊ณ  ๋ช…ํ™•ํ•˜๋ฉฐ ์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ํŽธ์ง‘์ž๊ฐ€ ๋ผˆ๋Œ€๋ฅผ ๋ฑ‰์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž๋™์œผ๋กœ ๊บผ์ง‘๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฅผ ์œ„ํ•ด ์œ ํ˜•์œผ๋กœ ์‹ค์ œ ์—ด๊ฑฐํ˜•์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฆฐํŒ… ๋„๊ตฌ๋Š” ๋˜ํ•œ ๋ชจ๋“  ์ผ€์ด์Šค๊ฐ€ ์ฃผ์–ด์ง„ ์œ ํ˜•์ด๊ณ  "์—ด๊ฑฐํ˜•"์ด๋ผ๊ณ  ๊ฐ„์ฃผํ•˜๊ณ  ์›ํ•˜๋Š” ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” iota๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ const ์„ ์–ธ์„ ๋ฐœ๊ฒฌ์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์Šค์œ„์น˜์— ๊ธฐ๋ณธ๊ฐ’์ด ์žˆ์–ด์•ผ ํ•˜๊ฑฐ๋‚˜ ๋ชจ๋“  (์•Œ๋ ค์ง„) ๊ฒฝ์šฐ๋ฅผ ํ™•์ธํ•ด์•ผ ํ•˜๋Š” ์ž๋™ ์™„์„ฑ ๋˜๋Š” ๋ฆฐํŒ…์„ ๋•๊ธฐ ์œ„ํ•ด ์ด๋Ÿฌํ•œ "๊ด€๋ก€์— ๋”ฐ๋ฅธ ์—ด๊ฑฐํ˜•"์„ ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—๋Š” ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

const/iota๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋„๋ฉ”์ธ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์— ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋œ ์ •์˜๋œ ์ •์ˆ˜ ์œ ํ˜•์ด ์žˆ๋Š” ๊ฒฝ์šฐ:

์ฒซ์งธ, ๋‹ซํžŒ ์—ด๊ฑฐํ˜•์ด๋‚˜ ์—ด๋ฆฐ ์—ด๊ฑฐํ˜•์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋‹ซํžŒ ์œ ํ˜•์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’์— ๋‹จ์ˆœํžˆ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์ƒ์˜ ํŒŒ์ผ ํ˜•์‹์— ๋Œ€ํ•ด ์—ด๋ฆฐ ์—ด๊ฑฐํ˜•์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

const (
  //Name is the ID of a record field
  Name Record = iota
  //EmpID is the ID of an employee ID field
  EmpID

  //Intermediate values are reserved for future versions

  //Custom is the base of custom fields. Any custom field must have a unique ID greater than Custom.
  Custom Record = 42
)

์ด๊ฒƒ์€ 0, 1 ๋ฐ 42๊ฐ€ ๋ ˆ์ฝ”๋“œ ์œ ํ˜•์˜ ๋„๋ฉ”์ธ์ž„์„ ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ณ„์•ฝ์€ ํ›จ์”ฌ ๋” ๋ฏธ๋ฌ˜ํ•˜๋ฉฐ ๋ชจ๋ธ๋งํ•  ์ข…์† ์œ ํ˜•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. (ํ™•์‹คํžˆ ๋„ˆ๋ฌด ์ง€๋‚˜์น  ๊ฒƒ์ž…๋‹ˆ๋‹ค!)

๋‘˜์งธ, ์ƒ์ˆ˜ ๋ ˆ์ด๋ธ”์ด ์žˆ๋Š” ์ •์˜๋œ ์ •์ˆ˜ ์œ ํ˜•์ด ๋„๋ฉ”์ธ์ด ์ œํ•œ๋จ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ๊ฒฝํ—˜์ ์œผ๋กœ ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„๋กœ๋ถ€ํ„ฐ ์˜คํƒ์„ ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์™„๋ฒฝํ•œ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. go/types๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜์—์„œ ์ด ์œ ์‚ฌ ์œ ํ˜•์„ ์ถ”์ถœํ•œ ๋‹ค์Œ ํ•ด๋‹น ์œ ํ˜•์˜ ๊ฐ’์— ๋Œ€ํ•œ ๋ชจ๋“  ์Šค์œ„์น˜๋ฅผ ์ฐพ๊ณ  ์ฐพ์•„ ๋ชจ๋“  ์Šค์œ„์น˜์— ํ•„์š”ํ•œ ๋ ˆ์ด๋ธ”์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด ์‹œ์ ์—์„œ ์™„์ „ํ•จ์„ ๋ณด์—ฌ์ฃผ์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ์œ ํšจํ•œ ๊ฐ’์˜ ์ ์šฉ ๋ฒ”์œ„๋ฅผ ๋ณด์žฅํ–ˆ์ง€๋งŒ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฐ’์ด ์ƒ์„ฑ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์˜ ๋ชจ๋“  ์†Œ์Šค, ์‹ฑํฌ ๋ฐ ๋ณ€ํ™˜์„ ์ฐพ๊ณ  ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฐ’์ด ์ƒ์„ฑ๋˜์ง€ ์•Š์•˜์Œ์„ ์ •์ ์œผ๋กœ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ถ”์ƒ์ ์œผ๋กœ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋‹ค ํ•˜๋”๋ผ๋„, ๋ฐ˜์˜์ด ์ฐธ์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„ ์‹œ ๊ฐ’์— ๋Œ€ํ•ด ์•„๋ฌด ๋ง๋„ ํ•  ์ˆ˜ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ ํ˜• ์‹œ์Šคํ…œ์—์„œ ์ธ์ฝ”๋”ฉ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์œ ํ˜•์˜ ๋„๋ฉ”์ธ์ž…๋‹ˆ๋‹ค.

๊ณ ์œ ํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ enum ๋ฐ sum ์œ ํ˜•์— ๋Œ€ํ•œ ๋Œ€์•ˆ์ด ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.

range m n ์œ ํ˜• ๋ฆฌํ„ฐ๋Ÿด์ด ์ตœ์†Œ m ๋ฐ ์ตœ๋Œ€ n(๋ชจ๋“  v์— ๋Œ€ํ•ด m โ‰ค v โ‰ค n)์ธ ์ •์ˆ˜ ์œ ํ˜•์„ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์—ด๊ฑฐํ˜•์˜ ๋„๋ฉ”์ธ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

package p
type Enum range 0 2
const (
  A Enum = iota
  B
  C
)

๋„๋ฉ”์ธ์˜ ํฌ๊ธฐ = ๋ ˆ์ด๋ธ”์˜ ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— switch ๋ฌธ์ด ๋ชจ๋“  ๊ฐ€๋Šฅ์„ฑ์„ ์†Œ์ง„ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ 100% ํ™•์‹ ์œผ๋กœ ๋ฆฐํŠธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์—ด๊ฑฐํ˜•์„ ์™ธ๋ถ€์ ์œผ๋กœ ํ™•์žฅํ•˜๋ ค๋ฉด ๋งคํ•‘์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์œ ํ˜• ๋ณ€ํ™˜ ํ•จ์ˆ˜๋ฅผ ์ ˆ๋Œ€์ ์œผ๋กœ ์ƒ์„ฑํ•ด์•ผ ํ•˜์ง€๋งŒ ์–ด์จŒ๋“  ๊ทธ๋ ‡๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก , ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๋†€๋ž๋„๋ก ๋ฏธ๋ฌ˜ํ•œ ์œ ํ˜•์˜ ์œ ํ˜•์ด๋ฉฐ ๋‚˜๋จธ์ง€ Go์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๊ฒƒ๊ณผ ์ผ๋ถ€ ํ‹ˆ์ƒˆ ์‚ฌ์šฉ ์‚ฌ๋ก€ ์™ธ์—๋Š” ๋งŽ์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ ์ง„์ ์ธ ๋ณต๊ตฌ์™€ ํ™•์žฅ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์˜ ์ค‘์š”์„ฑ์— ๋Œ€ํ•ด ๋™์˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์€ ์˜๋ฏธ๋ก ์  ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ๋“ค์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด ์—ด๊ฑฐํ˜•์„ ํ•ด๋กญ๊ฑฐ๋‚˜ ๋ฌด์˜๋ฏธํ•˜๋‹ค๊ณ  ๋ณด๋Š” ๊ฒƒ์ด ์™„๋ฒฝํ•˜๊ฒŒ ํƒ€๋‹นํ•˜๊ณ  ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ๋Œ€๋‹ตํ•˜๊ณ  ์žˆ๋˜ ์งˆ๋ฌธ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ํ™•์ธํ•˜๋Š” ๋Œ€์‹  ๋ชจ๋“  ๊ณณ์—์„œ ํ™•์ธ์„ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์„ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์ ˆ์ถฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•. ๋‹ต๋ณ€: API์˜ ํ™•์žฅ์„ฑ๊ณผ ์ง„ํ™”๋ฅผ ์ค‘์‹œํ•จ์œผ๋กœ์จ ์–ด์จŒ๋“  ์‚ฌ์šฉ ์‚ฌ์ดํŠธ์—์„œ ์ด๋Ÿฌํ•œ ํ™•์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์—ด๊ฑฐํ˜• ์œ ํ˜•์˜ ๊ฒฝ์šฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ† ๋ก ์„ ์‹œ์ž‘ํ•  ๋•Œ ์ด์•ก ์œ ํ˜•๋ณด๋‹ค ์„ ํƒ๋˜์—ˆ๋‹ค๋ฉด ๋‹จ์ˆœํžˆ ๋ถˆํ–‰ํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง€๊ธˆ์€ ๊ทธ๋“ค์ด ์™œ ํ•ด๋กœ์šด์ง€ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์ €๋ฅผ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ ๋ช…ํ™•ํžˆ ํ•ด ์ฃผ์‹  ๋‹น์‹ ๊ณผ @griesemer ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

ํ•ฉ๊ณ„ ์œ ํ˜•์˜ ๊ฒฝ์šฐ ๊ท€ํ•˜๊ฐ€ ๋งํ•œ ๋‚ด์šฉ์ด ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์Šค์œ„์น˜๋ฅผ ์™„์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ํƒ€๋‹นํ•œ ์ด์œ ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ํ์‡„ํ˜•์ด ๋งŽ์€ ์ด์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ์—ฌ๊ธฐ์—์„œ ์‚ดํŽด๋ณธ ์„ธ ๊ฐ€์ง€ ์œ ํ˜• ์ค‘ sum ์œ ํ˜•์ด ๋‹ค๋ฅธ ๋‹จ์  ์—†์ด ๊ฐ€์žฅ ์œ ์—ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ข‹์€ ์œ ํ˜•๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž˜๋ชป๋œ ๊ฐ’์œผ๋กœ ์ธํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋ฉด์„œ ํ™•์žฅ์„ฑ์ด๋‚˜ ์ ์ง„์  ๋ณต๊ตฌ๋ฅผ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๊ณ  ์œ ํ˜•์„ ๋‹ซ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํŒŒ์ด์ฌ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ ๊ธฐํƒ€ ์ผ๋ฐ˜์ ์ธ ์œ ํ˜•์ด ์—†๋Š” ์–ธ์–ด๋ณด๋‹ค golang์„ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ๋œ ์ด์œ ๋Š” ์œ ํ˜• ์•ˆ์ „์„ฑ์ž…๋‹ˆ๋‹ค. ์ €๋Š” Java๋กœ ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์œผ๋ฉฐ Java๊ฐ€ ์ œ๊ณตํ•˜๋Š” golang์—์„œ ํ•œ ๊ฐ€์ง€ ๊ทธ๋ฆฌ์›Œํ•˜๋Š” ๊ฒƒ์€ ์•ˆ์ „ํ•œ ์—ด๊ฑฐํ˜•์ž…๋‹ˆ๋‹ค.

์—ด๊ฑฐํ˜•์œผ๋กœ ์œ ํ˜•์„ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. int๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ Java์ฒ˜๋Ÿผ ๋Œ€์‹  int๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์•ˆ์ „ํ•œ ์—ด๊ฑฐํ˜•์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‹ค์Œ ๊ตฌ๋ฌธ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

type enums enum { foo, bar, baz }

@rudolfschmidt , ๋‚˜๋Š” ๋‹น์‹ ์—๊ฒŒ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋„ ๊ทธ๋ ‡๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

type DaysOfTheWeek enum {
  Monday
  Tuesday
}

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์—๋Š” ์ž‘์€ ํ•จ์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ฆํ•˜๊ฑฐ๋‚˜ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋˜๋Š” FS์™€ ์ƒํ˜ธ ์ž‘์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ enum ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์—ด๊ฑฐํ˜•์ด ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜ ์ง‘ํ•ฉ์ด๋ผ๊ณ  ๋งน๋ชฉ์ ์œผ๋กœ ๊ฐ€์ •ํ•˜๋ฉด iota๋กœ ๋๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ˜์‹ ์„ ํ•˜๋ ค๋ฉด ์‚ฌ์šฉ ํŽธ์˜์„ฑ์„ ์ƒ๊ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ๋“ค์–ด์˜ค๋Š” JSON ๋‚ด๋ถ€์˜ ๊ฐ’์ด enum์˜ ์œ ํšจํ•œ ์š”์†Œ์ธ์ง€ ์–ผ๋งˆ๋‚˜ ์‰ฝ๊ฒŒ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?

์•”ํ˜ธ ํ™”ํ ๋ชฉ๋ก์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

type CryptoCurrency enum {
  BTC
  ETH
  XMR
}

์šฐ๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ํƒ€์‚ฌ ์‹œ์Šคํ…œ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์ฒœ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
๋‹น์‹ ์€ ๊ธด ๊ธฐ๋ก, ์ €์žฅ ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด BitCoin์€ ๊ฒฐ๊ตญ ์ฃฝ์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๊ตฌ์กฐ์—์„œ ์‚ญ์ œํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

type CryptoCurrency enum {
  ETH
  XMR
}

์ด๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. enum์˜ ๋ชจ๋“  ๊ฐ’์ด ์ด๋™ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ํŒŒํŠธ๋„ˆ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๊ทธ๋“ค ์ค‘ ์ผ๋ถ€๋Š” ๊ทธ๋ ‡๊ฒŒ ๋นจ๋ฆฌ ์›€์ง์ด์ง€ ์•Š๊ณ , ์ผ๋ถ€๋Š” ์ž์›์ด ์—†๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์€ ๊ทธ๋“ค๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ 2๊ฐœ์˜ ์—ด๊ฑฐํ˜•์„ ๊ฐ–๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค: old and new; ๋‘˜ ๋‹ค ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋งคํผ.
์ด๋Š” ์—ด๊ฑฐํ˜•์— ๋Œ€ํ•œ ์ •์˜์˜ ์œ ์—ฐ์„ฑ๊ณผ ๊ทธ๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ฆํ•˜๊ณ  ๋งˆ์ƒฌ๋ง/์–ธ๋งˆ์ƒฌ๋งํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์•ผ ํ•จ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

type CryptoCurrency enum {
  ETH = 1, // reminds const?
  XMR = 2
}
// this is real life case 
v := 3
if v is CryptoCurrency {
 // right?
} else {
 // nope, provide default value
 v = CryptoCurrency.ETH
}

์—ด๊ฑฐํ˜•๊ณผ ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ์ ์šฉ ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜์ฒœ ์ค„์˜ ์ƒ์šฉ๊ตฌ ์ฝ”๋“œ๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด 2๊ฐœ์˜ ์ƒˆ๋กœ์šด ํ‚ค์›Œ๋“œ๋ฅผ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค‘๊ฐ„ ์ง€์ ์€ ์‹ค์ œ๋กœ ์—ด๊ฑฐํ˜• ๊ฐ’์„ ์ œํ•œํ•˜์ง€ ์•Š๊ณ  ์—ด๊ฑฐํ˜• ๊ฐ’์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜• ์œ ํ˜•์€ ๊ฑฐ์˜ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๋ช…๋ช…๋œ ์ƒ์ˆ˜์˜ ๋ฌด๋ฆฌ์ž…๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜• ์œ ํ˜•์˜ ๋ณ€์ˆ˜๋Š” ์—ด๊ฑฐํ˜•์˜ ๊ธฐ๋ณธ ์œ ํ˜• ๊ฐ’๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์œ„์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋ณผ ๊ฐ’์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์œ ํšจํ•œ ์—ด๊ฑฐํ˜• ๊ฐ’์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  stringification๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ๋ณด๋„ˆ์Šค๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งค์šฐ ์ž์ฃผ ๋‚˜๋Š” ๋ชจ๋“  ๊ณณ์— ์—ด๊ฑฐํ˜•์ด ์žˆ๋Š” ํ”„๋กœํ† ์ฝœ(protobuf ๋˜๋Š” thrift)์ด ์žˆ๋Š” ์ƒํ™ฉ์— ์ฒ˜ํ•ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค ๊ฐ๊ฐ์„ ๊ฒ€์ฆํ•ด์•ผ ํ•˜๊ณ , ์—ด๊ฑฐํ˜• ๊ฐ’์ด ๋‚˜์—๊ฒŒ ์•Œ๋ ค์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด, ๊ทธ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜•์ด ์ƒ์ˆ˜์˜ ์ง‘ํ•ฉ์ธ ์–ธ์–ด์˜ ๊ฒฝ์šฐ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์กฐํ•ฉ์„ ํ™•์ธํ•˜๋Š” ์—„์ฒญ๋‚œ ์–‘์˜ switch ๋ฌธ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ ์™ธ์— ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ์—„์ฒญ๋‚œ ์–‘์˜ ์ฝ”๋“œ์™€ ์‹ค์ˆ˜๊ฐ€ ์žˆ์„ ์ˆ˜ ๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค. C#๊ณผ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ์—ด๊ฑฐํ˜• ๊ฒ€์ฆ์„ ์œ„ํ•œ ๋‚ด์žฅ ์ง€์›์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งŽ์€ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ protobuf ๊ตฌํ˜„์€ ์‹ค์ œ๋กœ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๋กœ๊น…์ด ์–ผ๋งˆ๋‚˜ ์‰ฌ์šด์ง€๋Š” ๋งํ•  ๊ฒƒ๋„ ์—†๊ณ  ์ƒ์ž์—์„œ ๋ฐ”๋กœ ๋ฌธ์ž์—ดํ™”๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. protobuf๊ฐ€ Stringer ๊ตฌํ˜„์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€๋งŒ ์ฝ”๋“œ์˜ ๋ชจ๋“  ๊ฒƒ์ด protobuf์ธ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ์‹ถ์ง€ ์•Š๊ณ  ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋„ ๋ฉ”์‹œ์ง€๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹ค๋ฅธ ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฒ„๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ ์„œ๋ฒ„ ์ธก์—์„œ๋Š” ์ข…์ข… ๋ชจ๋“  ๊ฒƒ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฝ˜ํ…์ธ ๋ฅผ ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์€ ์„ ํƒ ์‚ฌํ•ญ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜์—๊ฒŒ๋Š” ์—ด๊ฑฐํ˜• ๊ฐ’์„ ๊ฒ€์ฆํ•˜๋Š” ๋Šฅ๋ ฅ์— ์ง„์ •ํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋งŒ ์ˆ˜ํ–‰ํ•˜๋Š” ์ˆ˜์ฒœ ์ค„์˜ ์ƒ์šฉ๊ตฌ ์ฝ”๋“œ๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ๋„๊ตฌ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋งค์šฐ ๊ฐ„๋‹จํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ ์ผ๋ถ€๊ฐ€ ์ด๋ฏธ ์ŠคํŠธ๋ง๊ฑฐ ๋„๊ตฌ์— ์žˆ์Šต๋‹ˆ๋‹ค. enumer Foo ์™€ ๊ฐ™์ด ํ˜ธ์ถœํ•  ๋„๊ตฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ Foo fmt.Stringer #$ ๋ฉ”์„œ๋“œ์™€ ๋‹ค์Œ์„ ํ™•์ธํ•˜๋Š” Known() bool ๋ฉ”์„œ๋“œ ์ €์žฅ๋œ ๊ฐ’์ด ์•Œ๋ ค์ง„ ๊ฐ’์˜ ๋ฒ”์œ„์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ฌธ์ œ๊ฐ€ ์™„ํ™”๋ฉ๋‹ˆ๊นŒ?

@Merovius ๋Š” ๋‹ค๋ฅธ ๊ฒƒ์ด ์—†์œผ๋ฉด ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ autogen์— ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ์œ ์šฉํ•˜๊ณ  ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ํ•œ ๋ฒˆ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ์•ˆ์ •์ ์ธ ํ”„๋กœํ† ์ฝœ์ด ์žˆ๋Š” protobuf์™€ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์—ด๊ฑฐํ˜•์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ˆœํ•œ ์œ ํ˜• ์‹œ์Šคํ…œ์˜ ๋ชฉ๋ฐœ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Go๊ฐ€ ์–ธ์–ด ์ž์ฒด์˜ ์ฒ ํ•™์— ์–ด๊ธ‹๋‚˜๋Š” ํƒ€์ž… ์•ˆ์ „์„ฑ์— ๊ด€ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค. ์–ธ์–ด๋ฅผ ์ง€์›ํ•˜๋Š” ๋Œ€์‹  ์‹ค์ œ๋กœ ์–ธ์–ด ์ƒํƒœ๊ณ„์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹Œ ์ด ์ธํ”„๋ผ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์–ธ์–ด์—์„œ ๋ˆ„๋ฝ๋œ ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์กฐ์‚ฌ๋ฅผ ์œ„ํ•œ ์™ธ๋ถ€ ๋„๊ตฌ๋ฅผ ๋‚จ๊ฒจ๋‘์‹ญ์‹œ์˜ค.

. ์ผ๋ฐ˜์ ์œผ๋กœ ์—ด๊ฑฐํ˜•์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ˆœํ•œ ์œ ํ˜• ์‹œ์Šคํ…œ์˜ ๋ชฉ๋ฐœ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

์™œ๋ƒํ•˜๋ฉด Go์˜ ์œ ํ˜• ์‹œ์Šคํ…œ์€ ์œ ๋ช…ํ•˜๊ณ  ์˜๋„์ ์œผ๋กœ ๋‹จ์ˆœํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์˜€์Šต๋‹ˆ๋‹ค. "๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š”๋‹ค"๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๊ทธ๋ ‡์ง€ ์•Š์€์ง€ ์ •๋ง๋กœ ์•Œ์ง€ ๋ชปํ•œ๋‹ค(๋‹น์‹ ์ด ์–ด์จŒ๋“  ์—ด๋ฆฐ ์—ด๊ฑฐํ˜•์„ ๊ฐ€์ •ํ•œ๋‹ค๋ฉด).

๊ทธ๋ฆฌ๊ณ  Go๊ฐ€ ์–ธ์–ด ์ž์ฒด์˜ ์ฒ ํ•™์— ์–ด๊ธ‹๋‚˜๋Š” ํƒ€์ž… ์•ˆ์ „์„ฑ์— ๊ด€ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

Go๋Š” "ํ˜•์‹ ์•ˆ์ „์„ฑ์— ๊ด€ํ•œ ๋ชจ๋“  ๊ฒƒ"์ด ์•„๋‹™๋‹ˆ๋‹ค. Idris์™€ ๊ฐ™์€ ์–ธ์–ด๋Š” ๋ชจ๋‘ ์œ ํ˜• ์•ˆ์ „์„ฑ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Go๋Š” ๋Œ€๊ทœ๋ชจ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฌธ์ œ ์— ๊ด€ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฌธ์ œ์— ๋”ฐ๋ผ ์„ค๊ณ„๊ฐ€ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•ด๋‹น ์œ ํ˜• ์‹œ์Šคํ…œ์€ API ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•œ ๊ด‘๋ฒ”์œ„ํ•œ ๋ฒ„๊ทธ๋ฅผ ํฌ์ฐฉํ•˜๊ณ  ์ผ๋ถ€ ๋Œ€๊ทœ๋ชจ ๋ฆฌํŒฉํ† ๋ง์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•™์Šต์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ณ  ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๋ถ„์‚ฐ์„ ์ค„์ด๋ฉฐ ํƒ€์‚ฌ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์˜๋„์ ์œผ๋กœ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ด€์‹ฌ ์žˆ๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€(์—ด๋ฆฐ ์—ด๊ฑฐํ˜•)๊ฐ€ ์–ธ์–ด ๋ณ€๊ฒฝ ์—†์ด ์‰ฝ๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋„๊ตฌ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด Go์˜ ์ฒ ํ•™๊ณผ ๋งค์šฐ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ๊ธฐ์กด ๊ธฐ๋Šฅ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์ธ ์ƒˆ๋กœ์šด ์–ธ์–ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ Go์˜ ๋””์ž์ธ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ณตํ•ด์„œ ๋ง์”€๋“œ๋ฆฌ์ž๋ฉด, ๊ด€์‹ฌ ์žˆ๋Š” ์ƒ์šฉ๊ตฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. .

ํ† ๋ก ์—์„œ ๋‚˜์˜จ ๋ช‡ ๊ฐ€์ง€ ์•„์ด๋””์–ด๋ฅผ ๊ฒฐํ•ฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋‚˜์š”?

๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ ์ •๋ณด:

  1. ๋‹ค๋ฅธ ๋ชจ๋“  ์œ ํ˜•๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์—ด๊ฑฐํ˜•์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๊ทธ๋“ค์€ ์ƒ์ˆ˜์ฒ˜๋Ÿผ ์ €์žฅ๋˜์ง€๋งŒ ์œ ํ˜• ์ด๋ฆ„์„ ์ ‘๋‘์‚ฌ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด์œ : ํ˜„์žฌ iota-enums๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ชจ๋“  ์ƒ์ˆ˜์˜ ์ ‘๋‘์‚ฌ๋กœ ์—ด๊ฑฐํ˜• ์ด๋ฆ„์„ ์“ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋ƒฅ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ๊ทธ๊ฒƒ๋“ค์€ ๋ถˆ๋ณ€์ด๋ฉฐ ๋‹ค๋ฅธ ๋ชจ๋“  ์ƒ์ˆ˜์ฒ˜๋Ÿผ ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค.
  4. ์—ด๊ฑฐํ˜•์„ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ง€๋„์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ‚ค๋Š” ์—ด๊ฑฐํ˜• ์ด๋ฆ„์ด๊ณ  ๊ฐ’์€ ์—ด๊ฑฐํ˜• ๊ฐ’์ž…๋‹ˆ๋‹ค.
  5. ๋‹ค๋ฅธ ๋ชจ๋“  ์œ ํ˜•๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์—ด๊ฑฐํ˜•์— ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  6. ๋ชจ๋“  ์—ด๊ฑฐํ˜• ๊ฐ’์€ ์ž๋™ ์ƒ์„ฑ๋œ ๋ฉ”์„œ๋“œ์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  7. Name() ๋Š” ์—ด๊ฑฐํ˜• ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  8. Index() ๋Š” ์ž๋™์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ์—ด๊ฑฐํ˜• ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด์ด ์‹œ์ž‘๋˜๋Š” ๊ณณ์—์„œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

์•”ํ˜ธ:
```๊ฐ€๋‹ค
ํŒจํ‚ค์ง€ ๋ฉ”์ธ

//์˜ˆ์ œ A
type Country enum[struct] { //enum์€ ๋‹ค๋ฅธ ์œ ํ˜•์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ์ œ B ์ฐธ์กฐ).
Austria("AT", "Austria", false) // const์ฒ˜๋Ÿผ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์œ ํ˜•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
Germany("DE", "Germany", true) //์ ‘๋‘์‚ฌ(์˜ˆ: Country.Austria)

//The struct will automatically begin when it doesn't match the format EnumName(...) anymore
Code, CountryName string
HasMerkel bool //Totally awesome

}

// ์—ด๊ฑฐํ˜•์€ ๋‹ค๋ฅธ ๋ชจ๋“  ์œ ํ˜•๊ณผ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
func(c ๊ตญ๊ฐ€) test() {}

ํ•จ์ˆ˜ ๋ฉ”์ธ() {
println(Country.Austria.CountryName) //์˜ค์ŠคํŠธ๋ฆฌ์•„
println(๊ตญ๊ฐ€.๋…์ผ.์ฝ”๋“œ) //DE

/* Prints:
Austria
0
Germany
1
 */
for name, country := range Country {
    println(name) //Austria
    println(name == country.Name()) //true ; also autogenerated 
    println(country.Index()) //Auto generated increasing index
}

}

//์˜ˆ์ œ B
์œ ํ˜• ์ฟจ๋‹ˆ์Šค enum[int] {
์•„์ฃผ๋ฉ‹์ง„(10)
์ฟจ(5)
์ฟจํ•˜์ง€ ์•Š๋‹ค(0)
}```

@sinnlosername ์—ด๊ฑฐํ˜•์€ ๋งค์šฐ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๊ฒƒ์ด์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ํ† ๋ก ์—์„œ ์ œ์‹œ๋œ ์•„์ด๋””์–ด ์ค‘ ์ผ๋ถ€๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ˜๋“œ์‹œ ์—ด๊ฑฐํ˜•์— ๋Œ€ํ•œ ์ตœ์ƒ์˜ ์•„์ด๋””์–ด๋กœ ์ด์–ด์ง€๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹ค์Œ์ด ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šธ ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

์„ ์–ธ

type Day enum {
    Monday
    Tuesday
    ...
    Sunday
}

๋ฌธ์ž์—ด ๋ณ€ํ™˜( Stringer ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ):

func (d Day) String() string {
    switch d {
    case Monday:
        return "mon"
    case Tuesday:
        return "tues"
    ...
    case Sunday:
        return "sun"
    }
}

๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์˜ ์ด์ ์€ enum์„ ์ „๋‹ฌํ•  ๋•Œ ๋” ๊ฐ•๋ ฅํ•œ ์œ ํ˜• ์•ˆ์ „์„ฑ์„ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์˜ˆ

func IsWeekday(d Day) bool {
    return d != Saturday && d != Sunday
}

์—ฌ๊ธฐ์„œ Day ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด string ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด IsWeekday ๋Š” "sat" ๋˜๋Š” "sun" ๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ๋ฌธ์ž์—ด์ด ๋Š” ํ‰์ผ์ž…๋‹ˆ๋‹ค(์ฆ‰, IsWeekday("abc") ๋Š” ๋ฌด์—‡์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?). ๋Œ€์กฐ์ ์œผ๋กœ, ์œ„์— ํ‘œ์‹œ๋œ ํ•จ์ˆ˜์˜ ์˜์—ญ์€ ์ œํ•œ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ž…๋ ฅ๊ณผ ๊ด€๋ จํ•˜์—ฌ ํ•จ์ˆ˜๊ฐ€ ๋” ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@ljeabmreosn

์•„๋งˆ ๊ทธ๋ž˜์•ผ ํ•œ๋‹ค

func IsWeekday(d Day) bool {
    return d != Day.Saturday && d != Day.Sunday
}

ํ•„์š”ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์–ธ์–ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด golang ํŒ€์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์„ ํฌ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ๋žŒ์ด Rust lang์„ ์‚ดํŽด๋ณด๋ผ๊ณ  ๊ถŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ enum ๋ฐ ์ œ๋„ค๋ฆญ ๋“ฑ๊ณผ ๊ฐ™์€ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋ชจ๋‘ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” 2018๋…„ 5์›” 14์ผ์— ์žˆ์œผ๋ฉฐ enum ์ง€์›์— ๋Œ€ํ•ด ์—ฌ์ „ํžˆ ๋…ผ์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋„๋Œ€์ฒด ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ๊ฐœ์ธ์ ์œผ๋กœ ๊ณจ๋ž‘์— ์‹ค๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋‹ต๋‹ตํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์™€ ๊ฐ™์ด ๊ฑด์„ค์ ์ด์ง€ ์•Š์€ ๋Œ“๊ธ€์„ ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ์€ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ์กด์ค‘ํ•ด ์ฃผ์‹ญ์‹œ์˜ค. https://golang.org/conduct๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๊ฐ์‚ฌ ํ•ด์š”.

@agnivade @rudolfschmidt ์— ๋™์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. GoLang์€ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ, API์˜ ๋ถ€์กฑ ๋ฐ Go ์ œ์ž‘์ž์˜ ๊ณผ๊ฑฐ ์‹ค์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ˆ˜์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ €ํ•ญ์ด ๋„ˆ๋ฌด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ์–ธ์–ด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง์žฅ์—์„œ ์ตœ๊ทผ ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉํ•  ์–ธ์–ด์— ๋Œ€ํ•œ ๊ฒฐ์ •๊ถŒ์ž๋Š” ๋‚ด๊ฐ€ ์•„๋‹ˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ์€ ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋ชจ๋“  ๋‹จ์ ์„ ๊ฐ€์ง€๊ณ  ์ผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทผ๋ฐ ์†”์งํžˆ GoLang์—์„œ ์ฝ”๋“œ์“ฐ๋Š”๊ฑฐ ๊ณ ๋ฌธ๊ฐ™๋„ค;-)

ํ•„์š”ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์–ธ์–ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด golang ํŒ€์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์„ ํฌ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ํ•„์š”ํ•˜๋‹ค๋Š” ๋‹จ์–ด๋Š” "๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ"์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ๋ชจ๋“  ํ˜„๋Œ€ ์–ธ์–ด์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. GoLang์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ข‹์€ ๊ธฐ๋Šฅ์ด ์žˆ์ง€๋งŒ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ณด์ˆ˜์ ์ด๋ผ๋ฉด ์‚ด์•„๋‚จ์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜•์ด๋‚˜ ์ œ๋„ค๋ฆญ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์€ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ๋‹จ์ ์ด ์—†์ง€๋งŒ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ๋งŽ์€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  "ํ•˜์ง€๋งŒ ๋‹จ์ˆœํ•˜๊ฒŒ ์ง€๋‚ด๊ณ  ์‹ถ์–ด"๋ผ๊ณ  ๋งํ•˜์ง€ ๋งˆ์„ธ์š”. "๋‹จ์ˆœํ•œ" ๊ฒƒ๊ณผ "์‹ค์ œ ๊ธฐ๋Šฅ์ด ์—†๋Š” ๊ฒƒ" ์‚ฌ์ด์—๋Š” ํฐ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Java๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๋งŽ์€ ๊ธฐ๋Šฅ์ด ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Java ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งˆ๋ฒ•์‚ฌ์ด๊ฑฐ๋‚˜ ์ด ์ธ์ˆ˜๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ๋ชจ๋“  ํ˜„๋Œ€ ์–ธ์–ด์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ™•์‹ ํ•˜๋Š”. ์ด๋Ÿฌํ•œ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ํŠœ๋ง ์™„์ „์„ฑ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. _๋ชจ๋“  ๊ฒƒ_์€ ๋””์ž์ธ ์„ ํƒ์ž…๋‹ˆ๋‹ค. Turing ์™„์ „์„ฑ๊ณผ C++(์˜ˆ:) ์‚ฌ์ด์—๋Š” ๋งŽ์€ ๊ณต๊ฐ„์ด ์žˆ์œผ๋ฉฐ ๊ทธ ๊ณต๊ฐ„์—์„œ ๋งŽ์€ ์–ธ์–ด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ„ํฌ๋Š” ์ „์—ญ ์ตœ์ ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

GoLang์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ข‹์€ ๊ธฐ๋Šฅ์ด ์žˆ์ง€๋งŒ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ณด์ˆ˜์ ์ด๋ผ๋ฉด ์‚ด์•„๋‚จ์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ˜น์‹œ. ์ง€๊ธˆ๊นŒ์ง€ ๊ณ„์† ์„ฑ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. IMO, ๋ณด์ˆ˜์ ์ด์ง€ ์•Š์•˜๋‹ค๋ฉด ์—ฌ์ „ํžˆ ์„ฑ์žฅํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์˜๊ฒฌ์€ ๋ชจ๋‘ ์ฃผ๊ด€์ ์ด๋ฉฐ ๊ธฐ์ˆ ์ ์œผ๋กœ ๊ทธ๋‹ค์ง€ ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทœ์น™์„ ์ •ํ•˜๋Š” ๊ฒƒ์€ ๋””์ž์ด๋„ˆ์˜ ๊ฒฝํ—˜๊ณผ ์ทจํ–ฅ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์˜๊ฒฌ์„ ๊ฐ–๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์ง€๋งŒ ๋””์ž์ด๋„ˆ๊ฐ€ ์˜๊ฒฌ์„ ๊ณต์œ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋ณด์žฅํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

BTW, ๋งŒ์•ฝ ์‚ฌ๋žŒ๋“ค์ด ์š”๊ตฌํ•˜๋Š” ๊ธฐ๋Šฅ์˜ 10%๊ฐ€ ์ฑ„ํƒ๋œ๋‹ค๋ฉด ์˜ค๋Š˜๋‚  ๋ฐ”๋‘‘์ด ์–ด๋–จ์ง€ ์ƒ์ƒํ•œ๋‹ค๋ฉด ์ง€๊ธˆ์ฏค์ด๋ฉด ๋ฐ”๋‘‘์„ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‚ฌ์‹ค ๋‹น์‹ ์€ ๋‚ด ๋Œ€๋‹ต์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋…ผ๊ฑฐ๋ฅผ ๋†“์ณค์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ด๋ฏธ ๋‹น์‹ ์ด ๋งํ•œ ๊ฒƒ๋“ค ์ค‘ ์ผ๋ถ€์— ๋ฐ˜๋Œ€์ด๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"์—ด๊ฑฐํ˜•์ด๋‚˜ ์ œ๋„ค๋ฆญ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์€ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ๋‹จ์ ์ด ์—†์ง€๋งŒ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ๋งŽ์€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค."

๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ๋ณด์ˆ˜์„ฑ์ด ๊ณจ๋ž‘ ์„ฑ์žฅ์˜ ์›์ธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ด๊ฒƒ์ด golang์˜ ํšจ์œจ์„ฑ๊ณผ ํ›Œ๋ฅญํ•œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ธํŠธ์™€ ๊ด€๋ จ์ด ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋” ๋†’๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ Java๋Š” Java 9์—์„œ ์ค‘์š”ํ•œ ์‚ฌํ•ญ์„ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ผ์ข…์˜ "์ถฉ๋Œ"์„ ๊ฒฝํ—˜ํ–ˆ๋Š”๋ฐ, ์ด๋กœ ์ธํ•ด ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋Œ€์•ˆ์„ ์ฐพ๋„๋ก ํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๊ธฐ ์ „์— Java๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. ๊ฐœ๋ฐœ์ž์˜ ์‚ถ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด ์ ์  ๋” ๋งŽ์•„์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ง€์†์ ์œผ๋กœ ์„ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.

"์—ด๊ฑฐํ˜•์ด๋‚˜ ์ œ๋„ค๋ฆญ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์€ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ๋‹จ์ ์ด ์—†์ง€๋งŒ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ๋งŽ์€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค."

๊ทธ๊ฒƒ์€ ๋งค์šฐ ๋ช…๋ฐฑํ•˜๊ฒŒ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ธฐ๋Šฅ์€ ๊ฒฐ๊ตญ ๋‚ด๊ฐ€ ๊ฐ€์ ธ์˜ค๋ ค๋Š” stdlib ๋ฐ/๋˜๋Š” ํŒจํ‚ค์ง€์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. _๋ชจ๋“  ์‚ฌ๋žŒ_์€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ข‹๋“  ์‹ซ๋“  ์ƒ๊ด€์—†์ด ์ƒˆ ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ๊ณ„์† ์„ฑ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. IMO, ๋ณด์ˆ˜์ ์ด์ง€ ์•Š์•˜๋‹ค๋ฉด ์—ฌ์ „ํžˆ ์„ฑ์žฅํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Š๋ฆฐ ์„ฑ์žฅ(์žˆ๋Š” ๊ฒฝ์šฐ)์ด ๋ณด์ˆ˜์„ฑ ๋•Œ๋ฌธ์ด ์•„๋‹ˆ๋ผ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์–ธ์–ด ๊ธฐ๋Šฅ ์„ธํŠธ, ๋„๊ตฌ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋‚˜๋ฅผ ์—ฌ๊ธฐ๋กœ ๋ฐ๋ ค์˜จ ๊ฒƒ์ด๋‹ค. ์–ธ์–ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด๋„ ๊ทธ๋Ÿฐ ์ ์—์„œ ์ €์—๊ฒŒ๋Š” ์•„๋ฌด ๊ฒƒ๋„ ๋ฐ”๋€Œ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

C#๊ณผ Typescript ๋˜๋Š” ์‹ฌ์ง€์–ด Rust/Swift๋ฅผ ๋ณด๋ฉด. ๊ทธ๋“ค์€ ๋ฏธ์นœ ๊ฐ™์€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. C#์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์œ„์•„๋ž˜๋กœ ๋ณ€๋™ํ•˜๋Š” ์ƒ์œ„ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. Typescript๋Š” ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์„ฑ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Rust/Swift๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ๋ฐ”๋‘‘์€ 2009๋…„๊ณผ 2016๋…„์— ํญ๋ฐœ์ ์ธ ์ธ๊ธฐ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ์‚ฌ์ด์—๋Š” ์ „ํ˜€ ์„ฑ์žฅํ•˜์ง€ ์•Š์•˜๊ณ  ์‹ค์ œ๋กœ ์†์‹ค๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Go์— ๋Œ€ํ•ด ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๊ณ  ์–ด๋–ค ์ด์œ ๋กœ ๋” ์ผ์ฐ ์„ ํƒํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ Go๋Š” ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ค„ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค. Go์˜ ๋””์ž์ธ์ด ์ •์ฒด๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด๊ฐ€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ํ•  ์ผ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹ˆ๋ผ ์‹ค์ œ ์‚ฌ์šฉ์ž ๊ธฐ๋ฐ˜์—์„œ ์š”๊ตฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์ด ๋Š์ž„์—†์ด ๋ณ€ํ™”ํ•˜๋Š” ๋ฌธ์ œ ์˜์—ญ์—์„œ ๊ด€๋ จ์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. async/await์ฒ˜๋Ÿผ. ์‹ค์ œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋งŽ์€ ์–ธ์–ด๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋†€๋ผ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ์—๋Š” Go 2๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋ฉฐ ๋งŽ์€ ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž๋ฅผ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์ด๋ผ๊ณ  ์ ˆ๋Œ€์ ์œผ๋กœ ํ™•์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กญ๊ณ  ๋น›๋‚˜๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์œผ๋กœ ์ธํ•ด ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋งˆ์นจ๋‚ด ์ „ํ™˜ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ณด์ˆ˜๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ–ˆ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ์ œ์•ˆ์„ ํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Š๋ฆฐ ์„ฑ์žฅ(์žˆ๋Š” ๊ฒฝ์šฐ)์ด ๋ณด์ˆ˜์„ฑ ๋•Œ๋ฌธ์ด ์•„๋‹ˆ๋ผ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์–ธ์–ด ๊ธฐ๋Šฅ ์„ธํŠธ, ๋„๊ตฌ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋‚˜๋ฅผ ์—ฌ๊ธฐ๋กœ ๋ฐ๋ ค์˜จ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋ณด์ˆ˜์ ์ธ ํƒœ๋„์˜ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ์–ธ์–ด๊ฐ€ [๋ฐ˜]๋…„ ์ •๋„๋งˆ๋‹ค ๋ฌด์–ธ๊ฐ€/๋ชจ๋“  ๊ฒƒ์„ ๋ง๊ฐ€๋œจ๋ฆฐ๋‹ค๋ฉด, ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ๊ฐ€์ ธ์˜ค๋Š” ์‚ฌ๋žŒ์ด ํ›จ์”ฌ ๋” ์ ๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์‹ ์ด ๋ฐ”๋‘‘์— ๋Œ€ํ•ด ๋‹น์‹ ์ด ๊ฐ€์น˜ ์žˆ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์„ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ธ์–ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด๋„ ๊ทธ๋Ÿฐ ์ ์—์„œ ์ €์—๊ฒŒ๋Š” ์•„๋ฌด ๊ฒƒ๋„ ๋ฐ”๋€Œ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ํ™•์‹ ํ•ฉ๋‹ˆ๊นŒ? ์œ„ ์ฐธ์กฐ.


BTW, 2017 ์„ค๋ฌธ ์กฐ์‚ฌ ๊ฒฐ๊ณผ ๋ฅผ ๋ณด์…จ์Šต๋‹ˆ๊นŒ?

์–ธ์–ด๊ฐ€ [๋ฐ˜]๋…„ ์ •๋„๋งˆ๋‹ค ๋ฌด์–ธ๊ฐ€/๋ชจ๋“  ๊ฒƒ์„ ๊นจ๋œจ๋ฆฌ๋ฉด

๊ทธ๋Ÿฐ ๋‹ค์Œ ์•„๋ฌด๊ฒƒ๋„ ๋ถ€์ˆ˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. C#์€ ์ˆ˜๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ์œผ๋ฉฐ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„๋ฐ˜ํ•œ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์—๊ฒŒ๋„ ์„ ํƒ์ง€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. C++๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Go๊ฐ€ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ค‘๋‹จํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด Go์— ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  ์•„๋งˆ๋„ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์— ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

BTW, 2017 ์„ค๋ฌธ ์กฐ์‚ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์…จ์Šต๋‹ˆ๊นŒ?

๋‚ด ์˜๊ฒฌ์€ 2017/2018 ์„ค๋ฌธ ์กฐ์‚ฌ, TIOBE ์ง€์ˆ˜ ๋ฐ ๋‹ค์–‘ํ•œ ์–ธ์–ด๋กœ ์ง„ํ–‰๋˜๋Š” ์ƒํ™ฉ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๊ด€์ฐฐ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

@cznic
๋ชจ๋‘๊ฐ€ ๊ทธ๊ฒƒ๋“ค์„ ๋‹ค๋ฃจ์–ด์•ผ ํ•˜์ง€๋งŒ ๋‹น์‹ ์€ ๊ทธ๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. iota ์—ด๊ฑฐํ˜• ๋ฐ ๋งต์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ œ๋„ค๋ฆญ์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ œ๋„ค๋ฆญ์ด ์—†๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. Java๋Š” ๋‘˜ ๋‹ค ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ์„ ์ฆ๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์•„๋ฌด๊ฒƒ๋„ ๋ถ€์ˆ˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์ข‹์€ ์ƒ๊ฐ. ๊ทธ๋Ÿฌ๋‚˜ ์ œ์•ˆ๋œ ์–ธ์–ด ๋ณ€๊ฒฝ์˜ ๋Œ€๋ถ€๋ถ„์€ ์•„๋‹์ง€๋ผ๋„ _์ด๊ฒƒ๋งŒ ํฌํ•จํ•˜์—ฌ_ ๋งŽ์€ ๋ถ€๋ถ„์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊นจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

C#์€ ์ˆ˜๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ์œผ๋ฉฐ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„๋ฐ˜ํ•œ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค: Visual C# 2010 ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ . (์ฒซ ๋ฒˆ์งธ ์›น ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์œ ์ผํ•œ ์˜ˆ์ธ์ง€ ์•„๋‹Œ์ง€ ์ง์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

๋‚ด ์˜๊ฒฌ์€ 2017/2018 ์„ค๋ฌธ ์กฐ์‚ฌ, TIOBE ์ง€์ˆ˜ ๋ฐ ๋‹ค์–‘ํ•œ ์–ธ์–ด๋กœ ์ง„ํ–‰๋˜๋Š” ์ƒํ™ฉ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๊ด€์ฐฐ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์„ค๋ฌธ ์กฐ์‚ฌ ๊ฒฐ๊ณผ ์‘๋‹ต์ž ์ˆ˜๊ฐ€ ๋งค๋…„ 70%์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ๋Š”๋ฐ ์–ธ์–ด๊ฐ€ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

"๋ธŒ๋ ˆ์ดํ‚น ์ฒด์ธ์ง€"๋ฅผ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•ฉ๋‹ˆ๊นŒ? ๋ชจ๋“  go ์ฝ”๋“œ ์ค„์€ ์—ด๊ฑฐํ˜•์ด๋‚˜ ์ œ๋„ค๋ฆญ์„ ์ถ”๊ฐ€ํ•œ ํ›„์—๋„ ๊ณ„์† ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋‘๊ฐ€ ๊ทธ๊ฒƒ๋“ค์„ ๋‹ค๋ฃจ์–ด์•ผ ํ•˜์ง€๋งŒ ๋‹น์‹ ์€ ๊ทธ๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. iota ์—ด๊ฑฐํ˜• ๋ฐ ๋งต์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ œ๋„ค๋ฆญ์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ œ๋„ค๋ฆญ์ด ์—†๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. Java๋Š” ๋‘˜ ๋‹ค ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ์„ ์ฆ๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋™์˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ œ๋„ค๋ฆญ๊ณผ ๊ฐ™์€ ์–ธ์–ด๊ฐ€ ๋‚˜์˜ค๋ฉด ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„ ๋ชจ๋“  ๊ณณ์—์„œ ์‚ฌ์šฉ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ API๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋„. ๊ทธ ๊ฒฐ๊ณผ ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๋นŒ๋“œ ์†๋„๋ฅผ ๋Šฆ์ถ”์ง€ ์•Š๊ณ ๋Š” ์ œ๋„ค๋ฆญ์„ ์–ธ์–ด์— ์ถ”๊ฐ€ํ•  ๋ฐฉ๋ฒ•์ด ํ™•์‹คํžˆ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ œ๋„ค๋ฆญ์˜ ์˜ํ–ฅ์„ ๋งŽ์ด ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ผ๋ช… "๊ณต์งœ ์ ์‹ฌ ์—†์Œ".

"๋ธŒ๋ ˆ์ดํ‚น ์ฒด์ธ์ง€"๋ฅผ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•ฉ๋‹ˆ๊นŒ? ๋ชจ๋“  go ์ฝ”๋“œ ์ค„์€ ์—ด๊ฑฐํ˜•์ด๋‚˜ ์ œ๋„ค๋ฆญ์„ ์ถ”๊ฐ€ํ•œ ํ›„์—๋„ ๊ณ„์† ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‹น์—ฐํžˆ ์•„๋‹ˆ์ง€. ์ด ์ฝ”๋“œ๋Š” ์ด ์ œ์•ˆ์œผ๋กœ ๋” ์ด์ƒ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

package foo

var enum = 42

ํ•„์š”ํ•˜๋‹ค๋Š” ๋‹จ์–ด๋Š” "๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ"์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก , ๊ทธ๊ฒƒ์€ ์˜๋ฏธํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋‚˜๋Š” ๊ฒฐ์ฝ” ๊ทธ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๊ทธ๋Ÿฐ ๊ธฐ๋Šฅ์€ ํ•„์š”์—†๋‹ค๊ณ  ๋Œ€๋‹ตํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๋Œ€๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๊ฒƒ๋„ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํŽœ๊ณผ ์ข…์ด๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Golang์€ ๋Œ€๊ทœ๋ชจ ํŒ€์„ ์œ„ํ•œ ์–ธ์–ด๋ผ๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. golang์„ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๊ฐ€๋Šฅํ•œ ํ•œ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ •์  ์ปดํŒŒ์ผ ๋ฐ ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜•๊ณผ ์ œ๋„ค๋ฆญ ์—†์ด ์–ด๋–ป๊ฒŒ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ ํ™”๋ คํ•˜๊ฑฐ๋‚˜ ์ข‹์€ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์ง„์ง€ํ•œ ๊ฐœ๋ฐœ์— ์ ˆ๋Œ€์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—†์œผ๋ฉด ๋ชจ๋“  ๊ณณ์—์„œ{} ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ{} ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ๊ฐ–๋Š” ๊ฒƒ์ด ๋ฌด์Šจ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌผ๋ก  ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ์—†๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฏธ ๋ชจ๋“  ๊ฒƒ์„ ์ œ๊ณตํ•˜๊ณ  golang๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋น ๋ฅธ ์‹คํ–‰์„ ์ œ๊ณตํ•˜๋Š” Rust์™€ ๊ฐ™์€ ๋Œ€์•ˆ์ด ์žˆ๋‹ค๋ฉด ์™œ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? go๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ๊ณ  ๋ฐฉ์‹์„ ๊ฐ€์ง„ ๋ฏธ๋ž˜๊ฐ€ ์žˆ๋Š”์ง€ ์ •๋ง ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

ํ•„์š”ํ•˜๋‹ค๋Š” ๋‹จ์–ด๋Š” "๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ"์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์˜คํ”ˆ ์†Œ์Šค์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ธฐ์—ฌ๋ฅผ ์กด์ค‘ํ•˜๋ฉฐ golang์ด ์ทจ๋ฏธ ํ”„๋กœ์ ํŠธ๋ผ๋ฉด ์–ด๋–ค ๊ฒƒ์ด๋“  ๊ดœ์ฐฎ์ง€๋งŒ golang์€ ์ง„์ง€ํ•˜๊ฒŒ ๋ฐ›์•„๋“ค์ด๊ธฐ๋ฅผ ์›ํ•˜๋ฉฐ ํ˜„์žฌ๋กœ์„œ๋Š” ์ง€๋ฃจํ•œ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์žฅ๋‚œ๊ฐ์— ๊ฐ€๊น๊ณ  ๊ทธ๊ฒƒ์„ ๋ณ€๊ฒฝํ•  ์˜์ง€๊ฐ€ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

api๋Š” ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ์ƒˆ๋กœ์šด api ๋ถ€๋ถ„๋งŒ ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ธํ„ฐ๋„ท์—๋Š” ์ œ๋„ค๋ฆญ์ด ์—†๋Š” ๋Œ€์•ˆ์ด ํ•ญ์ƒ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‘˜ ๋‹ค ์•ฝ๊ฐ„ ๋Š๋ฆฐ ์ปดํŒŒ์ผ๊ณผ "enum"์ด๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์ตœ์†Œํ•œ์˜ ํšจ๊ณผ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ 99%์˜ ์‚ฌ๋žŒ๋“ค์€ ์•Œ์•„์ฐจ๋ฆฌ์ง€๋„ ๋ชปํ•˜๊ณ  ๋‚˜๋จธ์ง€ 1%๋Š” ๊ฒฌ๋”œ ์ˆ˜ ์žˆ๋Š” ์•ฝ๊ฐ„์˜ ์ž‘์€ ๋ณ€ํ™”๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์˜ˆ๋ฅผ ๋“ค์–ด ์ž๋ฐ”์˜ ํผ์ฆ๊ณผ ๋น„๊ตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‘˜ ๋‹ค ์•ฝ๊ฐ„ ๋Š๋ฆฐ ์ปดํŒŒ์ผ๊ณผ "enum"์ด๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์ตœ์†Œํ•œ์˜ ํšจ๊ณผ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ 99%์˜ ์‚ฌ๋žŒ๋“ค์€ ์•Œ์•„์ฐจ๋ฆฌ์ง€๋„ ๋ชปํ•˜๊ณ  ๋‚˜๋จธ์ง€ 1%๋Š” ๊ฒฌ๋”œ ์ˆ˜ ์žˆ๋Š” ์•ฝ๊ฐ„์˜ ์ž‘์€ ๋ณ€ํ™”๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ทธ๋Ÿฐ ๋ฉ‹์ง„ ์„ฑ๋Šฅ์„ ๊ฐ€์ง„ ๋””์ž์ธ๊ณผ ๊ตฌํ˜„์„ ๊ฐ€์ง€๊ณ  ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ชจ๋‘๊ฐ€ ๊ธฐ๋ปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. #15292์— ๊ธฐ์—ฌํ•ด ์ฃผ์„ธ์š”.

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด "๋ฐฑํ‚น ๋ฐ์ดํ„ฐ๊ฐ€ ์ „ํ˜€์—†๋Š” ๋‚ด ํ˜ธ์˜๋กœ ์ˆซ์ž ๋ฝ‘๊ธฐ"๋ผ๋Š” ๊ฒŒ์ž„์ด๋ผ๋ฉด ์ฃ„์†กํ•˜์ง€๋งŒ ์ฐธ์—ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ๊ณผ์˜ ์†๋„ ์ฐจ์ด์— ๋Œ€ํ•œ ์ˆ˜์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  ๋„ค, ๊ทธ ์ˆซ์ž๋“ค์€ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋กœ๋„ ๋’ท๋ฐ›์นจ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ๋“ค์€ ๋‹จ์ง€ "์—ด๊ฑฐํ˜•"์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์งˆ ํ™•๋ฅ ์ด ๊ทธ๋ฆฌ ๋†’์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๋งํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์—ด๊ฑฐํ˜•์„ Go์— ์ถ”๊ฐ€ํ• ์ง€ ์—ฌ๋ถ€์™€ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํŠน์ • ์งˆ๋ฌธ์— ๋Œ€ํ•ด ์ด ํ˜ธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋งŽ๋‹ค๋Š” ๊ฒƒ์„ ๋ชจ๋‘์—๊ฒŒ ์ƒ๊ธฐ์‹œํ‚ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. "๋ฐ”๋‘‘์€ ์ข‹์€ ์–ธ์–ด์ž…๋‹ˆ๊นŒ?"์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. "Go๊ฐ€ ๊ธฐ๋Šฅ ์ œ๊ณต์— ๋” ์ง‘์ค‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?" ๋‹ค๋ฅธ ํฌ๋Ÿผ์—์„œ ๋” ์ž˜ ๋…ผ์˜๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ๊ณผ์˜ ์†๋„ ์ฐจ์ด์— ๋Œ€ํ•œ ์ˆ˜์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์•„๋‹ˆ, ๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ์•„๋ฌด ๊ฒƒ๋„ ๊ฒŒ์‹œํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹จ์ง€ ๋น„์šฉ์ด 0์ด ๋  ์ˆ˜ ์—†๋‹ค๊ณ  ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋„ค, ๊ทธ ์ˆซ์ž๋“ค์€ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋กœ๋„ ๋’ท๋ฐ›์นจ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ๋“ค์€ ๋‹จ์ง€ "์—ด๊ฑฐํ˜•"์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์งˆ ํ™•๋ฅ ์ด ๊ทธ๋ฆฌ ๋†’์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๋งํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์„ž์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ์†์€ ์ œ๋„ค๋ฆญ์— ๊ด€ํ•œ ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. "enum"์€ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์— ๊ด€ํ•œ ๊ฒƒ์ด๊ณ  false "_Every_ go ์ฝ”๋“œ ์ค„์€ ์—ด๊ฑฐํ˜•์ด๋‚˜ ์ œ๋„ค๋ฆญ์„ ์ถ”๊ฐ€ํ•œ ํ›„์—๋„ ๊ณ„์† ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค." ์ฃผ์žฅํ•˜๋‹ค. (๋‚˜๋ฅผ ๊ฐ•์กฐํ•œ๋‹ค)

@Merovius ๋‹น์‹  ๋ง์ด ๋งž์•„์š”, ์ด์ œ ์ž… ๋‹ค๋ฌผ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ์ด ๋ฌธ์ œ์˜ ์ฃผ์ œ์ธ ์—ด๊ฑฐํ˜• ์œ ํ˜•์œผ๋กœ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๋ฉด Go์— ์ œ๋„ค๋ฆญ์ด ํ•„์š”ํ•œ ์ด์œ ์— ๋Œ€ํ•œ ์ฃผ์žฅ์„ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€๋งŒ Go์— ์—ด๊ฑฐํ˜• ์œ ํ˜•์ด ํ•„์š”ํ•œ ์ด์œ ์— ๋Œ€ํ•œ ์ฃผ์žฅ์— ๋Œ€ํ•ด์„œ๋Š” ํ›จ์”ฌ ๋” ๋ถˆ์•ˆ์ •ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ์œ„์˜ https://github.com/golang/go/issues/19814#issuecomment -290878151์—์„œ ์งˆ๋ฌธํ–ˆ๋Š”๋ฐ ์—ฌ์ „ํžˆ ๋ถˆ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ์ข‹์€ ๋Œ€๋‹ต์ด ์žˆ์—ˆ๋‹ค๋ฉด ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋†“์ณค์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ๊ทธ๊ฒƒ์„ ๋ฐ˜๋ณตํ•˜๊ฑฐ๋‚˜ ์ง€์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌ ํ•ด์š”.

@ianlancetaylor ๋‚˜๋Š” ์œ ์Šค ์ผ€์ด์Šค๊ฐ€ ๋ณต์žกํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ’์ด ๋ฏธ๋ฆฌ ์ •์˜๋œ ๊ฐ’ ์„ธํŠธ์— ์†ํ•˜๋„๋ก ํ•˜๋Š” ์•ˆ์ „ํ•œ ์œ ํ˜•์˜ ๋ฐฉ๋ฒ•์„ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์˜ค๋Š˜๋‚  Go์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์œ ์ผํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋ณธ์งˆ์ ์œผ๋กœ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” RPC ๋ฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํฌํ•จํ•˜์—ฌ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์ง„์ž…์ ์—์„œ ์ˆ˜๋™์œผ๋กœ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ณต์„ ์œ„ํ•œ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์ƒ์˜ ์žฅ์ ์€ ๋งŽ์€ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ์ฃผ๊ด€์ ์ด๊ณ  ๋ถ„๋ช…ํžˆ ์œ„์˜ ์ฃผ์žฅ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๊ทธ ํž˜์— ๋Œ€ํ•ด ์„ค๋“๋ ฅ์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณธ์งˆ์ ์œผ๋กœ ์–ธ์–ด ์ˆ˜์ค€์—์„œ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ์„ ํฌ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.

@ianlancetaylor : ๋ชจ๋“  ๊ฒƒ์€ ์œ ํ˜• ์•ˆ์ „์„ฑ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜คํƒ€๋กœ ์ธํ•œ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜์˜ ์œ„ํ—˜์„ ์ตœ์†Œํ™”ํ•˜๊ฑฐ๋‚˜ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ์œ ํ˜•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ go์—์„œ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

if enumReference == 1

ํ˜„์žฌ ์—ด๊ฑฐํ˜•์€ ์ˆซ์ž ๋˜๋Š” ๊ธฐํƒ€ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํ•ด๋‹น ์ฝ”๋“œ๋Š” ์ „ํ˜€ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋ฉฐ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ช‡ ๋…„ ์ „์— Java ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋™์ผํ•œ ํ† ๋ก ์ด ๊ทธ๋“ค์ด ์ค‘์š”์„ฑ์„ ์ดํ•ดํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ด๊ฑฐํ˜•์„ ๋„์ž…ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค.

๋งŒ ์“ธ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

if enumReference == enumType

if enumReference == 1 ๊ฐ€ ๋” ์ˆจ๊ฒจ์ง„ ๋ฐฉ์‹์œผ๋กœ ๋ฐœ์ƒํ•˜๊ณ  ๋Ÿฐํƒ€์ž„์—๋งŒ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ถ”๊ฐ€ ๋ฌธ์ œ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ƒ์ƒํ•˜๋Š” ๋ฐ ๋„ˆ๋ฌด ๋งŽ์€ ํ™˜์ƒ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹จ์ง€ ์–ธ๊ธ‰ํ•˜๊ณ  ์‹ถ๋‹ค: Go๋Š” ๊ทธ๊ฒƒ์˜ ์ž ์žฌ๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, ๋‹น์‹ ์ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ƒˆ๋กœ์šด ๊ฐœ๋…์ด๋‚˜ ํŒจ๋Ÿฌ๋‹ค์ž„์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์—ฌ๊ธฐ์—์„œ ์ˆ˜๋…„ ๋™์•ˆ ์ž…์ฆ๋˜๊ณ  ์ดํ•ด๋œ ๊ฒƒ๋“ค๊ณผ ๊ฐœ๋…์ด ๋…ผ์˜๋œ๋‹ค๋Š” ๊ฒƒ์ด ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜• ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ์—ด๊ฑฐํ˜•๋ณด๋‹ค ๋” ๋‚˜์€ ๊ฒƒ์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

Go๋Š” ์ž ์žฌ๋ ฅ์ด ์žˆ์ง€๋งŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ƒˆ๋กœ์šด ๊ฐœ๋…์ด๋‚˜ ํŒจ๋Ÿฌ๋‹ค์ž„์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์—ฌ๊ธฐ์—์„œ ์ˆ˜๋…„ ๋™์•ˆ ์ž…์ฆ๋˜๊ณ  ์ดํ•ด๋œ ๊ฒƒ๋“ค๊ณผ ๊ฐœ๋…์ด ๋…ผ์˜๋œ๋‹ค๋Š” ๊ฒƒ์ด ์ด์ƒํ•ฉ๋‹ˆ๋‹ค.

Afais, ํŠนํžˆ ์ œ๋„ค๋ฆญ, ํ•ฉ๊ณ„ ์œ ํ˜• ๋“ฑ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ํ† ๋ก ์„ ๋”ฐ๋ฅด๋Š” ๋™์•ˆ... ๊ทธ๊ฒƒ์€ ๋ณด์œ  ์—ฌ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Javas ์œ ํ˜• ์‹œ์Šคํ…œ์€ ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚˜๊ณ  ์‚ฌ์–‘์ด ์ž˜ ์ง€์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํฐ ์ฐจ์ด์ž…๋‹ˆ๋‹ค.

Go์—์„œ ์‚ฌ๋žŒ๋“ค์€ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋ณต์žก์„ฑ์„ ์ฆ๊ฐ€์‹œํ‚ค์ง€ ์•Š์œผ๋ฉด์„œ ์–ธ์–ด์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ดˆ๊ธฐ ์•„์ด๋””์–ด๋ฅผ ํฌ๊ธฐํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚˜ ์—ญ์‹œ ์ด๋Ÿฌํ•œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ํ˜„์žฌ์˜ ํ˜•์‹๊ณผ ํ’ˆ์งˆ์—์„œ ๋‹ค์†Œ ๋ฌด์˜๋ฏธํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ณ  ๋ฐฉํ•ด๊ฐ€ ์ ์€ ๊ตฌํ˜„์„ ์ฐพ๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒƒ์€ ๋” ์ด์ƒ ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@derekperkins @rudolfschmidt ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. C++์— ์—ด๊ฑฐํ˜• ์œ ํ˜•์ด ์žˆ์ง€๋งŒ ์ œ์•ˆํ•˜๋Š” ๊ธฐ๋Šฅ์€ C++์— ์—†๋‹ค๋Š” ์ ์„ ๋ถ„๋ช…ํžˆ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋ถ„๋ช…ํ•œ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.,

์ผ๋ฐ˜์ ์œผ๋กœ ์—ด๊ฑฐํ˜• ์œ ํ˜•์˜ ๋ณ€์ˆ˜๊ฐ€ ํ•ด๋‹น ์—ด๊ฑฐํ˜•์˜ ๊ฐ’๋งŒ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ์“ธ๋ชจ๊ฐ€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ์ž„์˜์˜ ์ •์ˆ˜์—์„œ ์—ด๊ฑฐํ˜• ์œ ํ˜•์œผ๋กœ์˜ ๋ณ€ํ™˜์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ์—ด๊ฑฐํ˜•์„ ๋ณด๋‚ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ธ€์Ž„, ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ๊ฐ ์—ด๊ฑฐํ˜• ๊ฐ’์— ๋Œ€ํ•ด ๋Œ€์†Œ๋ฌธ์ž๊ฐ€ ์žˆ๋Š” ์Šค์œ„์น˜๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ •๋ง ์ง€๋ฃจํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์œ ํ˜• ๋ณ€ํ™˜ ์ค‘์— ๊ฐ’์ด ์œ ํšจํ•œ ์—ด๊ฑฐํ˜• ๊ฐ’์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๊นŒ? ๊ฐ’์ด ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹นํ™ฉํ•ฉ๋‹ˆ๊นŒ?

์—ด๊ฑฐํ˜• ๊ฐ’์€ ์ˆœ์ฐจ์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด C++์—์„œ์™€ ๊ฐ™์ด ๋ชจ๋“  ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

Go์—์„œ ์ƒ์ˆ˜๋Š” ์œ ํ˜•์ด ์—†์œผ๋ฏ€๋กœ ์ •์ˆ˜์—์„œ ์—ด๊ฑฐํ˜•์œผ๋กœ์˜ ๋ณ€ํ™˜์„ ํ—ˆ์šฉํ•˜๋ฉด if enumVal == 1 ๋ฅผ ๊ธˆ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Go์˜ ์ผ๋ฐ˜์ ์ธ ๋””์ž์ธ ์›์น™ ์ค‘ ํ•˜๋‚˜๋Š” Go๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์œ ํ˜•์ด ์•„๋‹ˆ๋ผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋„์›€์ด ๋˜๋Š” ์—ด๊ฑฐํ˜• ์œ ํ˜•์˜ ์ด์ ์€ ์•„์ง ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ Go์— ์—†๋Š” ์ข…๋ฅ˜์˜ ์œ ํ˜• ์ œ์•ฝ ์„ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ข‹๋“  ๋‚˜์˜๋“  Go๋Š” ์œ ํ˜•์˜ ๊ฐ’์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Go์— ์—ด๊ฑฐํ˜•์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ์ฐฌ์„ฑํ•˜๋Š” ์ฃผ์žฅ์€ ์•„์ง ์„ค๋“๋ ฅ์ด ์—†์–ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ์—ด๊ฑฐํ˜•์„ ์˜ค๋Š˜๋‚ ๊ณผ ๊ฐ™์ด ์œ ์ง€ํ•˜๊ณ  ๊ทธ ์œ„์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

  • enum ์œ ํ˜•์—๋Š” ๊ธฐ๋ณธ ๊ฐ’ ์œ ํ˜•๊ณผ ์—ฐ๊ด€๋œ ๋ช‡ ๊ฐ€์ง€ ๋ช…๋ช…๋œ ์ƒ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ธฐ๋ณธ ์œ ํ˜•์ด ํ˜ธํ™˜๋˜๋Š” ํ•œ ์ž„์˜ ๊ฐ’์—์„œ ์—ด๊ฑฐํ˜• ๊ฐ’์œผ๋กœ์˜ ๋ณ€ํ™˜์„ ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. int ์œ ํ˜•์˜ ๊ฐ’์€ ๋ชจ๋“  ์ •์ˆ˜ ์—ด๊ฑฐํ˜• ์œ ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์œ ํšจํ•˜์ง€ ์•Š์€ ์—ด๊ฑฐํ˜• ๊ฐ’์œผ๋กœ ์ด์–ด์ง€๋Š” ๋ณ€ํ™˜์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜•์€ ๋ณ€์ˆ˜๊ฐ€ ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์— ์ œ์•ฝ์„ ๋‘์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ ์œ„์— ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์—ด๊ฑฐํ˜• ๊ฐ’์˜ ๋ฌธ์ž์—ดํ™”. ๋‚ด ๊ฒฝํ—˜์ƒ UI ๋ฐ ๋กœ๊น…์— ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜• ๊ฐ’์ด ์œ ํšจํ•˜๋ฉด ๋ฌธ์ž์—ดํ™”๋Š” ์ƒ์ˆ˜์˜ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ ๊ฐ’์˜ ๋ฌธ์ž์—ด ํ‘œํ˜„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. -1 ๊ฐ€ ์ผ๋ถ€ ์—ด๊ฑฐํ˜• ์œ ํ˜• Foo ์˜ ์œ ํšจํ•œ ์—ด๊ฑฐํ˜• ๊ฐ’์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋ฌธ์ž์—ดํ™”๋Š” -1 ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ’์ด ๋Ÿฐํƒ€์ž„์— ์œ ํšจํ•œ ์—ด๊ฑฐํ˜• ๊ฐ’์ธ์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์œ ํ˜•์˜ ํ”„๋กœํ† ์ฝœ๋กœ ์ž‘์—…ํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœํ† ์ฝœ์ด ๋ฐœ์ „ํ•จ์— ๋”ฐ๋ผ ํ”„๋กœ๊ทธ๋žจ์ด ์•Œ์ง€ ๋ชปํ•˜๋Š” ์ƒˆ๋กœ์šด ์—ด๊ฑฐํ˜• ๊ฐ’์ด ๋„์ž…๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ๋‹จ์ˆœํ•œ ์‹ค์ˆ˜์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋‹น์žฅ์€ ์—ด๊ฑฐํ˜• ๊ฐ’์ด ์—„๊ฒฉํ•˜๊ฒŒ ์ˆœ์ฐจ์ ์ธ์ง€ ํ™•์ธํ•˜๊ฑฐ๋‚˜(ํ•ญ์ƒ ์‹œํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹˜) ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฐ’์„ ์ˆ˜๋™์œผ๋กœ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ์ฝ”๋“œ๋Š” ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์ปค์ง€๊ณ  ์‹ค์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์—ด๊ฑฐํ˜• ์œ ํ˜•์˜ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฐ’์„ ์—ด๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์—ฌ๊ธฐ์—์„œ ์ด๊ฒƒ์„ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜๊ณ  ๋‹ค๋ฅธ ์–ธ์–ด์—๋„ ์ด๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ ๋‚˜ ์ž์‹ ์ด ๊ทธ๊ฒƒ์„ ํ•„์š”๋กœ ํ•œ ๊ธฐ์–ต์ด ์—†์œผ๋ฏ€๋กœ ์ด์— ์ฐฌ์„ฑํ•˜๋Š” ๊ฐœ์ธ์ ์ธ ๊ฒฝํ—˜์ด ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด ์ •๋‹น์„ฑ์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋ฒ„๊ทธ๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์ž‘์—…์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์†์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ์ฝ”๋“œ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์™ธ๋ถ€ ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•˜๊ธฐ๊นŒ์ง€ ์ง€๋ฃจํ•˜๊ณ  ๋ถˆํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ ์—ด๊ฑฐํ˜•์„ ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•˜๊ณ  ์ œํ•œํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ๋‚˜๋Š” Go๊ฐ€ Swift๋‚˜ Java์˜ ์—ด๊ฑฐํ˜•๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.


switch ๋ฌธ์ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์—ด๊ฑฐํ˜• ๊ฐ’์„ ํฌํ•จํ•˜๋Š”์ง€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ œ์•ˆ์œผ๋กœ๋Š” ์•„๋ฌด ์†Œ์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค. ์†Œ์ง„ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ด๋„ ์œ ํšจํ•˜์ง€ ์•Š์€ ์—ด๊ฑฐํ˜• ๊ฐ’์€ ๋‹ค๋ฃจ์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ๊ธฐ๋ณธ ์ผ€์ด์Šค๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ ์ง„์ ์ธ ์ฝ”๋“œ ๋ณต๊ตฌ๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์€ switch ๋ฌธ์— ๊ธฐ๋ณธ ์ผ€์ด์Šค๊ฐ€ ์—†์œผ๋ฉด ๊ฒฝ๊ณ ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์–ธ์–ด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ianlancetaylor ๋‚˜๋Š” ๋‹น์‹ ์˜ ์ฃผ์žฅ์— ๋ช‡ ๊ฐ€์ง€ ๊ฒฐํ•จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์—ด๊ฑฐํ˜• ์œ ํ˜•์˜ ๋ณ€์ˆ˜๊ฐ€ ํ•ด๋‹น ์—ด๊ฑฐํ˜•์˜ ๊ฐ’๋งŒ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ์“ธ๋ชจ๊ฐ€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ์ž„์˜์˜ ์ •์ˆ˜์—์„œ ์—ด๊ฑฐํ˜• ์œ ํ˜•์œผ๋กœ์˜ ๋ณ€ํ™˜์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ์—ด๊ฑฐํ˜•์„ ๋ณด๋‚ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ ์ถ”์ƒํ™”๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. Go ๋Š” ๋งŽ์€ ์ถ”์ƒํ™”๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

package main

import "fmt"

const NULL = 0x0

func main() {
    str := "hello"
    if &str == NULL {
        fmt.Println("str is null")
    }
}

๊ทธ๋Ÿฌ๋‚˜ C ์—์„œ๋Š” ์ด ์Šคํƒ€์ผ์˜ ํ”„๋กœ๊ทธ๋žจ์ด ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค. Go ๋Š” ๊ฐ•๋ ฅํ•œ ํ˜•์‹์ด๊ณ  C ๋Š” ๊ทธ๋ ‡์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์—ด๊ฑฐํ˜•์˜ ์ธ๋ฑ์Šค๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์ €์žฅ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ์™€ ์œ ์‚ฌํ•œ ์ถ”์ƒํ™”๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ˆจ๊ฒจ์ง‘๋‹ˆ๋‹ค.

@zerkms ์˜ˆ, ๊ทธ๊ฒƒ์€ ํ•˜๋‚˜์˜ ๊ฐ€๋Šฅ์„ฑ์ด์ง€๋งŒ d ์œ ํ˜•์ด ์ฃผ์–ด์ง€๋ฉด ์œ ํ˜• ์ถ”๋ก ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ (๊ท€ํ•˜์˜ ์˜ˆ์—์„œ์™€ ๊ฐ™์ด) ์—ด๊ฑฐํ˜•์˜ ์ •๊ทœํ™”๋œ ์‚ฌ์šฉ์€ ์ฝ๊ธฐ๊ฐ€ ์กฐ๊ธˆ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

@ianlancetaylor ๋‹น์‹ ์ด ๋งํ•˜๋Š” ์—ด๊ฑฐํ˜•์˜ C ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ์›ํ•˜์ง€๋งŒ, imo:

์—ด๊ฑฐํ˜• ๊ฐ’์—๋Š” ์ˆซ์ž ์†์„ฑ์ด ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์—ด๊ฑฐํ˜• ์œ ํ˜•์˜ ๊ฐ’์€ ์ˆซ์ž๋‚˜ ๋‹ค๋ฅธ ์—ด๊ฑฐํ˜• ์œ ํ˜•๊ณผ ๊ด€๋ จ์ด ์—†๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์ ์šฉ๋˜๋Š” ๊ฐœ๋ณ„ ๋ ˆ์ด๋ธ”์˜ ๊ณ ์œ ํ•œ ์œ ํ•œํ•œ ์œ ๋‹ˆ๋ฒ„์Šค์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ’ ์Œ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ == ๋˜๋Š” != ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ž‘์—…์€ ๋ฉ”์„œ๋“œ ๋˜๋Š” ํ•จ์ˆ˜๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„์€ ํ•ด๋‹น ๊ฐ’์„ ์ •์ˆ˜๋กœ ์ปดํŒŒ์ผํ•˜์ง€๋งŒ ์•ˆ์ „ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ฐ˜์‚ฌ๋ฅผ ์ œ์™ธํ•˜๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ์ง์ ‘ ๋…ธ์ถœ๋˜์–ด์•ผ ํ•˜๋Š” ์ •๋‹นํ•œ ์ด์œ ๊ฐ€ ์žˆ๋Š” ๊ทผ๋ณธ์ ์ธ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐ™์€ ์ด์œ ๋กœ false bool(0) ๋ฅผ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์—ด๊ฑฐํ˜•์„ ์ˆซ์ž๋‚˜ ๋‹ค๋ฅธ ์œ ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด ๋ชจ๋“  ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ƒํ™ฉ์— ์ ํ•ฉํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์ง€๋ฃจํ•˜๋‹ค๋ฉด ์ŠคํŠธ๋ง๊ฑฐ์™€ ๊ฐ™์€ ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ ์–ด๋„ switch ๋ฌธ์˜ ๊ฒฝ์šฐ๋ฅผ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด ๋ฌด์–ธ๊ฐ€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค ์™ธ๋ถ€๋กœ ๊ฐ’์„ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ ์ž˜ ์ •์˜๋œ ํ‘œ์ค€์„ ๋”ฐ๋ฅด๊ฑฐ๋‚˜ ์†Œ์Šค์—์„œ ์ปดํŒŒ์ผ๋œ ํ”„๋กœ๊ทธ๋žจ์˜ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์™€ ๋Œ€ํ™”ํ•˜๊ณ  ์žˆ๊ฑฐ๋‚˜ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ int๊ฐ€ ์ข‹์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ€์žฅ ์ž‘์€ ๊ณต๊ฐ„์— ์ ํ•ฉํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋“ค ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ์œ ์ง€๋˜์ง€ ์•Š์œผ๋ฉฐ ๊ฐ’์ด ์œ ํ˜• ์ •์˜์˜ ์†Œ์Šค ์ˆœ์„œ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋„๋ก ๋ฌธ์ž์—ด ํ‘œํ˜„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ •์˜์—์„œ ์•ŒํŒŒ๋ฒณ์ˆœ์œผ๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Blue๊ฐ€ Green ์•ž์— ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฒฐ์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์„ธ์Šค A์˜ Green์ด ํ”„๋กœ์„ธ์Šค B์˜ Blue๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ unrecognized color "Blue" ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ์ƒํƒœ๋ฅผ ์ถ”์ƒ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ์ข‹์€ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํƒœ๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ ํ”„๋กœ๊ทธ๋žจ์„ ๋– ๋‚˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(๋ฌผ๋ก  ์ข…์ข… ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด๋‹น ์ƒํƒœ์™€ ์—ฐ๊ฒฐํ•˜๊ณ  ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ์œ ํ˜•์€ ์ƒํƒœ๋งˆ๋‹ค ๋‹ค๋ฆ…๋‹ˆ๋‹ค. . .)

@ljeabmreosn ๋‚ด ์š”์ ์€ Go๊ฐ€ ์ •์ˆ˜์—์„œ ์—ด๊ฑฐํ˜• ์œ ํ˜•์œผ๋กœ ๋ณ€ํ™˜์„ ํ—ˆ์šฉํ•œ๋‹ค๋ฉด ์œ ํ˜•์ด ์ง€์ •๋˜์ง€ ์•Š์€ ์ƒ์ˆ˜๊ฐ€ ์ž๋™์œผ๋กœ ์—ด๊ฑฐํ˜• ์œ ํ˜•์œผ๋กœ ๋ณ€ํ™˜๋˜๋Š” ๊ฒƒ์ด ๋‹น์—ฐํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Go๋Š” ์ •์ˆ˜์—์„œ ํฌ์ธํ„ฐ ์œ ํ˜•์œผ๋กœ์˜ ๋ณ€ํ™˜์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋Œ€ ์˜ˆ๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

@jimmyfrasche ์ •์ˆ˜์™€ ์—ด๊ฑฐํ˜• ์‚ฌ์ด๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ์Šค์œ„์น˜๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค๋ฉด Go์—์„œ ๊น”๋”ํ•˜๊ฒŒ ์ž‘๋™ํ•  ๊ฒƒ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ์†”์งํžˆ ์–ธ์–ด ์ž์ฒด์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์ถฉ๋ถ„ํžˆ ์œ ์šฉํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•ฉ๊ณ„ ์œ ํ˜•์˜ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋˜๋ฉฐ, ์ด์— ๋Œ€ํ•ด์„œ๋Š” #19412๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์—ฌ๊ธฐ์— ๋งŽ์€ ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ์˜๊ฒฌ: ์—ด๊ฑฐํ˜•์— ๋Œ€ํ•ด ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ๊ฐ’(์˜ˆ: int)์„ ๋…ธ์ถœํ•˜์ง€ ์•Š๋Š” ์ œ์•ˆ์— ๋Œ€ํ•ด ๋‹ต๋ณ€ํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์—ด๊ฑฐํ˜• ์œ ํ˜•์˜ 0 ๊ฐ’์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

ํ•œ ์—ด๊ฑฐํ˜•์—์„œ ๋‹ค๋ฅธ ์—ด๊ฑฐํ˜•์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ด๋™ํ•ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์š”์ผ์ด ์—ด๊ฑฐํ˜•์˜ ์ •์‹ ์˜ˆ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ˆ˜์š”์ผ์—์„œ ๋ชฉ์š”์ผ๋กœ "์ฆ๊ฐ€"ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์œ„ํ•ด ํฐ switch ๋ฌธ์„ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(๋˜ํ•œ "๋ฌธ์ž์—ดํ™”"์™€ ๊ด€๋ จํ•˜์—ฌ ์š”์ผ์— ๋Œ€ํ•œ ์˜ฌ๋ฐ”๋ฅธ ๋ฌธ์ž์—ด์€ ์–ธ์–ด ๋ฐ ๋กœ์ผ€์ผ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.)

@josharian stringification์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์—ด๊ฑฐํ˜• ๊ฐ’์˜ ์ด๋ฆ„์„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ˜„์ง€ํ™” ๋˜๋Š” ์•„๋ฌด๊ฒƒ๋„ ์—†์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ๋ผ์ด์ œ์ด์…˜๊ณผ ๊ฐ™์€ ๊ทธ ์œ„์— ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ตฌ์ถ•ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์ˆ˜๋‹จ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‹ค๋ฅธ ์–ธ์–ด๋Š” ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ’๋ถ€ํ•œ ์–ธ์–ด ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ผ๋ถ€ C# ์œ ํ˜•์—๋Š” ๋ฌธํ™” ์ •๋ณด๋„ ์‚ฌ์šฉํ•˜๋Š” ToString ์žฌ์ •์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” DateTime ๊ฐœ์ฒด ์ž์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ˜•์‹ ๋ฐ ๋ฌธํ™” ์ •๋ณด๋ฅผ ๋ชจ๋‘ ํ—ˆ์šฉํ•˜๋Š” ToString ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์žฌ์ •์˜๋Š” ํ‘œ์ค€์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ƒ์†ํ•˜๋Š” $#$4$ object ํด๋ž˜์Šค์—๋Š” ToString() ์žˆ์Šต๋‹ˆ๋‹ค. Go์˜ ์ŠคํŠธ๋ง๊ฑฐ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ฑฐ์˜ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ˜„์ง€ํ™”๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ด ์ œ์•ˆ๊ณผ ์—ด๊ฑฐ์—์„œ ๋ฒ—์–ด๋‚˜์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž ์ •์˜ ์ŠคํŠธ๋ง๊ฑฐ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@josharian ๊ตฌํ˜„ ์ธก๋ฉด์—์„œ ์—ฌ์ „ํžˆ int์ด๊ณ  0 ๊ฐ’์€ ๋ชจ๋“  ๋น„ํŠธ๊ฐ€ 0์ด๋ฏ€๋กœ 0 ๊ฐ’์€ ์†Œ์Šค ์ˆœ์„œ์˜ ์ฒซ ๋ฒˆ์งธ ๊ฐ’์ด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์›”์š”์ผ ๋˜๋Š” ์ผ์š”์ผ์— ํ•œ ์ฃผ๊ฐ€ ์‹œ์ž‘๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” 0 ๊ฐ’์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ๋Š” ๊ฝค ์ข‹์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก , ๋‚˜๋จธ์ง€ ํ•ญ์˜ ์ˆœ์„œ๊ฐ€ ๊ทธ๋Ÿฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ณ  ๊ฐ’์„ ์žฌ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ด ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์‚ฌ์†Œํ•˜์ง€ ์•Š์€ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋œ ์ข‹์€ ์ผ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ const/iota์™€ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@creker ๊ฐ€ ๋งํ•œ ๊ฒƒ์„ ๋‹ค์‹œ ๋ฌธ์ž์—ดํ™”ํ•˜์‹ญ์‹œ์˜ค. ํ™•์žฅํ•˜๋ ค๋ฉด

var e enum {
  Sunday
  Monday
  //etc.
}
fmt.Println(reflect.ValueOf(e))

์ผ์š”์ผ์„ ์ธ์‡„ํ•˜๋ ค๋ฉด 0์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ ˆ์ด๋ธ”์€ ํ‘œ์‹œ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ’์ž…๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ์•”์‹œ์  String ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ ˆ์ด๋ธ”์ด ์œ ํ˜•์˜ ์ผ๋ถ€๋กœ ์ €์žฅ๋˜๊ณ  ๋ฆฌํ”Œ๋ ‰์…˜์„ ํ†ตํ•ด ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. (์•„๋งˆ๋„ Println์€ ์—ด๊ฑฐํ˜•์ด๋‚˜ ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์—์„œ ๋ฐ˜์‚ฌ.Value์— ๋Œ€ํ•ด Label()์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๊นŒ? fmt๊ฐ€ ๋ถ€๋‘๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊นŠ์ด ์‚ดํŽด๋ณด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.)

ํ•œ ์—ด๊ฑฐํ˜•์—์„œ ๋‹ค๋ฅธ ์—ด๊ฑฐํ˜•์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ด๋™ํ•ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์š”์ผ์ด ์—ด๊ฑฐํ˜•์˜ ์ •์‹ ์˜ˆ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ˆ˜์š”์ผ์—์„œ ๋ชฉ์š”์ผ๋กœ "์ฆ๊ฐ€"ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์œ„ํ•ด ํฐ switch ๋ฌธ์„ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฆฌํ”Œ๋ ‰์…˜์ด๋‚˜ ํฐ ์Šค์œ„์น˜๊ฐ€ ๋งž๋Š” ๊ฒƒ ๊ฐ™์•„์š”. ์ผ๋ฐ˜ ํŒจํ„ด์€ ํ•ด๋‹น ์œ ํ˜•์˜ ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜ ๋˜๋Š” ์œ ํ˜•์— ๋Œ€ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด go generate๋กœ ์‰ฝ๊ฒŒ ์ฑ„์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด๋ฅผ ํ‘œํ˜„์— ๋Œ€ํ•œ ์‚ฐ์ˆ  ์—ฐ์‚ฐ์œผ๋กœ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•ด ์ธ์‹ํ•  ์ˆ˜๋„ ์žˆ์Œ).

๋ชจ๋“  ์—ด๊ฑฐํ˜•์— ์ „์ฒด ์ˆœ์„œ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์ˆœํ™˜์ ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. type failure enum { none; input; file; network } ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ์ž˜๋ชป๋œ ์ž…๋ ฅ์ด ํŒŒ์ผ ์˜ค๋ฅ˜๋ณด๋‹ค ์ ๊ฑฐ๋‚˜ ํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ๋Š˜๋ฆฌ๋ฉด ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๋ฅผ ๋Š˜๋ฆฌ๋ฉด ์„ฑ๊ณตํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด ์ •๋ง ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ฃผ์š” ์šฉ๋„๊ฐ€ ์ˆœํ™˜ ์ˆœ์„œ ๊ฐ’์„ ์œ„ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์ •์ˆ˜ ์œ ํ˜•์˜ ์ƒˆ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž˜๋ชป๋œ ๊ตฌ๋ฌธ์ด์ง€๋งŒ ํ† ๋ก ์„ ์œ„ํ•ด I ๊ฐ€ ์ •์ˆ˜ ์œ ํ˜•์ด๊ณ  N ๊ฐ€ ์ •์ˆ˜ ์ƒ์ˆ˜์ธ I%N ๋ผ๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ์œ ํ˜•์˜ ๊ฐ’์„ ๊ฐ€์ง„ ๋ชจ๋“  ์‚ฐ์ˆ ์€ ์•”์‹œ์ ์œผ๋กœ mod N์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type Weekday uint%7
const (
  Sunday Weekday = iota
  //etc.

๊ทธ๋ž˜์„œ ํ† ์š”์ผ + 1 == ์ผ์š”์ผ ๋ฐ ํ‰์ผ(456) == ์›”์š”์ผ. ์œ ํšจํ•˜์ง€ ์•Š์€ ์š”์ผ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ const/iota ์™ธ๋ถ€์—์„œ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ianlancetaylor ๊ฐ€ ๋‚ด๊ฐ€ ์ •๋ง๋กœ ์›ํ•˜๋Š” ๊ฒƒ์€ ํ•ฉ๊ณ„ ์œ ํ˜•์ด๋ผ๊ณ  ์ง€์ ํ–ˆ๋“ฏ์ด ์ˆซ์ž y๋ฅผ ์ „ํ˜€ ์›ํ•˜์ง€ ์•Š์„ ๋•Œ.

์ž„์˜์˜ ๋ชจ๋“ˆ์‹ ์‚ฐ์ˆ  ์œ ํ˜•์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ํฅ๋ฏธ๋กœ์šด ์ œ์•ˆ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์—ด๊ฑฐํ˜•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ฐ„๋‹จํ•œ String ๋ฉ”์„œ๋“œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var Weekdays = [...]string{"Sunday", ..., "Saturday"}

type Weekday = uint % len(Weekdays)

์ž„์˜์˜ ํฌ๊ธฐ์˜ int์™€ ๊ฒฐํ•ฉํ•˜๋ฉด int128, int256 ๋“ฑ๋„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ๋‚ด์žฅ ๊ธฐ๋Šฅ์„ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

type uint8 = uint%(1<<8)
// etc

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด์ „๋ณด๋‹ค ๋” ๋งŽ์€ ๋ฒ”์œ„๋ฅผ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  API๋Š” ์œ ํ˜•์„ ํ†ตํ•ด ๋ณด๋‹ค ์ •ํ™•ํ•œ ์–ด์„ค์…˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด math/bits ์˜ ํ•จ์ˆ˜ Len64 $๋Š” ์ด์ œ uint % 64 ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

RISC-V ํฌํŠธ์—์„œ ์ž‘์—…ํ•  ๋•Œ ๋ช…๋ น์–ด ์ธ์ฝ”๋”ฉ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ 12๋น„ํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— uint12 ์œ ํ˜•์„ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค. uint % (1<<12) ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ๋น„ํŠธ ์กฐ์ž‘, ํŠนํžˆ ํ”„๋กœํ† ์ฝœ์—์„œ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๋‹จ์ ๋„ ์ƒ๋‹นํ•ฉ๋‹ˆ๋‹ค. Go๋Š” ์œ ํ˜•๋ณด๋‹ค ์ฝ”๋“œ๋ฅผ ์„ ํ˜ธํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์œผ๋ฉฐ ์ด๋Š” ์œ ํ˜•์ด ๋งŽ์Šต๋‹ˆ๋‹ค. + ๋ฐ -์™€ ๊ฐ™์€ ์—ฐ์‚ฐ์€ ๊ฐ‘์ž๊ธฐ %๋งŒํผ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์ข…๋ฅ˜์˜ ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ๊ฑฐ์˜ ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋Šฅ๊ณผ ์ƒํ˜ธ ์šด์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ‘œ์ค€ uint8 , uint16 ๋“ฑ์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๋ฉฐ ๋‹ค์‹œ ๋ณ€ํ™˜ํ•˜๋ฉด ๊ฒฝ๊ณ„๋ฅผ ์ˆจ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹คํŒจ(์ž์ฒด ๋ณต์žก์„ฑ์„ ๋„์ž…ํ•˜๋Š” ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ํŒจ๋‹‰ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•  ๋ฐฉ๋ฒ•์ด ์—†๋Š” ๊ฒฝ์šฐ). ๊ทธ๋ฆฌ๊ณ  HTTP ์ƒํƒœ ์ฝ”๋“œ์— uint % 1000 ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํฅ๋ฏธ๋กœ์šด ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค. :)


๊ธฐํƒ€ ์‚ฌ์†Œํ•œ ๋‹ต๋ณ€:

๊ทธ๊ฒƒ์€ ์ผ์ข…์˜ ๋‚ด๋ฉด์„ ๋ˆ„์„คํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ทธ๋“ค์ด ์ •๋ง๋กœ int๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. :)

์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์€ go generate๋กœ ์‰ฝ๊ฒŒ ์ฑ„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ์—ด๊ฑฐํ˜•์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ String ํ•จ์ˆ˜ ๋ฐ ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ ๋“ฑ์„ ์ƒ์„ฑํ•˜๊ณ  ์–ธ์–ด ์ง€์›์˜ ๋ฌด๊ฒŒ ๋Œ€์‹  ์ฝ”๋“œ ์ƒ์„ฑ์œผ๋กœ ์—ด๊ฑฐํ˜•์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์—ด๊ฑฐํ˜•์— ์ „์ฒด ์ˆœ์„œ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์ˆœํ™˜์ ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿด ์ˆ˜ ์žˆ์ง€. ์ด๊ฒƒ์€ ์†Œ์ˆ˜์˜ ๊ตฌ์ฒด์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์—ด๊ฑฐํ˜•์—์„œ ์›ํ•˜๋Š” ๊ฒƒ์„ ์ •ํ™•ํžˆ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ช…ํ™•ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์—†์„ ๊ฒƒ์ด๋ฉฐ ๋‹ค๋ฅธ ์–ธ์–ด ๊ตฌ์„ฑ(์ฆ‰, ํ˜„์ƒ ์œ ์ง€)์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ด๊ฑฐํ˜•์„ ์—๋ฎฌ๋ ˆ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํ•ฉ๋ฆฌ์ ์ผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๊ฐ€์„ค์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

@creker ๊ฐ€ ๋งํ•œ ๊ฒƒ์„ ๋‹ค์‹œ ๋ฌธ์ž์—ดํ™”ํ•˜์‹ญ์‹œ์˜ค.

๊ทธ๋Ÿด ์ˆ˜ ์žˆ์ง€. ๊ทธ๋Ÿฌ๋‚˜ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ฒฝ์šฐ๊ฐ€ ์š”์ผ๊ณผ ๊ฐ™์„์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ์‚ฌ์šฉ์ž๊ฐ€ ๋Œ€๋ฉดํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ. ๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ž์—ดํ™”๋Š” ์—ด๊ฑฐํ˜•์— ๋Œ€ํ•œ ์ฃผ์š” ์š”์ฒญ ์ค‘ ํ•˜๋‚˜์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@josharian ์‹ค์ œ๋กœ int์ธ ์—ด๊ฑฐํ˜•์€ ์•„๋งˆ๋„ ๋น„์Šทํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด enum { A; B; C}(42) ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ปดํŒŒ์ผ๋Ÿฌ ์˜ค๋ฅ˜๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋Ÿฐํƒ€์ž„์— int๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ int์—์„œ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋” ๋ณต์žกํ•œ ์ฝ”๋“œ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

A ๋˜๋Š” ๋Ÿฐํƒ€์ž„ ํŒจ๋‹‰์ž…๋‹ˆ๋‹ค. ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ์ œํ•œ๋œ ๋„๋ฉ”์ธ์ด ์žˆ๋Š” ์ •์ˆ˜ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ํŒจ๋‹‰์ธ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ด ๋‘˜๋Ÿฌ์‹ธ์ผ ๋•Œ ์˜ค๋ฒ„ํ”Œ๋กœ ํŒจ๋‹‰์ด ๋ฐœ์ƒํ•˜๋Š” ์ •์ˆ˜ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. A๋ผ๋ฉด ๋ช‡ ๊ฐ€์ง€ ์˜์‹์œผ๋กœ uint%N์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์˜ต์…˜์€ A, B ๋˜๋Š” C ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด์ง€๋งŒ ์ด๊ฒƒ์ด ์˜ค๋Š˜๋‚  const/iota๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ด๋“์ด ์—†์Šต๋‹ˆ๋‹ค.

int%N์ด๋ผ๊ณ  ๋งํ•˜๋Š” ๋ชจ๋“  ์ด์œ ๋Š” int์ธ ์—ด๊ฑฐํ˜•์—๋„ ๋˜‘๊ฐ™์ด ์ ์šฉ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. (ํ•˜์ง€๋งŒ ๊ทธ๋“ค๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ํฌํ•จ๋œ๋‹ค๋ฉด ๋‚˜๋Š” ํ™”๋ฅผ ๋‚ด์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

์ˆœ์ˆ˜ํ•จ์„ ์—†์• ๋ฉด ๊ทธ ์ˆ˜์ˆ˜๊ป˜๋ผ๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์ผ๋ถ€ int-iness๋ฅผ ๋‹ค์‹œ ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ฝ”๋“œ ์ƒ์„ฑ์ด ํ•„์š”ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋„์ž…ํ•  int-iness์˜ ์ •๋„์™€ ์ข…๋ฅ˜๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. no "๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. next" ๋ฉ”์„œ๋“œ, ์ˆœํ™˜์  next ๋ฉ”์„œ๋“œ, ๊ฐ€์žฅ์ž๋ฆฌ์—์„œ ๋–จ์–ด์ง€๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” next ๋ฉ”์„œ๋“œ. (๋˜ํ•œ Monday*Sunday - Thursday ๊ฐ€ ํ•ฉ๋ฒ•ํ™”๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.) ์ถ”๊ฐ€ ๊ฐ•์„ฑ์œผ๋กœ ์ธํ•ด ๋” ๊ฐ€๋‹จ์„ฑ ์žˆ๋Š” ๊ฑด์ถ• ์ž์žฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ํŒ๋ณ„๋œ ๊ณต์šฉ์ฒด๋Š” ๋ฌด์—‡๋ณด๋‹ค๋„ pick { A, B, C struct{} } ์™€ ๊ฐ™์ด int-y๊ฐ€ ์•„๋‹Œ ๋‹ค์–‘์„ฑ์„ ๋ฉ‹์ง€๊ฒŒ ๋ชจ๋ธ๋งํ•ฉ๋‹ˆ๋‹ค.

์ด์™€ ๊ฐ™์€ ์ •๋ณด๋ฅผ ์–ธ์–ด๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์˜ ์ฃผ์š” ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ž˜๋ชป๋œ ๊ฐ’์€ ๋ถˆ๋ฒ•์ž…๋‹ˆ๋‹ค.
  2. ์ •๋ณด๋Š” ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๊ณ  ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐ€์ •์ด๋‚˜ ์ฃผ์„(ํ˜„์žฌ ๋ฐ˜์˜ํ•  ์ˆ˜ ์—†์Œ) ์—†์ด ์ด์— ๋Œ€ํ•ด ์กฐ์น˜๋ฅผ ์ทจํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ด๋™/์œ ํ˜•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ธ์–ด๋กœ ์ด์™€ ๊ฐ™์€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ฃผ์š” ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ๊ฐ’์€ ๋ถˆ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ด๊ฒƒ์„ ์ด์ ์œผ๋กœ ๋ณด๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ๊ฐ•์กฐํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ™•์‹คํžˆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ’์„ ์†Œ๋น„ํ•  ๋•Œ๋Š” ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค์ง€๋งŒ ๊ฐ’์„ ์ƒ์„ฑํ•  ๋•Œ๋Š” ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์–ด๋Š ์ชฝ์ด ๋” ๋ฌด๊ฑฐ์šธ์ง€๋Š” ์ง€๊ธˆ๊นŒ์ง€๋Š” ๊ฐœ์ธ์˜ ์ทจํ–ฅ์— ๋‹ฌ๋ ค ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๊ฒƒ์ด ์ „์ฒด์ ์œผ๋กœ ์ˆœ ์ด์ต์ธ์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ์งˆ๋ฌธ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ถˆ๋ฒ•์ ์ธ ๊ฐ’์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ ํšจ์„ฑ์„ ์Šค์Šค๋กœ ํ™•์ธํ•  ์ˆ˜๋‹จ์ด ์ด๋ฏธ ์žˆ๋Š” ๊ฒฝ์šฐ(์œ„์˜ ์ œ์•ˆ์—์„œ์™€ ๊ฐ™์ด), ๊ทธ ์ œํ•œ์ด ์ฃผ๋Š” ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‚˜์—๊ฒŒ ๊ทธ๊ฒƒ์€ ์ผ์„ ๋ณต์žกํ•˜๊ฒŒ ํ•  ๋ฟ์ž…๋‹ˆ๋‹ค. ๋‚ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์—ด๊ฑฐํ˜•์—๋Š” ์œ ํšจํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ’์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋”ฐ๋ผ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์™„์ „ํžˆ ํ๊ธฐํ•˜๊ฑฐ๋‚˜ ์ผ๋ถ€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜๊ฑฐ๋‚˜ ๊ทธ๋Œ€๋กœ ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž˜๋ชป๋œ ๊ฐ’์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์—„๊ฒฉํ•œ ์—ด๊ฑฐํ˜•์€ ์•ฑ์ด ์™ธ๋ถ€ ์„ธ๊ณ„์™€ ๊ฒฉ๋ฆฌ๋˜์–ด ์žˆ๊ณ  ์ž˜๋ชป๋œ ์ž…๋ ฅ์„ ๋ฐ›์„ ๋ฐฉ๋ฒ•์ด ์—†๋Š” ๋งค์šฐ ์ œํ•œ๋œ ๊ฒฝ์šฐ์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ž์‹ ๋งŒ ๋ณด๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด๋ถ€ ์—ด๊ฑฐํ˜•๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

iota๋ฅผ ์‚ฌ์šฉํ•˜๋Š” const๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์•ˆ์ „ํ•˜์ง€ ์•Š๊ณ  ๊ฒ€์‚ฌ๋Š” ๋Ÿฐํƒ€์ž„์œผ๋กœ ์ง€์—ฐ๋˜๋ฉฐ ์•ˆ์ „ํ•œ ๊ฒ€์‚ฌ๋Š” ์œ ํ˜• ์ˆ˜์ค€์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” iota๊ฐ€ enum์„ ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” enum์ด ๋” ๊ฐ•๋ ฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— enum์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

์ž˜๋ชป๋œ ๊ฐ’์€ ๋ถˆ๋ฒ•์ž…๋‹ˆ๋‹ค.
๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ด๊ฒƒ์„ ์ด์ ์œผ๋กœ ๋ณด๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ๊ฐ•์กฐํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ์ด ๋…ผ๋ฆฌ๊ฐ€ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ ํ˜•์€ ๊ฐ’์˜ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. ๊ฐ’์ด ํ•ด๋‹น ์œ ํ˜•์— ์—†๋Š” ๋ณ€์ˆ˜์—๋Š” ์œ ํ˜•์„ ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ญ”๊ฐ€ ์˜คํ•ดํ•˜๊ณ  ์žˆ๋Š” ๊ฑธ๊นŒ?

์ถ”์‹ : ์—ด๊ฑฐํ˜•์€ ํ•ฉ๊ณ„ ์œ ํ˜•์˜ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์ด๋ฉฐ ๊ทธ ๋ฌธ์ œ๊ฐ€ ์ด ๋ฌธ์ œ๋ณด๋‹ค ์šฐ์„ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•ด์„œ/์ข€ ๋” ์ •ํ™•ํ•˜๊ฒŒ ํ•˜์ž๋ฉด ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์—ด๊ฑฐํ˜•์„ ๋‹ซ๋Š” ๋ฐ ์ด์ ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์—„๊ฒฉํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋ฉด a) "์ž˜๋ชป๋œ ๊ฐ’์€ ๋ถˆ๋ฒ•์ž…๋‹ˆ๋‹ค"๋Š” ๋™์–ด๋ฐ˜๋ณต์ด๊ณ  b) ๋”ฐ๋ผ์„œ ์ด์ ์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. const ๊ธฐ๋ฐ˜ ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด์„์ƒ ์ž˜๋ชป๋œ ๊ฐ’๋„ ๋ถˆ๋ฒ•์ž…๋‹ˆ๋‹ค. ์œ ํ˜•์€ ํ›จ์”ฌ ๋” ๋งŽ์€ ๊ฐ’์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

์—ด๊ฑฐํ˜•์ด int์ด๊ณ  ๋ชจ๋“  int๊ฐ€ ์ ๋ฒ•ํ•œ ๊ฒฝ์šฐ(์œ ํ˜• ์‹œ์Šคํ…œ์˜ ๊ด€์ ์—์„œ) ์œ ์ผํ•œ ์ด์ ์€ ์œ ํ˜•์˜ ๋ช…๋ช…๋œ ๊ฐ’์ด ๋ฐ˜์˜๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹จ์ง€ const/iota์ด์ง€๋งŒ fmt ํŒจํ‚ค์ง€๊ฐ€ ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ŠคํŠธ๋ง๊ฑฐ๋ฅผ ์‹คํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. (์›๋ณธ์— ์žˆ๋Š” ์ด๋ฆ„๊ณผ ๋ฌธ์ž์—ด์„ ๋‹ค๋ฅด๊ฒŒ ํ•˜๋ ค๋ฉด ์—ฌ์ „ํžˆ stringer๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

@jimmyfrasche ๋ฌธ์ž์—ด ํ™”๋Š” ์ข‹์€ ๋ณด๋„ˆ์Šค์ž…๋‹ˆ๋‹ค. ์œ„์˜ ์ œ์•ˆ์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ๋“ฏ์ด ์ €์—๊ฒŒ ์ฃผ์š” ๊ธฐ๋Šฅ์€ ๋Ÿฐํƒ€์ž„์— ์ฃผ์–ด์ง„ ๊ฐ’์ด ์ฃผ์–ด์ง„ ์—ด๊ฑฐํ˜• ์œ ํ˜•์˜ ์œ ํšจํ•œ ๊ฐ’์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฃผ์–ด์ง„

type Foo enum {
    Val1 = 1
    Val2 = 2
}

๊ทธ๋ฆฌ๊ณ  ๋ฐ˜์‚ฌ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

func IsValidEnum(v {}interface) bool

์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

a := Foo.Val1
b := Foo(-1)
reflection.IsValidEnum(a) //returns true
reflection.IsValidEnum(b)  //returns false

์‹ค์ œ ์‚ฌ๋ก€์˜ ๊ฒฝ์šฐ Java๊ฐ€ ์ˆ˜ํ–‰ํ•œ ๊ฒƒ์„ ๋งน๋ชฉ์ ์œผ๋กœ ๋”ฐ๋ฅด๋Š” ๋Œ€์‹  ์ด ์ค‘๊ฐ„ ์ง€์ ์„ ์™„๋ฒฝํ•˜๊ฒŒ ํฌ์ฐฉํ•œ C#์˜ ์—ด๊ฑฐํ˜• ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. C#์—์„œ ์œ ํšจ์„ฑ์„ ํ™•์ธํ•˜๋ ค๋ฉด Enum.IsDefined static method ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@crecker ๊ทธ๊ฒƒ๊ณผ const/iota์˜ ์œ ์ผํ•œ ์ฐจ์ด์ ์€
๋ฐ˜์‚ฌ์— ์ €์žฅ๋œ ์ •๋ณด. ์ „์ฒด์ ์œผ๋กœ ํฐ ์ด๋“์€ ์•„๋‹ˆ๋‹ค
์ƒˆ๋กœ์šด ์œ ํ˜•์˜ ์œ ํ˜•.

์•ฝ๊ฐ„ ๋ฏธ์นœ ์•„์ด๋””์–ด:

๋™์ผํ•œ ํŒจํ‚ค์ง€์— ์„ ์–ธ๋œ ๋ชจ๋“  const์˜ ์ด๋ฆ„๊ณผ ๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ •์˜๋œ ์œ ํ˜•์œผ๋กœ. ๊ทธ๊ฒƒ์€
๊ทธ๋Ÿฌ๋‚˜ ์ข์€ ํด๋ž˜์Šค์˜ const ์‚ฌ์šฉ๋ฒ•์„ ๊ณจ๋ผ๋‚ด๋Š” ๊ฒƒ์€ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ๋‚ด ์ œ์•ˆ์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ๋“ฏ์ด ๋‚˜๋ฅผ ์œ„ํ•œ ์ฃผ์š” ๊ธฐ๋Šฅ

IMO๋Š” ์ด ๋…ผ์˜๋ฅผ ๋Œ๊ณ  ์žˆ๋Š” ์ฃผ์š” ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. "์ฃผ์š” ๊ธฐ๋Šฅ" ์ง‘ํ•ฉ์ด ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ๋ช…ํ™•์„ฑ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค๋งˆ๋‹ค ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ์ƒ๊ฐ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๊ทธ ์„ธํŠธ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฒฝํ—˜ ๋ณด๊ณ ์„œ ์˜ ํ˜•์‹์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๋ชฉ๋ก์— ํ•˜๋‚˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(๊ฐœ์ธ์ ์œผ๋กœ๋Š” "์ž˜๋ชป๋œ ๊ฒƒ" ์„น์…˜์ด ์‹ค์ œ๋กœ ๋ฐœ์ƒํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ž˜๋ชป ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋งŒ ์–ธ๊ธ‰ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์— ์—ฌ์ „ํžˆ ์–ธ๊ธ‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค). ์œ ํ˜• ๊ฒ€์‚ฌ์˜ ๋ถ€์กฑ์œผ๋กœ ์ธํ•ด ์ค‘๋‹จ/๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ์˜ˆ๋ฅผ ๋“ค์–ด ๋Œ€๊ทœ๋ชจ ๋ฆฌํŒฉํ† ๋ง์„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@jimmyfrasche ํ•˜์ง€๋งŒ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๋Š” ๋งŽ์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜• ์‹œ์Šคํ…œ์˜ ๋„์›€ ์—†์ด๋Š” ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋ฉฐ ๋ช‡ ์ค„์˜ ์ฝ”๋“œ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ผ์ข…์˜ ์œ ํ˜• ์ง€์› ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์œ„์— ๋ฌธ์ž์—ดํ™”๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ธฐ๋ณธ ์œ ํ˜• ๊ฐ’์ด ์•„๋‹Œ ์˜ฌ๋ฐ”๋ฅธ ํ˜•์‹์˜ ์ด๋ฆ„์„ ๊ฐ–๊ฒŒ ๋˜๋ฏ€๋กœ ๋กœ๊น…์ด ๋‹จ์ˆœํ™”๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ์—ด๊ฑฐํ˜•์„ ์—„๊ฒฉํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉด ๊ฐ€๋Šฅํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์‹ฌ๊ฐํ•˜๊ฒŒ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด์ œ ํ”„๋กœํ† ์ฝœ์—์„œ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฐ’๋„ ๋ณด์กดํ•˜๋ ค๋ฉด ์—ด๊ฑฐํ˜•์„ ์‚ญ์ œํ•˜๊ณ  ์ผ๋ฐ˜ ๊ฐ’ ์œ ํ˜•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‚˜์ค‘์— ์—ด๊ฑฐํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์ž˜๋ชป๋œ ๊ฐ’์„ ์‚ญ์ œํ•˜๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ์ผ๋ถ€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋Š ์ชฝ์ด๋“ , ๋‹น์‹ ์€ ์˜ค๋ฅ˜๋ฅผ ํ”ผํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋Œ€์‹  ์œ ํ˜• ์‹œ์Šคํ…œ์˜ ์ œํ•œ๊ณผ ์‹ธ์šฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Java ์—ด๊ฑฐํ˜• ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Java์šฉ protobuf๊ฐ€ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์„ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์™€ ๊ด€๋ จํ•˜์—ฌ @Merovius ๋Š” ์ด๋ฏธ ์—ฌ๋Ÿฌ ๋ฒˆ ๋‹ค๋ฃจ์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์—†์ด๋Š” ์ž…๋ ฅ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•ด ์—„์ฒญ๋‚œ ์–‘์˜ ๋ณต์‚ฌ-๋ถ™์—ฌ๋„ฃ๊ธฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋ถ„๋ช…ํ•˜๋ฉฐ ์ œ์•ˆ๋œ ์†”๋ฃจ์…˜์ด ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๋„์šธ ์ˆ˜ ์žˆ๋Š”์ง€๋„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์•Œ๊ณ  ์žˆ๋Š” ๋Œ€๊ทœ๋ชจ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ž‘์—…ํ•˜์ง€ ์•Š์ง€๋งŒ ํ•ด๋‹น ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ฝ”๋“œ์˜ ์˜ค๋ฅ˜๊ฐ€ ๋™์ผํ•œ ์—ด๊ฑฐํ˜• ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์–ธ์–ด๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ์ €๋ฅผ ๋ฌผ์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ์ž˜๋ชป๋œ ๊ฐ’์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์—ด๊ฑฐํ˜•์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์ฐฌ์„ฑํ•˜๋Š” ์–ด๋–ค ์ฃผ์žฅ๋„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(๋ญ”๊ฐ€ ๋†“์นœ ๊ฒฝ์šฐ ์‚ฌ๊ณผ). ์ด๋ก ์ƒ์œผ๋กœ๋Š” ๋ฉ‹์ง€๊ณ  ๊น”๋”ํ•˜์ง€๋งŒ ์‹ค์ œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ๋„์›€์ด ๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์ด ์—ด๊ฑฐํ˜•์—์„œ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์€ ๊ทธ๋ฆฌ ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž์—ดํ™”, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ, ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฐ’ ์ธก๋ฉด์—์„œ ์—„๊ฒฉ/๋Š์Šจํ•จ, ์—ด๊ฑฐ - ๋‚ด๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋‘ (๋ฌผ๋ก  ๋‚˜๋ฅผ ํฌํ•จํ•˜์—ฌ)์ด ์‹œ์ ์—์„œ ๊ทธ๊ฒƒ๋“ค์„ ์„ž์Šต๋‹ˆ๋‹ค. ์—„๊ฒฉํ•จ/๋Š์Šจํ•จ์€ ์ƒ์ถฉ๋˜๋Š” ์„ฑ๊ฒฉ ๋•Œ๋ฌธ์— ์ฃผ์š” ๋…ผ์Ÿ๊ฑฐ๋ฆฌ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ํ•˜๋‚˜ ๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์— ๋™์˜ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ํ•ด๊ฒฐ์ฑ…์€ ๋‘˜ ๋‹ค ์–ด๋–ค ์‹์œผ๋กœ๋“  ํ†ตํ•ฉํ•˜๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์„ ํƒํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ ์„ธ๊ณ„์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๊ฐ€ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

@crecker ์œ„์˜ ๋‚ด๋ณด๋‚ด๊ธฐ ๋ฐ์ดํ„ฐ์— const๋ฅผ ์ €์žฅํ•˜๋ผ๋Š” ๋‚ด ์ œ์•ˆ
์ƒํ™ฉ์€ ๋‹น์‹ ์ด ์š”๊ตฌํ•˜๋Š” ์ข…๋ฅ˜์˜ ๊ฒƒ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค
์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ ๋„์ž… ์—†์ด.

์ด๊ฒƒ์ด ๊ด€์šฉ์  ๋ฐฉ๋ฒ•์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์œผ๋ฉฐ ์–ธ์–ด๋„ ์ฒ˜์Œ์ด์ง€๋งŒ ๋‹ค์Œ์€ ์ž‘๋™ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

type Day struct {
    value string
}

// optional, if you need string representation
func (d Day) String() string { return d.value }

var (
    Monday = Day{"Monday"}
    Tuesday = Day{"Tuesday"}
)

func main() {
    getTask(Monday)
}

func getTask(d Day) string {
    if d == Monday {
        fmt.Println("today is ", d, "!โ€) // today is Monday !
        return "running"
    }

    return "nothing to do"
}

์žฅ์  :

  • type Day func getTask ์— ์ „๋‹ฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    https://play.golang.org/p/4JZOIG5PbRX

  • ๊ฐ’์„ ์žฌ์ •๋ ฌํ•ด๋„ ์ฝ”๋“œ๊ฐ€ ์†์ƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค( ๋Œ€์‹  iota ๊ฐ€ ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค)

  • ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๊ฐ€ ํ•„์š” ์—†์Œ

  • ์ง€๋„์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
    https://play.golang.org/p/KlTNWrJpbDi

  • ๋ฐ˜๋ณต๋  ์ˆ˜ ์žˆ๋‹ค
    https://play.golang.org/p/ld3TNtenEkD

๋‹จ์  :

  • ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ถˆํ‰ํ•˜์ง€ ์•Š๊ณ  ์ต๋ช… ๊ตฌ์กฐ์ฒด๋ฅผ getTask ์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    https://play.golang.org/p/NaV38og7e2h

  • ์ƒ์ˆ˜ ๊ตฌ์กฐ์ฒด๋Š” ์ง€์›๋˜์ง€ ์•Š์œผ๋ฉฐ var ๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค.
    https://play.golang.org/p/X6KSpACA4N0

์—ด๊ฑฐํ˜•์ด ์ •๋ง๋กœ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์„ ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ง‰๋Š” ๊ฒƒ:

NotADay := Day{"NotADay"}
getTask(NotADay)

๊ทธ๋Ÿฌํ•œ ๋ณ€์ˆ˜์˜ ์†Œ๋น„์ž๋Š” ์˜ˆ์ƒ ๊ฐ’์„ ์ ์ ˆํ•˜๊ฒŒ ํ™•์ธํ•˜์—ฌ ์ด๋ฅผ ํฌ์ฐฉํ•  ์ˆ˜๋„ ์žˆ๊ณ  ํฌ์ฐฉํ•˜์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด ํ† ์š”์ผ์ด๋‚˜ ์ผ์š”์ผ์ด ์•„๋‹Œ ๊ฒƒ์€ ํ‰์ผ์ธ ๊ฒƒ์ฒ˜๋Ÿผ switch ๋ฌธ์˜ ๊ฐ€์ •์„ ํ†ตํ•ด ๋‚˜์œ ํ•˜๋ฝ์ด ์—†๋‹ค๊ณ  ๊ฐ€์ •). ๋Ÿฐํƒ€์ž„๊นŒ์ง€. ๋Ÿฐํƒ€์ž„์ด ์•„๋‹Œ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ด๋Ÿฐ ์œ ํ˜•์˜ ์‹ค์ˆ˜๋ฅผ ์žก๋Š” ๊ฒƒ์ด ๋” ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@bpkroth
์ž์ฒด ํŒจํ‚ค์ง€์— Day ์ด ์žˆ๊ณ  ์„ ํƒํ•œ ํ•„๋“œ ๋ฐ ๋ฉ”์„œ๋“œ๋งŒ ๋…ธ์ถœํ•˜๋ฉด package day Day ์œ ํ˜•์˜ ์ƒˆ ๊ฐ’์„ ๋งŒ๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์ต๋ช… ๊ตฌ์กฐ์ฒด๋ฅผ getTask ์— ์ „๋‹ฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

./day/day.go

package day

type Day struct {
    value string
}

func (d Day) String() string { return d.value }

var (
    Monday  = Day{"Monday"}
    Tuesday = Day{"Tuesday"}
    Days    = []Day{Monday, Tuesday}
)

./main.go

package main

import (
    "fmt"
    "github.com/somePath/day"
)

func main() {
    january := day.Day{"january"} // implicit assignment of unexported field 'value' in day.Day literal

    var march struct {
        value string
    }
    march.value = "march"
    getTask(march) // cannot use march (type struct { value string }) as type day.Day in argument to getTask

    getTask(day.Monday)
}

func getTask(d day.Day) string {
    if d == day.Monday {
        fmt.Println("today is ", d, "!") // today is Monday !
        return "running"
    }

    return "nothing to do"
}

func iterateDays() {
    for _, d := range day.Days {
        fmt.Println(d)
    }
}

์—ด๊ฑฐํ˜•, ์‚ผํ•ญ ์—ฐ์‚ฐ์ž, ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ์ปดํŒŒ์ผ, ํ•ฉ๊ณ„ ์œ ํ˜•, ์ œ๋„ค๋ฆญ, ๊ธฐ๋ณธ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋“ฑ๊ณผ ๊ฐ™์€ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ณ  ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์„ ๊ฒƒ์„ ์ฃผ์žฅํ•˜๋Š” ๋‹ค๋ฅธ ์–ธ์–ด๋Š” ํ‰์ƒ ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

Golang์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ฉ์ฒญํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•œ ์‚ฌํšŒ์  ์‹คํ—˜์ž…๋‹ˆ๊นŒ?

@gh67uyyghj ๋ˆ„๊ตฐ๊ฐ€ ๊ท€ํ•˜์˜ ๋Œ“๊ธ€์„ ์ฃผ์ œ๊ฐ€ ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค! ๋ˆ„๊ตฐ๊ฐ€ ๋‚ด ๋Œ€๋‹ต์— ๋˜‘๊ฐ™์ด ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ท€ํ•˜์˜ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋Œ€๋‹ต์€ YES๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. GoLang์—์„œ ๊ธฐ๋Šฅ์ด ์—†๋‹ค๋Š” ๊ฒƒ์€ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฏ€๋กœ GoLang์— ์—†๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์€ ์‹ค์ œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—๋Š” ์—†๋Š” GoLang์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค!!

@L-oris ์ด๊ฒƒ์€ ์—ด๊ฑฐํ˜•์„ ์œ ํ˜•์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋งค์šฐ ํฅ๋ฏธ๋กœ์šด ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด์ƒ‰ํ•˜๊ฒŒ ๋Š๊ปด์ง€๋ฉฐ enum ํ‚ค์›Œ๋“œ(ํ•„์—ฐ์ ์œผ๋กœ ์–ธ์–ด๋ฅผ ์ข€ ๋” ๋ณต์žกํ•˜๊ฒŒ ํ•จ)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ์„ ๋” ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์“ฐ๋‹ค
  • ์ฝ๋‹ค
  • ์ด์œ 

๊ท€ํ•˜์˜ ์˜ˆ์—์„œ (์˜ค๋Š˜๋‚  ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ›Œ๋ฅญํ•จ) ์—ด๊ฑฐ ํ˜• (์–ด๋–ค ํ˜•ํƒœ๋กœ๋“ )์„ ๊ฐ–๋Š” ๊ฒƒ์€ ๋‹ค์Œ์ด ํ•„์š”ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  • ๊ตฌ์กฐ์ฒด ์œ ํ˜• ๋งŒ๋“ค๊ธฐ
  • ๋ฉ”์†Œ๋“œ ์ƒ์„ฑ
  • ๋ณ€์ˆ˜ ์ƒ์„ฑ(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ž๋Š” ํ•ด๋‹น ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์ง€๋งŒ ์ƒ์ˆ˜๋Š” ์ œ์™ธ)

์ด๊ฒƒ์€ ์ฝ๊ณ , ์“ฐ๊ณ , ์ถ”๋ก ํ•˜๋Š” ๋ฐ ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค(ํ›จ์”ฌ ๋” ๊ธธ์ง€๋Š” ์•Š์ง€๋งŒ).

๋”ฐ๋ผ์„œ ๊ตฌ๋ฌธ ์ œ์•ˆ์€ ์–ธ์–ด์— ๋‹จ์ˆœ์„ฑ๊ณผ ๋ถ€๊ฐ€ ๊ฐ€์น˜ ์ธก๋ฉด์—์„œ ์˜ฌ๋ฐ”๋ฅธ ๋ฉ”๋ชจ๋ฅผ ์ œ๊ณตํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@andradei ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค
์˜ˆ, ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ์–ธ์–ด์˜ ๋ชฉํ‘œ๋Š” ์ž‘๊ณ  ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ˆ˜์—…์„ ๋†“์น˜๊ณ  ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ Java๋กœ ์ด๋™ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. :)

์ฐจ๋ผ๋ฆฌ Go 2 ์ œ์•ˆ, ๋” ๋‚˜์€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์— ์ง‘์ค‘ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด ์—ด๊ฑฐ ํ˜•๋ณด๋‹ค ๋” ๋งŽ์€ ๊ฐ€์น˜๋ฅผ ์ œ๊ณต ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์š”์ ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ:

  • ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ ์ƒ์šฉ๊ตฌ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์ตœ์•…์˜ ๊ฒฝ์šฐ ์ƒ์„ฑ๊ธฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?)
  • ์ƒˆ ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ "๋‹จ์ˆœ์„ฑ"์„ ๋‹ฌ์„ฑํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด ํ‚ค์›Œ๋“œ๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ „์ฒด ํŠน์ • ๋™์ž‘ ์„ธํŠธ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
  • ๋ฐฉ๋ฒ•์„ ์กฐ๊ธˆ ์ฐฝ์˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ์—ด๊ฑฐํ˜•์— ํฅ๋ฏธ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ์ต์ˆ™ํ•ด์ง€๋Š” ๊ฒƒ์ด ๋” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์œ„์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋ณ€์ˆ˜์— ์ ‘๋‘์‚ฌ๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
package day

// Day Enum
type Day struct {
    value string
}

@L-oris ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. Go 2์˜ ์ œ์•ˆ๋„ ๊ธฐ๋Œ€๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ œ๋„ค๋ฆญ์ด ์—ด๊ฑฐํ˜•๋ณด๋‹ค ์–ธ์–ด์˜ ๋ณต์žก์„ฑ์„ ๋” ์ฆ๊ฐ€์‹œํ‚ฌ ๊ฒƒ์ด๋ผ๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ท€ํ•˜์˜ ์š”์ ์„ ๊ณ ์ˆ˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

  • ์‹ค์ œ๋กœ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ ์ƒ์šฉ๊ตฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ์—ด๊ฑฐํ˜•์˜ ๊ฐœ๋…์ด ์–ผ๋งˆ๋‚˜ ์ž˜ ์•Œ๋ ค์ง„ ๊ฒƒ์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํ•˜์ง€๋งŒ ์ฆ๋ช…ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค). ์–ธ์–ด์˜ ๋ณต์žก์„ฑ์€ ๊ทธ ์ด์ ์— ๋Œ€ํ•ด ์ง€๋ถˆํ•˜๊ธฐ์— ์ข‹์€ "๊ฐ€๊ฒฉ"์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด ์—ด๊ฑฐํ˜•์ด ์—†๋‹ค๋Š” ๊ฒƒ์€ Generetad protobuf ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•  ๋•Œ๋‚˜ ์—ด๊ฑฐํ˜•์„ ๋ชจ๋ฐฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ์„ ๋งŒ๋“ค๋ ค๊ณ  ํ•  ๋•Œ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
  • ๊ทธ๊ฒƒ๋„ ์‚ฌ์‹ค์ด๋‹ค.

๋‚˜๋Š” ์ด ์ œ์•ˆ์— ๋Œ€ํ•ด ๋งŽ์€ ์ƒ๊ฐ์„ ํ–ˆ๊ณ , ๋‹จ์ˆœํ•จ์ด ์ƒ์‚ฐ์„ฑ์— ํฐ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ถ„๋ช…ํžˆ ํ•„์š”ํ•œ ๋ณ€๊ฒฝ์ด ์—†๋Š” ํ•œ ์œ ์ง€ํ•˜๋ ค๋Š” ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜•์€ ๋˜ํ•œ ์–ธ์–ด๋ฅผ ๋„ˆ๋ฌด ๊ธ‰๊ฒฉํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜์—ฌ ๋” ์ด์ƒ Go๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด์— ๋Œ€ํ•œ ์žฅ๋‹จ์ ์„ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์ฝ”๋“œ๊ฐ€ ์—ฌ์ „ํžˆ ์ฝ๊ธฐ ์‰ฌ์šด ๋‹น์‹ ๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์ด ์ ์–ด๋„ ํ˜„์žฌ๋กœ์„œ๋Š” ์ข‹์€ ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„, ๋ฏธ๋ž˜์— ์ด ๊ธฐ๋Šฅ์„ ์ •๋ง ์›ํ•ฉ๋‹ˆ๋‹ค!. _์š”์ฆ˜_์—์„œ ํฌ์ธํ„ฐ ์™€ " ์—ด๊ฑฐํ˜• "์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ž˜ ์–ด์šธ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ: https://play.golang.org/p/A7rjgAMjfCx

enum์— ๋Œ€ํ•œ ์ œ ์ œ์•ˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ์ƒˆ๋กœ์šด ์œ ํ˜•์œผ๋กœ ๊ฐ„์ฃผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ž„์˜์˜ ๊ตฌ์กฐ์™€ ๋‹ค์Œ ๊ตฌํ˜„์œผ๋กœ ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

package application

type Status struct {
Name string
isFinal bool
}

enum Status {
     Started = &Status{"Started",false}
     Stopped = &Status{"Stopped",true}
     Canceled = &Status{"Canceled",true}
}

// application.Status.Start - to use

์ด ๊ตฌ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋งˆ์ƒฌ๋งํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€, ์–ด๋–ป๊ฒŒ ๋ฌธ์ž์—ด๋กœ ๋ณ€๊ฒฝํ•˜๋Š”์ง€ ๋“ฑ์€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฌผ๋ก  "๋‹ค์Œ" ๊ธฐ๋Šฅ์„ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ›Œ๋ฅญํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด Go๋Š” ๋จผ์ € ๊นŠ์€ ๋ถˆ๋ณ€ ๊ตฌ์กฐ์ฒด๋ฅผ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ถˆ๋ณ€ ์œ ํ˜•์ด ์—†์œผ๋ฉด ์—ด๊ฑฐํ˜•์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋™์ผํ•œ ๊ฒƒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type Status enum {
  Started
  Stopped
}

func isFinal(s Status) bool {
  exhaustive switch(s) {
    case Started: return false;
    case Stopped: return true;
  }
}

๋” ์‹ฌํ”Œํ•ด ๋ณด์—ฌ์•ผ ํ•  ๊ฒƒ ๊ฐ™์•„์š”

func isFinal(s Status) bool {
  return s == Status.Stopped
}

Go2์— ๋Œ€ํ•œ ์ œ์•ˆ

๋…ผ๋ฆฌ์ ์œผ๋กœ ์—ด๊ฑฐํ˜•์€ ์œ ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด์ „ ์—ด๊ฑฐํ˜•์€ ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์—ฐ๊ฒฐ๋œ ๋ช…์‹œ์ ์œผ๋กœ ๋ช…๋ช…๋œ ์ƒ์ˆ˜์ž…๋‹ˆ๋‹ค.

enum Status uint8 {
  Started  // Status.Started == 0
  Stopped // Status.Stopped == 1, etc, like we have used iota
}
// or 
enum Status string  {
  Started // Status.Started == "Started", like it works with JSON
  Stopped // Status.Stopped == "Stopped", etc
}
// unless you wanna define its values explicitly
enum Status {
  Started "started"  // compiler can infer underlying type
  Stopped "finished"
}
// and enums are type extensions and should be used like this
type MyStatus Status

MyStatus validatedStatus // holds a nil until initialized

// for status value validation we can use map pattern
if validatedStatus, ok := MyStatus[s]; ok {
  // this value is a valid status
  // and we can use it later as regular read-only string
  // or like this
  if validatedStatus == MyStatus.Started {
     fmt.Printf("Hey, my status is %s", validatedStatus)
  }
}

์—ด๊ฑฐํ˜•์€ "์ƒ์ˆ˜ ์ปจํ…Œ์ด๋„ˆ"์ธ ์œ ํ˜• ํ™•์žฅ์ž…๋‹ˆ๋‹ค.

์œ ํ˜• ์• ํ˜ธ๊ฐ€๋ฅผ ์œ„ํ•ด

์œ ํ˜•์œผ๋กœ ๋ณด๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•œ ๊ตฌ๋ฌธ ๋Œ€์•ˆ

type Status uint8 enum {
  Started  // Status.Started == 0
  Stopped // Status.Stopped == 1, etc, like we have used iota
}

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ๋ช…์‹œ์ ์ธ ์ตœ์ƒ์œ„ ์„ ์–ธ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

type Status enum {
  Started  // Status.Started == 0
  Stopped // Status.Stopped == 1, etc, like we have used iota
}

์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์˜ˆ๋Š” ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ฒฝ์šฐ์—

type Status1 uint8 enum {
  Started  // Status1.Started == 0
  Stopped // Status1.Stopped == 1, etc, like we have used iota
}

type Status2 uint8 enum {
  Started  // Status1.Started == 0
  Stopped // Status1.Stopped == 1, etc, like we have used iota
}

Status1.Started == Status2.Started๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?
๋งˆ์ƒฌ๋ง์— ๋Œ€ํ•ด?

ํฌ์ง€์…˜์„ ๋ฐ”๊พธ๋ฉด?

type Status uint8 enum {
  Started  // Status.Started == 0
  InProcess
  Stopped // Status.Stopped == 1, etc, like we have used iota
}

๋‚˜๋Š” ๋ถˆ๋ณ€ ์œ ํ˜•์— ๋Œ€ํ•ด @Goodwine ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ƒฌ๋ง์€ ํฅ๋ฏธ๋กœ์šด ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๋ชจ๋‘ ๊ธฐ๋ณธ ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ์ง€์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ Status1.Started ๋Š” Status2.Started ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ์ƒ์ง•์  ํ•ด์„์„ ํ•œ๋‹ค๋ฉด ๊ทธ๊ฒƒ๋“ค์€ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๊ฐ„์ฃผ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฌด์–ธ๊ฐ€๋ฅผ ์‚ฝ์ž…ํ•˜๋ฉด ๊ฐ’์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค( iota ์™€ ๋™์ผํ•œ ๋ฐฉ์‹).
์ด๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์„ ์–ธ๊ณผ ํ•จ๊ป˜ ๊ฐ’์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

type Status uint8 enum {
  Started  0
  InProcess 2
  Stopped 1
}

์ด๊ฒƒ์€ ๋ถ„๋ช…ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๋ ค๋ฉด ์—ด๊ฑฐํ˜• ๊ฐ’์˜ ์–ดํœ˜ ํ•ด์„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ์ถœ๋ ฅ์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜• ์บ์ŠคํŒ…์ด ์ •์˜๋˜์ง€ ์•Š๋Š” ํ•œ ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ๊ธฐํ˜ธ ์ด๋ฆ„(๋ฌธ์ž์—ด)์„ ๊ณ ์ˆ˜ํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์„ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

Rust๊ฐ€ Enum์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์ด ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค.

์œ ํ˜•์ด ์ง€์ •๋˜์ง€ ์•Š์€ ๊ธฐ๋ณธ๊ฐ’

enum IpAddr {
    V4,
    V6,
}

์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜•

enum IpAddr {
    V4(string),
    V6(string),
}

home := IpAddr.V4("127.0.0.1");
loopback := IpAddr.V6("::1");

๋ณตํ•ฉ ์œ ํ˜•

enum Message {
    Quit,
    Move { x: int32, y: int32 },
    Write(String),
    ChangeColor(int32, int32, int32),
}

C#์—์„œ์™€ ๊ฐ™์ด ์ •์ˆ˜ ํ˜•์‹์œผ๋กœ ์ €์žฅ๋˜๋Š” ๊ฐ„๋‹จํ•œ ์—ด๊ฑฐํ˜•์ด ์žˆ์–ด๋„ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์œ„์˜ ๋‚ด์šฉ์€ enum ๋ฅผ ๋„˜์–ด _discriminated unions_ ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ _pattern matching_์—์„œ ๋” ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” switch ์— ๋Œ€ํ•œ ์•ฝ๊ฐ„์˜ ํ™•์žฅ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

switch something.(type) {
case Quit:
        ...
case ChangeColor; r, g, b := something:
        ...
case Write: // Here `something` is known to be a string
        ...
// Ideally Go would warn here about the missing case for "Move"
}

์–ธ๊ธ‰ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์œ„ํ—˜ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์—ด๊ฑฐ ํ˜•์— ๋Œ€ํ•œ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ๋ฒˆ ํ•„์š”ํ•œ ๊ฒƒ์€ ์ฃผ์–ด์ง„ ์œ ํ˜•์˜ ๋ชจ๋“  ์ƒ์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฒ€์ฆ์„ ์œ„ํ•ด (์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ์ˆ˜๋ฝํ•˜๊ฑฐ๋‚˜ ๋‹จ์ˆœํžˆ ์•Œ ์ˆ˜์—†๋Š” ์˜ต์…˜์„ ๋ฌด์‹œํ•˜๋ ค๋Š” ๊ฒƒ์ด ๋งค์šฐ ํ™•์‹คํ•œ ๊ฒฝ์šฐ)

    • ๋˜๋Š” ๊ฐ€๋Šฅํ•œ ์ƒ์ˆ˜ ๋ชฉ๋ก(๋“œ๋กญ๋‹ค์šด์„ ์ƒ๊ฐํ•ด ๋ณด์„ธ์š”).

iota๋กœ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ชฉ๋ก์˜ ๋์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฝ”๋“œ ๋‚ด๋ถ€ ์ด์™ธ์˜ ๋‹ค๋ฅธ ์šฉ๋„๋กœ iota๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž˜๋ชป๋œ ์ค„์— ์ƒ์ˆ˜๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ๋‚ด์šฉ์ด ์ค‘๋‹จ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋‹นํžˆ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒƒ๋“ค๋ณด๋‹ค ์ฐพ๊ธฐ๊ฐ€ ํ›จ์”ฌ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค). ๋˜ํ•œ ์ƒ์ˆ˜๊ฐ€ ์ˆซ์ž์ผ ๋•Œ ์‹ค์ œ๋กœ ๋ฌด์—‡์„ ๋‚˜ํƒ€๋‚ด๋Š”์ง€์— ๋Œ€ํ•œ ์„ค๋ช…์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์š”์ ์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

๋ฉ‹์ง„ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์€ ์ด๋ฆ„์„ stringify๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์„ ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ง‰๋Š” ๊ฒƒ:

NotADay := Day{"NotADay"}
getTask(NotADay)

๊ทธ๋Ÿฌํ•œ ๋ณ€์ˆ˜์˜ ์†Œ๋น„์ž๋Š” ์˜ˆ์ƒ ๊ฐ’์„ ์ ์ ˆํ•˜๊ฒŒ ํ™•์ธํ•˜์—ฌ ์ด๋ฅผ ํฌ์ฐฉํ•  ์ˆ˜๋„ ์žˆ๊ณ  ํฌ์ฐฉํ•˜์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด ํ† ์š”์ผ์ด๋‚˜ ์ผ์š”์ผ์ด ์•„๋‹Œ ๊ฒƒ์€ ํ‰์ผ์ธ ๊ฒƒ์ฒ˜๋Ÿผ switch ๋ฌธ์˜ ๊ฐ€์ •์„ ํ†ตํ•ด ๋‚˜์œ ํ•˜๋ฝ์ด ์—†๋‹ค๊ณ  ๊ฐ€์ •). ๋Ÿฐํƒ€์ž„๊นŒ์ง€. ๋Ÿฐํƒ€์ž„์ด ์•„๋‹Œ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ด๋Ÿฐ ์œ ํ˜•์˜ ์‹ค์ˆ˜๋ฅผ ์žก๋Š” ๊ฒƒ์ด ๋” ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@L-oris ๊ทธ๋ž˜์„œ ์ด๊ฒƒ์— ๋Œ€ํ•ด:

package main
import "yet/it/is/not/a/good/practice/in/Go/enum/example/day"

func main()
{
  // var foo day.Day
  foo := day.Day{}
  bar(foo)
}

func bar(day day.Day)
{
  // xxxxxxxxxx
}

์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ [return "nothing to do"]์— ์˜ํ•œ ๋Ÿฐํƒ€์ž„ ์นจ๋ฌต ๋ฐ ์ด์ƒํ•œ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ ์ปดํŒŒ์ผ ํƒ€์ž„/์ฝ”๋”ฉ ํƒ€์ž„ ERROR REPORTING !
์ดํ•ดํ•˜๋‹ค?

  1. enum ๋Š” ์‹ค์ œ๋กœ ์ƒˆ๋กœ์šด ์œ ํ˜•์ž…๋‹ˆ๋‹ค. type State string ๊ฐ€ ํ•˜๋Š” ์ผ์ด๋ฏ€๋กœ ๊ด€์šฉ์ ์œผ๋กœ ์ƒˆ ํ‚ค์›Œ๋“œ๋ฅผ ๋„์ž…ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Go๋Š” ์†Œ์Šค ์ฝ”๋“œ์˜ ๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ€๋…์„ฑ, ๋ชฉ์ ์˜ ๋ช…ํ™•์„ฑ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  2. ์œ ํ˜• ์•ˆ์ „์„ฑ ๋ถ€์กฑ, ์‹ค์ œ ๋ฌธ์ž์—ด/int์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด string - ๋˜๋Š” int ๊ธฐ๋ฐ˜ ์œ ํ˜•์„ ํ˜ผ๋™ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ ์žฅ์• ๋ฌผ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์—ด๊ฑฐํ˜• ์ ˆ์€ const ๋กœ ์„ ์–ธ๋˜์–ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๋ ค์ง„ ๊ฐ’ ์ง‘ํ•ฉ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  3. Stringer ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ชจ๋“  ์œ ํ˜•์„ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํ…์ŠคํŠธ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ๊ด€์šฉ๊ตฌ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ์—†์ด type ContextKey string ์—ด๊ฑฐํ˜•์€ ์ด๊ฒƒ์ด ๋ฌธ์ž์—ด ๊ฐ’์ด๊ณ  iota -generated ์—ด๊ฑฐํ˜•์˜ ๊ฒฝ์šฐ JavaScript์˜ XHR ReadyState ์ฝ”๋“œ (0 - ๋ฏธ์ „์†ก, 4 - ์™„๋ฃŒ)์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ •์ˆ˜์ž…๋‹ˆ๋‹ค.

    ์˜คํžˆ๋ ค ๋ฌธ์ œ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ func (k ContextKey) String() string ๊ตฌํ˜„์˜ ์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์•Œ๋ ค์ง„ ๋ชจ๋“  ์—ด๊ฑฐํ˜• ์ ˆ ์ƒ์ˆ˜๋ฅผ ํฌํ•จํ•ด์•ผ ํ•˜๋Š” ์Šค์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

  4. Swift์™€ ๊ฐ™์€ ์–ธ์–ด์—๋Š” _exhaustive switch_๋ผ๋Š” ๊ฐœ๋…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ const ์ง‘ํ•ฉ์— ๋Œ€ํ•œ ์œ ํ˜• ๊ฒ€์‚ฌ์™€ ํ•ด๋‹น ๊ฒ€์‚ฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ด€์šฉ์  ๋ฐฉ๋ฒ•์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ๋ชจ๋‘ ์ข‹์€ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ•„์š”ํ•œ String() ํ•จ์ˆ˜๋Š” ๊ตฌํ˜„ํ•˜๊ธฐ์— ์ข‹์€ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

์ œ์•ˆ

package main

import (
    "context"
    "strconv"
    "fmt"
    "os"
)

// State is an enum of known system states.
type DeepThoughtState int

// One of known system states.
const (
    Unknown DeepThoughtState = iota
    Init
    Working
    Paused
    ShutDown
)

// String returns a human-readable description of the State.
//
// It switches over const State values and if called on
// variable of type State it will fall through to a default
// system representation of State as a string (string of integer
// will be just digits).
func (s DeepThoughtState) String() string {
    // NEW: Switch only over const values for State
    switch s.(const) {
    case Unknown:
        return fmt.Printf("%d - the state of the system is not yet known", Unknown)
    case Init:
        return fmt.Printf("%d - the system is initializing", Init)
    } // ERR: const switch must be exhaustive; add all cases or `default` clause

    // ERR: no return at the end of the function (switch is not exhaustive)
}

// RegisterState allows changing the state
func RegisterState(ctx context.Context, state string) (interface{}, error) {
    next, err := strconv.ParseInt(state, 10, 32)
    if err != nil {
        return nil, err
    }
    nextState := DeepThoughtState(next)

    fmt.Printf("RegisterState=%s\n", nextState) // naive logging

        // NEW: Check dynamically if variable is a known constant
    if st, ok := nextState.(const); ok {
        // TODO: Persist new state
        return st, nil
    } else {
        return nil, fmt.Errorf("unknown state %d, new state must be one of known integers", nextState)
    }
}

func main() {
    _, err := RegisterState(context.Background(), "42")
    if err != nil {
        fmt.Println("error", err)
        os.Exit(1)
    }
    os.Exit(0)
    return
}

PS Swift ์—ด๊ฑฐํ˜•์˜ ๊ด€๋ จ ๊ฐ’์€ ์ œ๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ํŠน์ˆ˜ ํšจ๊ณผ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. Go์—์„œ๋Š” ๊ทธ๋“ค์„ ์œ„ํ•œ ์ž๋ฆฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜• ๋ฐ์ดํ„ฐ ์˜†์— ๊ฐ’์„ ๊ฐ–๊ณ  ์‹ถ๋‹ค๋ฉด โ€” ๋‘ ๊ฐœ๋ฅผ ๊ฐ์‹ธ๋Š” ๊ฐ•๋ ฅํ•œ ํ˜•์‹์˜ struct ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋ช‡ ๋‹ฌ ์ „์— ๋‚˜๋Š” ์—ด๊ฑฐ๋œ ์œ ํ˜•์ด ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฆฐํ„ฐ์— ๋Œ€ํ•œ ๊ฐœ๋… ์ฆ๋ช…์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/loov/enumcheck

ํ˜„์žฌ ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ญ๋ชฉ์„ ์—ด๊ฑฐํ˜•์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

type Letter byte // enumcheck

const (
    Alpha Letter = iota
    Beta
    Gamma
)

func Switch(x Letter) {
    switch x { // error: "missing cases Beta and Gamma"
    case Alpha:
        fmt.Println("alpha")
    case 4: // error: "implicit conversion of 4 to Letter"
        fmt.Println("beta")
    default: // error: "Letter shouldn't have a default case"
        fmt.Println("default")
    }
}

๋ชจ๋“  ์•”์‹œ์  ๋ณ€ํ™˜์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋‚ด๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ์ง€๋งŒ ๊ธฐ๋ณธ์ ์ธ ๊ฒฝ์šฐ์—๋Š” ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ, ํ˜„์žฌ๋Š” ์•„์ง ์ž‘์—… ์ค‘์ด๋ฏ€๋กœ ์ƒํ™ฉ์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ์„ ๋Œ€์‹  ์œ ํ˜•์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ์Šคํ… ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ฃผ์„์€ ํ˜„์žฌ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ Go1์˜ ์—ด๊ฑฐํ˜• ๊ตฌํ˜„์€ ๋‚ด๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ๋ชจ๋“  ์–ธ์–ด์—์„œ ๊ฐ€์žฅ ์ด์ƒํ•˜๊ณ  ๊ฐ€์žฅ ๋ถˆ๋ถ„๋ช…ํ•œ ์—ด๊ฑฐํ˜• ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค. C์กฐ์ฐจ๋„ ๊ทธ๊ฒƒ๋“ค์„ ๋” ๋ฉ‹์ง€๊ฒŒ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. iota ๋ฌผ๊ฑด์€ ํ•ดํ‚น์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋Œ€์ฒด iota๋Š” ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ๊ทธ ํ‚ค์›Œ๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์™ธ์›Œ์•ผ ํ• ๊นŒ์š”? Go๋Š” ๋ฐฐ์šฐ๊ธฐ ์‰ฌ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๊ธฐ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

@pofl :
Go ์—ด๊ฑฐํ˜•์ด ๊ฝค ์–ด์ƒ‰ํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ iota ๋Š” ์‹ค์ œ๋กœ๋Š” ์ผ๋ฐ˜์ ์ธ ์˜์–ด ๋‹จ์–ด์ž…๋‹ˆ๋‹ค.

์ด์˜คํƒ€
_๋ช…์‚ฌ_

  1. ์•„์ฃผ ์†Œ๋Ÿ‰; ์กฐ๊ธˆ; ์„ฑ๋ น ๊ฐ•๋ฆผ ๋Œ€์ถ•์ผ.
  2. ๊ทธ๋ฆฌ์Šค ์•ŒํŒŒ๋ฒณ์˜ ์•„ํ™‰ ๋ฒˆ์งธ ๊ธ€์ž(I, ฮน).
  3. ์ด ๋ฌธ์ž๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ๋ชจ์Œ ์†Œ๋ฆฌ.

์•„๋งˆ๋„ ๊ทธ๋“ค์€ ์–ธ์–ด์˜ ์‚ฌ์šฉ ์ธก๋ฉด์—์„œ ์ •์˜ 1๋กœ ๊ฐ€๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์žˆ๋Š” ์ด์ „ ์˜๊ฒฌ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์œผ๋กœ:
Go์—์„œ๋„ ์ฐจ๋ณ„๋œ ๊ณต์šฉ์ฒด๋ฅผ ์ •๋ง ์›ํ•˜์ง€๋งŒ ์‹ค์ œ ์—ด๊ฑฐํ˜•๊ณผ ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ œ๋„ค๋ฆญ์ด ์ง„ํ–‰๋˜๊ณ  ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์œ ํ˜• ๋ชฉ๋ก์„ ํ†ตํ•ด ์‹๋ณ„๋œ ๊ณต์šฉ์ฒด์™€ ๋งค์šฐ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์‹ค์ œ๋กœ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. #41716์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

Go์—์„œ iota ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ APL์—์„œ์˜ ์‚ฌ์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ธ์šฉ https://en.wikipedia.org/wiki/Iota :

์ผ๋ถ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด(์˜ˆ: A+, APL, C++[6], Go[7])์—์„œ iota(์†Œ๋ฌธ์ž ๊ธฐํ˜ธ โณ ๋˜๋Š” ์‹๋ณ„์ž iota๋กœ)๋Š” ์—ฐ์† ์ •์ˆ˜ ๋ฐฐ์—ด์„ ๋‚˜ํƒ€๋‚ด๊ณ  ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, APL โณ4์—์„œ๋Š” 1 2 3 4๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰