이번 편의 목표: 한글 제목의 바이트 수와 글자 수를 구분하고, 첫 단어만 꺼냅니다.

string의 len은 바이트 수입니다. 한글 한 글자는 UTF-8에서 3바이트이므로 글자 수와 다릅니다. 글자 수는 unicode/utf8의 RuneCountInString으로 셉니다. range는 바이트 위치와 rune을 줍니다.

이 편부터는 main.go만 바꿉니다. 11편의 book 패키지를 import하지 않으면 실행에 포함되지 않습니다.

Go
package main

import (
	"fmt"
	"unicode/utf8"
)

func firstWord(title string) string {
	for index, ch := range title {
		if ch == ' ' {
			return title[:index]
		}
	}
	return title
}

func main() {
	title := "생각 나무"
	fmt.Println(len(title))
	fmt.Println(utf8.RuneCountInString(title))
	fmt.Println(firstWord(title))
}

생각과 나무, 그리고 가운데 공백은 3바이트짜리 글자 넷과 1바이트 공백입니다. 첫 줄은 13, 둘째 줄은 5, 셋째 줄은 생각입니다. range의 index는 바이트 위치이므로 그 위치에서 자르면 글자 중간을 가르지 않습니다.

문자열은 한 번 만들면 글자를 갈아 끼우지 않습니다. 일부를 쓸 때는 잘라서 새 문자열로 받습니다.

직접 해 보기

제목을 나무 생각으로 바꿨을 때 마지막 줄이 나무인지 확인하세요.

해설

첫 공백 앞이 나무이므로 firstWord의 결과는 나무입니다. 바이트 길이는 13이고 글자 수는 5입니다.