Go언어 입문 #7

학미새🐥·2022년 3월 18일
0
post-custom-banner

문자열

func main() {
	poet1 := "죽는 날까지 하늘을 우러러\n한 점 부끄럼이 없기를,\n잎새에 이는 바람에도\n나는 괴로워했다."
	poet2 := `죽는 날까지 하늘을 우러러
한 점 부끄럼이 없기를,
잎새에 이는 바람에도
나는 괴로워했다.`

	fmt.Println(poet1)
	fmt.Println(poet2)
}

문자열 사용 법

  • " ~ " : 개행 시 개행문자(\n)사용해야함
  • ~ : 실제로 개행하여 입력하면 됨
    참고로, back quote 안에서 개행문자 작성 시 그대로 출력됨

문자열 순회

문자를 하나씩 순회하며 출력하기

  • 영어 문자 : 1byte
  • 한글 문자 : 3byte

    len(str) -> 바이트 길이를 반환함

따라서 len("Hello 월드")는 8이 아니라, 12가 된다.
그래서 len을 활용하여 for문을 통해 순회하면 안된다! (3byte짜리 한글 문자가 분리됨)

[]rune 으로 타입 변환하고 순회

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 문자값:드
*/
  • rune : int32의 별칭 타입
  • []rune : 한 칸당 4byte짜리 동적배열
    💡주의 ! 정적배열로 선언 불가! (ex- arr := [8]rune(str) )
  • 문자열 -> []rune으로 타입 변환 : 4byte한칸 당 한 글자가 담기는 배열

range로 순회

func main() {
	str := "Hello 월드"

	for _, v := range.str {
		fmt.Printf("타입:%T 값:%d 문자값:%c\n", v, v, v)
	}
}

//결과는 위와 동일
  • range : for문에서 쓸 수 있음
  • range 배열or문자열 : 첫번째로 index, 두번째로 값을 뱉음

문자열 구조

go에서 대입연산자는 우변의 메모리공간을 그 크기만큼 그대로 좌변의 공간에 복사한다고 했다.
but 문자열의 경우에는?

문자열은 메모리 공간 자체가 아닌, 메모리 공간의 시작주소를 가지고 있는 포인터의 개념이다.
따라서 실제 데이터(문자열)의 길이와 무관하게, 8byte로 고정되어있어서 대입연산이 가능하다

문자열은 불변이다

불변 : immutable
-> 문자열의 일부만 수정할 수 없다!

var str string = "Hello World"
str = "How are you?"  //전체 변경 가능
str[2] = 'a' //이렇게 일부만을 바꿀 수는 없다 -> 에러 발생
  • 문자열 합산 시 새로운 문자열이 생성된다.
    예를들어 기존의 str1에 str2를 붙여서 str1에 담아도,
    기존의 str1공간을 이어서 사용하지 않고 새로운 공간에 담긴다.
profile
뭐든 다해보려는 공대생입니다
post-custom-banner

0개의 댓글