์Šค๋งˆํŠธ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ Go ๋””์ž์ธ์ด ๋‚˜์œ ์ด์œ 

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

์•ฝํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•ด ์„ค๊ณ„ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

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

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

๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ๊ทธ๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์กŒ๋Š”๊ฐ€? ๋‹ค์Œ์€ ๋ช‡ ๊ฐ€์ง€ ์ธ์šฉ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋กญ ํŒŒ์ดํฌ (๋Œ€๋žต.: Go ์–ธ์–ด์˜ ๊ณต๋™ ์ฐฝ์‹œ์ž ์ค‘ ํ•œ ๋ช…):

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

๋ฌด์—‡? ๊ทธ๋ž˜์„œ Rob Pike๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Google ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ทธ๋‹ค์ง€ ์ข‹์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋ณด๋“ค์„ ์œ„ํ•œ ์–ธ์–ด๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(๋Œ€๋žต.: dumbed down) ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ž์‹ ์˜ ๋™๋ฃŒ๋ฅผ ์–ด๋–ค ์˜ค๋งŒํ•œ ํ‘œ์ •์œผ๋กœ ๋ฐ”๋ผ๋ณด๋‚˜์š”? ์ €๋Š” ํ•ญ์ƒ Google ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง€๊ตฌ์ƒ์—์„œ ๊ฐ€์žฅ ๋›ฐ์–ด๋‚˜๊ณ  ๋›ฐ์–ด๋‚œ ์‚ฌ๋žŒ๋“ค ์ค‘์—์„œ ์ง์ ‘ ์„ ๋ฐœ๋˜์—ˆ๋‹ค๊ณ  ๋ฏฟ์–ด์™”์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ๊ทธ๋“ค์€ ๋” ์–ด๋ ค์šด ์ผ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

๊ณผ๋„ํ•œ ๋‹จ์ˆœ์„ฑ์˜ ์ธ๊ณต๋ฌผ

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

ํ‘œํ˜„๋ ฅ์ด ๋ณ„๋กœ ์ข‹์ง€ ์•Š์Œ

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

์˜ˆ๋ฅผ ๋“ค์–ด ๋ช…๋ น์ค„ ์ธ์ˆ˜์—์„œ stdin ๋˜๋Š” ํŒŒ์ผ์„ ์ฝ๋Š” ์ฝ˜์†” ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

package main

import (
    "bufio"
    "flag"
    "fmt"
    "log"
    "os"
)

func main() {

    flag.Parse()
    flags := flag.Args()

    var text string
    var scanner *bufio.Scanner
    var err error

    if len(flags) > 0 {

        file, err := os.Open(flags[0])

        if err != nil {
            log.Fatal(err)
        }

        scanner = bufio.NewScanner(file)

    } else {
        scanner = bufio.NewScanner(os.Stdin)
    }

    for scanner.Scan() {
        text += scanner.Text()
    }

    err = scanner.Err()
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(text)
}

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

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์€ ๋™์ผํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ž…๋‹ˆ๋‹ค. D:

import std.stdio, std.array, std.conv;

void main(string[] args)
{
    try
    {
        auto source = args.length > 1 ? File(args[1], "r") : stdin;
        auto text   = source.byLine.join.to!(string);

        writeln(text);
    }
    catch (Exception ex)
    {
        writeln(ex.msg);
    }
}

์ด์ œ ๋ˆ„๊ฐ€ ๋” ์ฝ๊ธฐ ์‰ฌ์›Œ์กŒ๋‚˜์š”? ๋‚˜๋Š” D์—๊ฒŒ ํˆฌํ‘œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ์˜ ์ฝ”๋“œ๋Š” ๊ทธ๊ฐ€ ์ž‘์—…์„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ๋” ์ฝ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. D๋Š” ํ›จ์”ฌ ๋” ๋ณต์žกํ•œ ๊ฐœ๋…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(๋Œ€๋žต.: ๋Œ€์ฒด ํ•จ์ˆ˜ ํ˜ธ์ถœ ะธ ํ…œํ”Œ๋ฆฟ) Go ์˜ˆ์ œ์—์„œ๋ณด๋‹ค ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋ณต์žกํ•œ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋ณต์‚ฌ์˜ ์ง€์˜ฅ

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

package main

import "fmt"

func int64Sum(list []int64) (uint64) {
    var result int64 = 0
    for x := 0; x < len(list); x++ {
        result += list[x]
    }
    return uint64(result)
}

func int32Sum(list []int32) (uint64) {
    var result int32 = 0
    for x := 0; x < len(list); x++ {
        result += list[x]
    }
    return uint64(result)
}

func int16Sum(list []int16) (uint64) {
    var result int16 = 0
    for x := 0; x < len(list); x++ {
        result += list[x]
    }
    return uint64(result)
}

func int8Sum(list []int8) (uint64) {
    var result int8 = 0
    for x := 0; x < len(list); x++ {
        result += list[x]
    }
    return uint64(result)
}

func main() {

    list8  := []int8 {1, 2, 3, 4, 5}
    list16 := []int16{1, 2, 3, 4, 5}
    list32 := []int32{1, 2, 3, 4, 5}
    list64 := []int64{1, 2, 3, 4, 5}

    fmt.Println(int8Sum(list8))
    fmt.Println(int16Sum(list16))
    fmt.Println(int32Sum(list32))
    fmt.Println(int64Sum(list64))
}

๊ทธ๋ฆฌ๊ณ  ์ด ์˜ˆ๋Š” ์„œ๋ช…๋œ ์œ ํ˜•์—๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์›์น™์„ ์™„์ „ํžˆ ์œ„๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค(DRY)๋Š” ๊ฐ€์žฅ ์œ ๋ช…ํ•˜๊ณ  ๋ถ„๋ช…ํ•œ ์›์น™ ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ ๋งŽ์€ ์˜ค๋ฅ˜์˜ ์›์ธ์„ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. Go๋Š” ์™œ ์ด๋Ÿฐ ์ผ์„ ํ•˜๋Š”๊ฐ€? ์ด๊ฒƒ์€ ์–ธ์–ด์˜ ๋”์ฐํ•œ ์ธก๋ฉด์ž…๋‹ˆ๋‹ค.

D์— ๋Œ€ํ•œ ๋™์ผํ•œ ์˜ˆ:

import std.stdio;
import std.algorithm;

void main(string[] args)
{
    [1, 2, 3, 4, 5].reduce!((a, b) => a + b).writeln;
}

๋‹จ์ˆœํ•˜๊ณ  ์šฐ์•„ํ•˜๋ฉฐ ์š”์ ์ด ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜๋Š” reduce ํ…œํ”Œ๋ฆฟ ์œ ํ˜• ๋ฐ ์กฐ๊ฑด์ž์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ, ์ด๊ฒƒ์€ Go ๋ฒ„์ „๋ณด๋‹ค ๋” ๋ณต์žกํ•˜์ง€๋งŒ ๋˜‘๋˜‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ดํ•ดํ•˜๊ธฐ ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์˜ˆ๊ฐ€ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ณ  ์ฝ๊ธฐ ๋” ์‰ฝ์Šต๋‹ˆ๊นŒ?

๋‹จ์ˆœํ˜• ์‹œ์Šคํ…œ ๋ฐ”์ดํŒจ์Šค

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

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋ฆฌ์„์€ ์–ธ์–ด ์ˆ˜์ •์˜ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

package main

import "fmt"
import "reflect"

func Reduce(in interface{}, memo interface{}, fn func(interface{}, interface{}) interface{}) interface{} {
    val := reflect.ValueOf(in)

    for i := 0; i < val.Len(); i++ {
        memo = fn(val.Index(i).Interface(), memo)
    }

    return memo
}

func main() {

    list := []int{1, 2, 3, 4, 5}

    result := Reduce(list, 0, func(val interface{}, memo interface{}) interface{} {
        return memo.(int) + val.(int)
    })

    fmt.Println(result)
}

์ด ๊ตฌํ˜„ Reduce ๊ธฐ์‚ฌ์—์„œ ๋นŒ๋ ค์™”์Šต๋‹ˆ๋‹ค Go์˜ ๊ด€์šฉ์  ์ œ๋„ค๋ฆญ (๋Œ€๋žต.: ๋ฒˆ์—ญ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋„์›€์„ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.) ๊ธ€์Ž„, ๊ทธ๊ฒƒ์ด ๊ด€์šฉ์ ์ด๋ผ๋ฉด ๊ด€์šฉ์ ์ด์ง€ ์•Š์€ ์˜ˆ๋ฅผ ๋ณด๋Š” ๊ฒƒ์ด ์‹ซ์Šต๋‹ˆ๋‹ค. ์šฉ๋ฒ• interface{} - ํฌ๊ทน์ด๋ฉฐ ์–ธ์–ด์—์„œ๋Š” ํƒ€์ดํ•‘์„ ์šฐํšŒํ•˜๋Š” ๋ฐ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋นˆ ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฉฐ ๋ชจ๋“  ์œ ํ˜•์ด ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋ฏ€๋กœ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ์™„์ „ํ•œ ์ž์œ ๊ฐ€ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ์€ ์ •๋ง ์ถ”์•…ํ•˜์ง€๋งŒ ๊ทธ๊ฒŒ ๋‹ค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ๊ณก์˜ˆ์ ์ธ ์—…์ ์„ ์œ„ํ•ด์„œ๋Š” ๋Ÿฐํƒ€์ž„ ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Rob Pike์กฐ์ฐจ๋„ ๊ทธ์˜ ๋ณด๊ณ ์„œ ์ค‘ ํ•˜๋‚˜์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด๋ฅผ ๋‚จ์šฉํ•˜๋Š” ๊ฐœ์ธ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋Š” ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๋Ÿฐ ๋ง๋„ ์•ˆ๋˜๋Š” ์†Œ๋ฆฌ ๋Œ€์‹  D ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ฐ€ ๊ทธ๋Ÿฐ ๋ง์„ ํ•  ์ˆ˜ ์žˆ๊ฒ ์–ด? interface{} ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ  ์‹ฌ์ง€์–ด ์œ ํ˜•์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๊นŒ?

์ข…์†์„ฑ ๊ด€๋ฆฌ์˜ ๋ฌธ์ œ์ 

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

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

์‹œ์ง„ํ•‘์˜ ๋ฌธํ™”์ˆ˜ํ•˜๋ฌผ

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

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

์ž์‹ ์˜ ์ด์ต์„ ์œ„ํ•œ ๋‹จ์ˆœ์„ฑ

Go๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ ๊ทธ ๋ชฉํ‘œ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๋‹ฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์˜ค๋ž˜๋œ ์–ธ์–ด๋ฅผ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์•ฝํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•ด ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ๋„๊ตฌ๊ฐ€ ํ•จ๊ป˜ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ฝ๊ธฐ ์‰ฝ๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

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

๊ฐ์‚ฌ ๋ฉ”๋ฅด์‹ ๋ฐœ๋“œ ํŽธ์ง‘์„ ์œ„ํ•ด

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€