제어문 — if/for는 비슷한데 while이 없다
Ruby의 each/map/select가 그리워지는 for 루프의 세계
Ruby에서 배열을 돌릴 때 [1,2,3].each { |n| puts n } 이렇게 쓴다. 블록을 넘기는 패턴이 몸에 배어 있다.
Go에서는 for _, n := range []int{1,2,3} { fmt.Println(n) } 이렇게 쓴다. 블록도 없고, 이터레이터도 없다. for 루프가 전부다.
while이 없다
Ruby의 while condition do ... end에 해당하는 Go 코드는 for condition { ... }이다. 키워드가 for인데 while처럼 동작한다. Go는 반복문을 for 하나로 통일했다.
무한 루프도 for { ... } — Ruby의 loop do ... end에 해당.
.map, .select가 없다
Ruby에서 numbers.map { |n| n * 2 } 한 줄이면 되는 걸 Go에서는 이렇게 쓴다:
result := make([]int, len(numbers))
for i, n := range numbers {
result[i] = n * 2
}
3줄이 1줄 대신이다. Go 커뮤니티는 이걸 "명시적이다"라고 부른다. Ruby 개발자는 "장황하다"라고 부른다. 둘 다 맞다.
if에 괄호가 없다
Ruby도 if 조건에 괄호 안 쓴다. Go도 안 쓴다. 이건 비슷하다. 다만 Go의 if는 짧은 선언문을 포함할 수 있다: if err := doSomething(); err != nil { ... } — 이건 Ruby에 없는 패턴이다.
switch가 강력하다
Ruby의 case/when은 패턴 매칭이 가능하다. Go의 switch도 비슷한데, fallthrough가 기본 비활성이다(C와 반대). 타입 switch도 있다 — switch v := x.(type) { case int: ... } 이건 Ruby의 case x when Integer 패턴과 비슷하다.
Ruby에서 Go로
Ruby: while/until/loop → Go: for 하나로 전부 (while 없음)
Ruby: .each { |x| } 블록 패턴 → Go: for _, x := range 패턴
Ruby: .map/.select 메서드 체이닝 → Go: for 루프 직접 작성 (내장 함수 없음)
Ruby: case/when → Go: switch (fallthrough 기본 비활성, 타입 switch 지원)
장점
- ✓ for 하나로 통일 — 배울 게 적다. while, until, loop 같은 변형이 없다
- ✓ if에 짧은 선언문 포함 가능 — err 처리가 스코프 안에서 깔끔하게 끝남
단점
- ✗ .map/.select/.reduce가 없어서 컬렉션 처리 코드가 3~5배 길어진다
- ✗ Ruby의 블록/Proc/Lambda 같은 일급 함수 패턴이 없어 표현력이 떨어진다