내가 처음에 이 부분을 봤을 때 진짜 코드가 도는 게 머리에서 그려지지가 않아서, 아마 이 부분부터 공부를 소홀히하기 시작했던 거 같다.
한 달 정도, 예전만큼 고랭을 보지 않는 도중 포인터를 사용하는 다른 언어를 많이 봤는데(C, C#) 그러다가 오늘 이 부분을 다시 보니 허무할 정도로 '문자열' 파트는 기초적인 내용을 다루고 있었다.
이 챕터에서 하고자 하는 이야기
:= 문자열 데이터를 표현하는 타입인 string을 알아보자.
지금부터 진짜 간단하게 핵심만 정리하겠다.
문자열이란? => '문자 집합'.
고랭은 UTF-8을 표준 문자코드로 사용한다. 영문자, 숫자, 일부 특수 문자는 1바이트고, 나머지는 2~3바이트다.
'문자 하나'를 표현할 때는 rune 타입을 사용한다.
문자열 크기를 알아낼 때는 len()을 사용한다.
'문자열 크기'랑 '글자 수'는 다르다.
'가나다라마'는 문자열 크기가 15고(한 글자 당 3바이트 할당), 글자 수는 5다.
따라서 글자 수를 알아낼 땐 문자열을 []rune타입으로 변환한 뒤 len()을 써야 한다.
string 타입은 []byte 타입으로 변환할 수도 있다.
이렇게 하면 파일을 쓰거나 네트워크로 데이터를 전송하는 경우, 문자열을 보다 쉽게 전송할 수 있다.
문자열 순회는 '인덱스'를 사용 || []rune 타입으로 변환 후 || range를 사용해 할 수 있는데
range를 사용해야 메모리를 낭비하지 않는다.
문자열 합치기, 비교하기, 대소 비교하기는 다른 언어와 큰 차이가 없다.
고랭에서 string은 reflect 패키지 안의 StringHeader 구조체를 통해 구현되어 있다. 내부적으로는 Data, Len으로 구성되는데 uintprt 타입의 Data는 일종의 포인터로 문자열 객체를 가리키고 Len은 int 타입으로 문자열의 길이를 나타낸다.
string 변수에 string 변수를 대입하면 객체가 새로 생성되거나 하는 거 없이 대입하는 변수의 Data, Len이 대입되는 변수의 Data, Len을 '복사'된다.
str1 := str2 해도 둘이 바라보는 객체(문자열)는 하나다.
문자열은 불변이다. 문자열 속의 한 글자를 바꾸거나 하는 거 할 수 없다. 안의 내용을 바꾸고 싶으면 []byte 같은 슬라이스로 타입 변환 해야 한다.
문자열을 합산(+=)하면 할 때마다 새로운 객체가 생성된다. 문자열이 불변이기 때문이다. 불변 원칙이 없으면 예를 들어 문자열 중 일부가 바뀌었을 때 그것이 어디서부터 시작된 건지 추적하기 어렵기 때문에 안정성을 위해 이런 원칙이 도입되었다.
이게 끝입니다. ^^
책에서는 위 내용을 풀어서 풀어서 친절하게 설명합니다.
Tucker의 Go 언어 프로그래밍 - 문자열편 끝!