///

Go Map and String Essentials Capsule

Go 에서 map 존재 체크는 val, ok := m[k] 두 값 반환 이디엄. 문자열 대량 조합은 strings.Builder (Go 1.10+) 로 O(n) 달성 — + 연산자 반복은 O(n²).

///

kind: capsule status: active visibility: private license: CC-BY-SA-4.0 summary: Go 두 가지 일상 이디엄 — map key 존재 체크 (comma-ok: val, ok := m[k]) + 효율적 문자열 조합 (strings.Builder, Go 1.10+). tags: - go - golang - map - strings - capsule


Go Map and String Essentials Capsule

Summary#

Go 에서 map 존재 체크는 val, ok := m[k] 두 값 반환 이디엄. 문자열 대량 조합은 strings.Builder (Go 1.10+) 로 O(n) 달성 — + 연산자 반복은 O(n²).

Claim#

1. Map key 존재 체크#

val, ok := myMap["foo"]
if ok {
    // 키 존재 — val 는 값
}
  • val = 키에 해당하는 값 또는 zero value (int → 0, string → "", struct → {}, pointer → nil)
  • ok = bool, 키 존재 여부
  • 단일 값 반환 (val := myMap["foo"]) 은 존재/0값 구분 불가

One-liner (흔한 패턴)#

if val, ok := myMap["foo"]; ok {
    // val, ok 의 스코프는 if 블록 내부로 제한됨
    doSomething(val)
}

Go if 문의 "initialization statement" 기능. 세미콜론으로 조건과 분리.

존재만 체크 (값 불필요)#

if _, ok := myMap["foo"]; ok { … }

2. 문자열 효율적 조합 — strings.Builder#

import "strings"

var b strings.Builder
for i := 0; i < 1000; i++ {
    b.WriteString("x")
}
result := b.String()
  • 내부적으로 []byte 버퍼 + grow 전략
  • O(n) — 반복할수록 차이 극명
  • b.Grow(n) 으로 최종 크기 사전 할당 시 더 빠름

❌ 비효율 (O(n²))#

s := ""
for i := 0; i < 1000; i++ {
    s += "x"   // 매번 새 문자열 할당 + 복사
}

Go 1.10 이전 (bytes.Buffer)#

import "bytes"
var buffer bytes.Buffer
buffer.WriteString("hello")
buffer.WriteString(" world")
result := buffer.String()

strings.Builderbytes.Buffer 와 유사하지만 문자열 전용으로 더 가벼움 (중간 복사 없음).

3. 짧은 조합은 그냥 +#

hello := "Hello, " + name + "!"
  • n < 10 정도면 + 가 가독성·성능 모두 적절
  • strings.Builder 는 수백~수천 회 루프에서 효과

4. 기타 대안#

  • fmt.Sprintf — 포맷팅 필요 시 (성능 < Builder)
  • strings.Join(slices, sep) — 이미 슬라이스 있을 때 최적

Scope#

  • strings.Builder: Go 1.10+ (2018).
  • comma-ok map: Go 초기부터. channel recv v, ok := <-ch 에도 동일 이디엄 적용.

Caveats#

  • strings.Builder복사 금지 — pointer 나 in-place 만. 복사하면 panic.
  • Zero value 와 "키 없음" 이 구분 불가 할 때 반드시 comma-ok.
  • map 은 concurrent write 안전하지 않음 — 여러 goroutine 접근이면 sync.Map 또는 sync.Mutex.

Source#

Supplementary: - marketer — Efficient string concatenation in Go (동일 저자)

Sagwan Revalidation 2026-04-18T21:50:03Z#

  • verdict: ok
  • note: Go 1.10+ strings.Builder 권장, comma-ok 이디엄, O(n²) vs O(n) 설명 모두 현행 Go practice(최신 Go 1.22+)에서도 유효하며 오류 없음.