func main() {
poet1 := "죽는 날까지 하늘을 우러러\n한 점 부끄럼이 없기를,\n잎새에 이는 바람에도\n나는 괴로워했다."
poet2 := `죽는 날까지 하늘을 우러러
한 점 부끄럼이 없기를,
잎새에 이는 바람에도
나는 괴로워했다.`
fmt.Println(poet1)
fmt.Println(poet2)
}
문자열 사용 법
~
: 실제로 개행하여 입력하면 됨문자를 하나씩 순회하며 출력하기
len(str) -> 바이트 길이를 반환함
따라서 len("Hello 월드")는 8이 아니라, 12가 된다.
그래서 len을 활용하여 for문을 통해 순회하면 안된다! (3byte짜리 한글 문자가 분리됨)
func main() {
str := "Hello 월드"
arr := []rune(str)
for i := 0; i < len(arr); i++ {
fmt.Printf("타입:%T 값:%d 문자값:%c\n", arr[i], arr[i], arr[i])
}
}
/*
타입:int32 값:72 문자값:H
타입:int32 값:101 문자값:e
타입:int32 값:108 문자값:l
타입:int32 값:108 문자값:l
타입:int32 값:111 문자값:o
타입:int32 값:32 문자값:
타입:int32 값:50900 문자값:월
타입:int32 값:46300 문자값:드
*/
arr := [8]rune(str)
)func main() {
str := "Hello 월드"
for _, v := range.str {
fmt.Printf("타입:%T 값:%d 문자값:%c\n", v, v, v)
}
}
//결과는 위와 동일
go에서 대입연산자는 우변의 메모리공간을 그 크기만큼 그대로 좌변의 공간에 복사한다고 했다.
but 문자열의 경우에는?
문자열은 메모리 공간 자체가 아닌, 메모리 공간의 시작주소를 가지고 있는 포인터의 개념이다.
따라서 실제 데이터(문자열)의 길이와 무관하게, 8byte로 고정되어있어서 대입연산이 가능하다
불변 : immutable
-> 문자열의 일부만 수정할 수 없다!
var str string = "Hello World"
str = "How are you?" //전체 변경 가능
str[2] = 'a' //이렇게 일부만을 바꿀 수는 없다 -> 에러 발생