์ง๋ ๋ช ๋ฌ ๋์ ์ ๋ ๊ตฌํ์ ์ํด Go๋ฅผ ์ฌ์ฉํด ์์ต๋๋ค.
์ฝํ ํ๋ก๊ทธ๋๋จธ๋ฅผ ์ํด ์ค๊ณ ๋์์ต๋๊น?
Go๋ ๋ฐฐ์ฐ๊ธฐ๊ฐ ๋งค์ฐ ์ฌ์ฐ๋ฏ๋ก ์๊ฐํ๋ ๋ฐ ์ด๋ ๋ ์ ๋
์ด ๊ฑธ๋ ธ๊ณ ๊ทธ ํ์๋ ์ด๋ฏธ ์์ฐ์ ์ผ๋ก ์ฝ๋ฉํ ์ ์์์ต๋๋ค. ๋ด๊ฐ ๋ฐ๋์ ๋ฐฐ์ฐ๋ ์ฑ
์
Google์ 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์ ๊ฐ์๋ ์ฅํฉํจ์ด ๋ฐฉํด๊ฐ ๋๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ฐ๋จํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉด ๋ง์ ์์ ์ฝ๋๊ฐ ์์ฑ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด ๋ค์์ ๋์ผํ ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ
์
๋๋ค.
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๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํ ๋์ค์ ์ธ ์ ์์ ์ผ๋ฐ์ฑ์ ๋๋ค. ์ด๋ ์ต์ํ ๋ชจ๋ ๋ฐ์ดํฐ ์ ํ์ ์ง์ํ๊ธฐ ์ํด ๋ถํ์ํ ์ฝ๋ ๋ณต์ฌ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ ์ ๋ชฉ๋ก์ ํฉ์ฐํ๋ ํจ์๋ ๊ฐ ์ ์ ์ ํ์ ๋ํ ๊ธฐ๋ณธ ํจ์๋ฅผ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ๋ ๊ฒ ์ธ์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
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))
}
๊ทธ๋ฆฌ๊ณ ์ด ์๋ ์๋ช
๋ ์ ํ์๋ ์๋ํ์ง ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ฐ๋ณตํ์ง ์๋๋ค๋ ์์น์ ์์ ํ ์๋ฐํฉ๋๋ค(
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
๊ธฐ์ฌ์์ ๋น๋ ค์์ต๋๋ค interface{}
- ํฌ๊ทน์ด๋ฉฐ ์ธ์ด์์๋ ํ์ดํ์ ์ฐํํ๋ ๋ฐ๋ง ํ์ํฉ๋๋ค. ์ด๋ ๋น ์ธํฐํ์ด์ค์ด๋ฉฐ ๋ชจ๋ ์ ํ์ด ์ด๋ฅผ ๊ตฌํํ๋ฏ๋ก ๋ชจ๋ ์ฌ๋์๊ฒ ์์ ํ ์์ ๊ฐ ํ์ฉ๋ฉ๋๋ค. ์ด๋ฐ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ์ ์ ๋ง ์ถ์
ํ์ง๋ง ๊ทธ๊ฒ ๋ค๊ฐ ์๋๋๋ค. ์ด์ ๊ฐ์ ๊ณก์์ ์ธ ์
์ ์ ์ํด์๋ ๋ฐํ์ ๋ฆฌํ๋ ์
์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. Rob Pike์กฐ์ฐจ๋ ๊ทธ์ ๋ณด๊ณ ์ ์ค ํ๋์์ ์ธ๊ธํ๋ฏ์ด ์ด๋ฅผ ๋จ์ฉํ๋ ๊ฐ์ธ์ ์ข์ํ์ง ์์ต๋๋ค.
์ด๋ ์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ํผํด์ผ ํฉ๋๋ค.
๋๋ ์ด๋ฐ ๋ง๋ ์๋๋ ์๋ฆฌ ๋์ D ํ
ํ๋ฆฟ์ ์ฌ์ฉํ๊ฒ ์ต๋๋ค. ๋๊ฐ ๊ทธ๋ฐ ๋ง์ ํ ์ ์๊ฒ ์ด? interface{}
๋ ์ฝ๊ธฐ ์ฝ๊ณ ์ฌ์ง์ด ์ ํ์ด ์์ ํฉ๋๊น?
์ข ์์ฑ ๊ด๋ฆฌ์ ๋ฌธ์ ์
Go์๋ ์ธ๊ธฐ ์๋ ํธ์คํ
์ ๊ณต์
์ฒด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋ ์ข
์์ฑ ์์คํ
์ด ๋ด์ฅ๋์ด ์์ต๋๋ค.
์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ
์ ๋ํด ์ง๋ฌธํ ํ Go ๊ฐ๋ฐํ์
์์งํ์ ๋ฌธํ์ํ๋ฌผ
์ ์๊ฐ์๋ Go๋ ํ์ C๋ฅผ ์ฌ์ฉํด ์จ ์ฌ๋๋ค๊ณผ ์๋ก์ด ๊ฒ์ ์๋ํ๊ณ ์ถ์ง ์์ ์ฌ๋๋ค์ด ๊ฐ๋ฐํ ๊ฒ ๊ฐ์ต๋๋ค. ์ธ์ด๋ ์ถ๊ฐ ํ ์ด ์๋ C๋ก ์ค๋ช
๋ ์ ์์ต๋๋ค(์๋ณธ.:
๋ ๋ค๋ฅธ ์๊ฑฑ๊ฑฐ๋ฆฌ๋ ๋ฌธ์ ๋ Go๊ฐ ์ ์ฐจ์ ์ธ์ด(C์ ์กฐ์ฉํ ๊ณตํฌ์ ๊ฐ์)๋ผ๋ ๊ฒ์ ๋๋ค. ๊ฒฐ๊ตญ ๊ตฌ์์ด๊ณ ์๋์ ๋ค๋จ์ด์ง ๋๋์ด ๋๋ ์ ์ฐจ์ ์คํ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋ฉ๋๋ค. ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ด ๋ง๋ณํต์น์ฝ์ ์๋๋ผ๋ ๊ฑด ์์ง๋ง ์ธ๋ถ์ฌํญ์ ์ ํ์ผ๋ก ์ถ์ํํ๊ณ ์บก์ํ๋ฅผ ์ ๊ณตํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
์์ ์ ์ด์ต์ ์ํ ๋จ์์ฑ
Go๋ ๋จ์ํ๊ฒ ์ค๊ณ๋์์ผ๋ฉฐ ๊ทธ ๋ชฉํ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๋ฌ์ฑํ์ต๋๋ค. ์ด๋ ์ค๋๋ ์ธ์ด๋ฅผ ํ ํ๋ฆฟ์ผ๋ก ์ฌ์ฉํ์ฌ ์ฝํ ํ๋ก๊ทธ๋๋จธ๋ฅผ ์ํด ์์ฑ๋์์ต๋๋ค. ๊ฐ๋จํ ์์ ์ ์ํํ ์ ์๋ ๊ฐ๋จํ ๋๊ตฌ๊ฐ ํจ๊ป ์ ๊ณต๋ฉ๋๋ค. ์ฝ๊ธฐ ์ฝ๊ณ ์ฌ์ฉํ๊ธฐ ์ฝ์ต๋๋ค.
์ด๋ ๋งค์ฐ ์ฅํฉํ๊ณ ์ธ์์ ์ด์ง ์์ผ๋ฉฐ ๋๋ํ ํ๋ก๊ทธ๋๋จธ์๊ฒ๋ ์ข์ง ์์ต๋๋ค.
๊ฐ์ฌ
์ถ์ฒ : habr.com