PHpullh
학습 라이브러리/Go/문자열 & rune & strings 패키지

GO · 기초 문법

문자열 & rune & strings 패키지

Go 문자열은 바이트 슬라이스입니다. 한글 처리 시 rune 변환이 필요합니다.

기초 문법중급stringrunebytestringsBuilder

핵심 설명

Go 문자열은 바이트 슬라이스입니다. 한글 처리 시 rune 변환이 필요합니다.

Go code

package main

import (
	"fmt"
	"strings"
	"unicode/utf8"
)

func main() {
	s := "Hello, 세계"

	// 바이트 vs rune
	fmt.Println("바이트 길이:", len(s))               // 13
	fmt.Println("문자(rune) 수:", utf8.RuneCountInString(s)) // 9

	// 바이트 순회 (한글 깨짐)
	for i, b := range []byte(s) {
		if i < 7 { fmt.Printf("%d:%c ", i, b) }
	}
	fmt.Println()

	// rune 순회 (올바른 한글 처리)
	for i, r := range s {
		fmt.Printf("%d:%c ", i, r)
	}
	fmt.Println()

	// rune 슬라이싱
	runes := []rune(s)
	fmt.Println("첫 5자:", string(runes[:5]))  // Hello

	// strings 패키지
	fmt.Println(strings.ToUpper("hello"))        // HELLO
	fmt.Println(strings.Contains(s, "세계"))     // true
	fmt.Println(strings.HasPrefix(s, "Hello"))   // true
	fmt.Println(strings.Replace(s, "Hello", "Hi", 1))
	fmt.Println(strings.Split("a,b,c", ","))     // [a b c]
	fmt.Println(strings.Join([]string{"x","y"}, "-")) // x-y
	fmt.Println(strings.TrimSpace("  hello  "))  // hello
	fmt.Println(strings.Count(s, "l"))            // 2

	// strings.Builder — 효율적 문자열 조합
	var b strings.Builder
	for i := 0; i < 5; i++ {
		fmt.Fprintf(&b, "item%d ", i)
	}
	fmt.Println(b.String())
}

학습 팁

strings.Builder는 문자열을 반복적으로 연결할 때 매우 효율적입니다. + 연산자로 루프에서 문자열을 합치면 O(n²) 성능이 됩니다.

주의할 점

s[i]로 한글 문자열을 인덱싱하면 바이트를 반환합니다. 한글 문자 하나는 3바이트이므로 깨진 문자가 됩니다. []rune(s)[i]를 사용하세요.

자주 묻는 질문

문자열 & rune & strings 패키지란 무엇인가요?

Go 문자열은 바이트 슬라이스입니다. 한글 처리 시 rune 변환이 필요합니다.

문자열 & rune & strings 패키지 학습 시 주의할 점은 무엇인가요?

s[i] 로 한글 문자열을 인덱싱하면 바이트를 반환합니다. 한글 문자 하나는 3바이트이므로 깨진 문자가 됩니다. []rune(s)[i] 를 사용하세요.