🔀

제어문 — 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로

1

Ruby: while/until/loop → Go: for 하나로 전부 (while 없음)

2

Ruby: .each { |x| } 블록 패턴 → Go: for _, x := range 패턴

3

Ruby: .map/.select 메서드 체이닝 → Go: for 루프 직접 작성 (내장 함수 없음)

4

Ruby: case/when → Go: switch (fallthrough 기본 비활성, 타입 switch 지원)

장점

  • for 하나로 통일 — 배울 게 적다. while, until, loop 같은 변형이 없다
  • if에 짧은 선언문 포함 가능 — err 처리가 스코프 안에서 깔끔하게 끝남

단점

  • .map/.select/.reduce가 없어서 컬렉션 처리 코드가 3~5배 길어진다
  • Ruby의 블록/Proc/Lambda 같은 일급 함수 패턴이 없어 표현력이 떨어진다

사용 사례

Ruby의 Enumerable 메서드 체이닝 습관을 Go 스타일로 전환해야 할 때 for range + if 조합으로 Ruby의 .select.map 패턴을 구현해야 할 때

참고 자료