Go의 문자열

문자열 유형



Go에서 문자열 값은 바이트 시퀀스입니다. 문자열 값은 비어 있을 수 있으며 바이트 수는 문자열의 길이라고 하며 결코 음수가 아닙니다. 문자열은 변경할 수 없습니다. 한 번 생성되면 문자열의 내용을 변경할 수 없습니다.

미리 선언된 문자열 유형은 string 입니다. 정의된 유형입니다.

일반적으로 문자열의 길이s는 내장 함수len를 사용하여 찾을 수 있습니다. 이 함수는 문자 수가 아니라 문자열의 바이트 수를 반환합니다. Go의 문자열은 유니코드 인코딩을 지원하기 때문에 이것은 구별이 중요합니다. 따라서 UTF-8 문자열의 문자는 1바이트 이상일 수 있습니다. 예를 들어, 이것은 Go에서 유효한 문자열입니다. 여기에 있는 일부 문자는 유효한 UTF-8도 아닙니다.

const sample = "\xbd\xb2\x3d\xbc\x20\xe2\x8c\x98"


이 문자열을 stdout으로 인쇄하면 다음 출력이 생성됩니다.

��=� ⌘


문자열의 길이



이전 섹션에서 논의한 것처럼 내장 함수len는 문자열의 바이트 수를 반환합니다. 예를 들어 샘플 문자열이 Well done 👍🏼 이면 len18 를 반환합니다.

s := "Well done 👍🏼"
fmt.Printf("len(s) = %d\n", len(s))


출력은 다음과 같습니다.

len(s) = 18


이제 바이트 수 대신 문자열의 문자 수를 알고 싶다면 다른 함수를 사용해야 합니다. RuneCountInString의 표준 utf8 기능이 유용할 수 있습니다. 여기에서 시도해 보겠습니다.

s := "Well done 👍🏼"
fmt.Printf("# of characters in s = %d\n", utf8.RuneCountInString(s))


출력은 다음과 같습니다.

# of characters in s = 12


여기에서 이 함수는 출력으로 12를 반환했지만 문자열 11에는 s 문자만 있습니다. 이는 함수RuneCountInString가 문자열의 룬 수를 반환하기 때문입니다. 문자열의 각 유니코드 코드 포인트는 룬 문자로 표시됩니다. 여기에 룬 문자가 무엇인지 봅시다.

s := "Well done 👍🏼"
for _, i := range []rune(s) {
    fmt.Printf("%v ", i)
}


출력은 다음과 같습니다.

87 101 108 108 32 100 111 110 101 32 128077 127996


예상대로 문자열s에 12개의 룬 문자가 있습니다. 각 영어 알파벳은 각각의 ASCII 값과 동일한 단일 룬 리터럴이지만 이모티콘 문자에는 두 개의 룬 리터럴128077127996가 필요합니다. 여기에 사용된 이모티콘은 피부색을 표현하기 위해 별도의 룬이나 바이트가 필요하기 때문입니다. 그렇다면 실제로 문자 수를 알아내는 방법은 무엇입니까?

이를 수행하는 기능을 제공하는 오픈 소스 라이브러리github.com/rivo/uniseg가 있습니다. 이 문자열에 있는 문자 수를 반환하는 함수GraphemeClusterCount를 제공합니다. 작성자 및 구현에 대한 자세한 내용은 Github의 소스 코드를 확인하세요.

이제 이 라이브러리를 사용해 보고 주어진 문자열에서 실제 문자 수를 얻을 수 있는지 봅시다.

import "github.com/rivo/uniseg"

s := "Well done 👍🏼"
fmt.Printf("uniseg.GraphemeClusterCount(s) = %d\n", uniseg.GraphemeClusterCount(s3))


출력은 다음과 같습니다.

uniseg.GraphemeClusterCount(s3) = 11


마지막으로 주어진 문자열의 문자 수에 대한 올바른 값을 제공하는 함수가 있습니다. 이것은 내가 테스트한 거의 모든 경우에 작동합니다. 이것을 사용하기 전에 자체 테스트를 실행하십시오.

문자열 변환



이 기사를 끝내기 전에 Go 초보자가 문자열로 작업할 때 접할 수 있는 일반적인 실수를 살펴보겠습니다. 여기에서 스니펫을 살펴보겠습니다.

s1 := string(65)
fmt.Printf("length of s1 = %d\n", len(s1))

s2 := strconv.FormatInt(65, 10)
fmt.Printf("length of s2 = %d\n", len(s2))


출력은 다음과 같습니다.

length of s1 = 1
length of s2 = 2

string(65)unicode 에서 정수 65로 표시되는 문자를 반환하기 때문입니다. 이 경우 해당 값은 character A 입니다. 따라서 s1의 길이는 1입니다. 실제로 정수를 문자열로 변환하려면 FormatInt 패키지의 strconv 함수를 사용하십시오. 여기서 strconv.FormatInt(65, 10)65의 10진수 표현을 문자열로 변환합니다. 따라서 변수 s2"65"로 설정되고 s2의 길이는 2입니다.

참조:


  • Go의 문자열, 바이트, 룬 및 문자https://blog.golang.org/strings
  • 문자열 유형https://golang.org/ref/spec#String_types
  • rivo/uniseg 패키지 https://github.com/rivo/uniseg
  • strconv 패키지 https://pkg.go.dev/strconv

  • 소프트웨어 개발 및 프로그래밍과 관련된 더 많은 기사를 읽고 싶다면 내 blog 를 확인하십시오.

    좋은 웹페이지 즐겨찾기