Back-End/Golang

golang: 문자열 함수

슝슝이입니다 2024. 4. 21. 13:39
반응형

 Go 언어에서 문자열을 다루는 데 사용되는 주요 함수들은 대부분 strings 패키지 내에 있습니다. 여기서는 strings 패키지의 주요 함수들을 나열하겠습니다. 이 함수들은 다양한 문자열 조작 작업에 사용될 수 있습니다:

  1. Compare: 두 문자열을 비교하고, 첫 번째 문자열이 두 번째 문자열보다 작으면 -1, 같으면 0, 크면 1을 반환합니다.
  2. Contains: 하나의 문자열이 다른 문자열에 포함되어 있는지 확인합니다.
  3. ContainsAny: 주어진 문자들 중 하나라도 문자열에 포함되어 있는지 확인합니다.
  4. ContainsRune: 문자열이 특정 룬을 포함하고 있는지 확인합니다.
  5. Count: 하나의 문자열이 다른 문자열에 몇 번 등장하는지 세어 반환합니다.
  6. EqualFold: 두 문자열이 대소문자를 구분하지 않고 같은지 확인합니다.
  7. Fields: 문자열을 공백으로 분리하여 슬라이스로 반환합니다.
  8. FieldsFunc: 지정된 함수를 만족하는 지점에서 문자열을 분리합니다.
  9. HasPrefix: 문자열이 특정 접두사로 시작하는지 확인합니다.
  10. HasSuffix: 문자열이 특정 접미사로 끝나는지 확인합니다.
  11. Index: 하나의 문자열이 다른 문자열에서 처음 등장하는 위치를 반환합니다.
  12. IndexAny: 문자열 중 주어진 문자들 중 하나가 처음으로 등장하는 위치를 반환합니다.
  13. IndexByte: 문자열에서 특정 바이트가 처음으로 등장하는 위치를 반환합니다.
  14. IndexFunc: 지정된 함수를 만족하는 첫 번째 문자의 위치를 반환합니다.
  15. IndexRune: 문자열에서 특정 룬이 처음으로 등장하는 위치를 반환합니다.
  16. Join: 여러 문자열을 주어진 구분자로 결합합니다.
  17. LastIndex: 하나의 문자열이 다른 문자열에서 마지막으로 등장하는 위치를 반환합니다.
  18. LastIndexAny: 문자열 중 주어진 문자들 중 하나가 마지막으로 등장하는 위치를 반환합니다.
  19. LastIndexByte: 문자열에서 특정 바이트가 마지막으로 등장하는 위치를 반환합니다.
  20. LastIndexFunc: 지정된 함수를 만족하는 마지막 문자의 위치를 반환합니다.
  21. Map: 문자열의 각 문자에 대해 함수를 적용하고 결과를 새 문자열로 반환합니다.
  22. Repeat: 문자열을 주어진 횟수만큼 반복하여 새 문자열을 생성합니다.
  23. Replace: 문자열 내의 부분 문자열을 다른 문자열로 지정된 횟수만큼 교체합니다.
  24. ReplaceAll: 문자열 내의 부분 문자열을 다른 문자열로 모두 교체합니다.
  25. Split: 문자열을 주어진 구분자에 따라 분리하여 슬라이스로 반환합니다.
  26. SplitAfter: 구분자를 포함하여 문자열을 분리합니다.
  27. SplitAfterN: 구분자를 포함하여 문자열을 주어진 횟수만큼 분리합니다.
  28. SplitN: 문자열을 주어진 구분자와 횟수에 따라 분리합니다.
  29. Title: 문자열의 각 단어의 첫 글자를 대문자로 변환합니다.
  30. ToLower: 문자열의 모든 문자를 소문자로 변환합니다.
  31. ToUpper: 문자열의 모든 문자를 대문자로 변환합니다.
  32. Trim: 문자열 양쪽 끝에서 주어진 문자 집합을 제거합니다.
  33. TrimFunc: 문자열 양쪽 끝에서 지정된 함수를 만족하는 문자를 제거합니다.
  34. TrimLeft: 문자열 왼쪽 끝에서 주어진 문자 집합을 제거합니다.
  35. TrimRight: 문자열 오른쪽 끝에서 주어진 문자 집합을 제거합니다.
  36. TrimSpace: 문자열 양쪽 끝에서 공백을 제거합니다.

 

package main

import (
    "fmt"
    "strings"
    "unicode"
)

func main() {
    // Compare: 두 문자열을 비교하고, 첫 번째 문자열이 두 번째 문자열보다 작으면 -1, 같으면 0, 크면 1을 반환합니다.
    fmt.Println(strings.Compare("abc", "bcd")) // -1
    fmt.Println(strings.Compare("abc", "abc")) // 0
    fmt.Println(strings.Compare("bcd", "abc")) // 1

    // Contains: 하나의 문자열이 다른 문자열에 포함되어 있는지 확인합니다.
    fmt.Println(strings.Contains("hello world", "world")) // true

	// ContainsAny: 주어진 문자들 중 하나라도 문자열에 포함되어 있는지 확인합니다.
    fmt.Println(strings.ContainsAny("team", "i")) // false
    fmt.Println(strings.ContainsAny("failure", "ui")) // true

    // ContainsRune: 문자열이 특정 룬을 포함하고 있는지 확인합니다.
    fmt.Println(strings.ContainsRune("gopher", 'p')) // true

	// Count: 하나의 문자열이 다른 문자열에 몇 번 등장하는지 세어 반환합니다.
    fmt.Println(strings.Count("cheese", "e")) // 3

	// EqualFold: 두 문자열이 대소문자를 구분하지 않고 같은지 확인합니다.
    fmt.Println(strings.EqualFold("Go", "go")) // true

 	// Fields: 문자열을 공백으로 분리하여 슬라이스로 반환합니다.
    fmt.Printf("%q\n", strings.Fields("  foo bar  baz   ")) // ["foo" "bar" "baz"]

	// FieldsFunc: 지정된 함수를 만족하는 지점에서 문자열을 분리합니다.
    fmt.Printf("%q\n", strings.FieldsFunc("  foo1;bar2,baz3...", func(c rune) bool {
        return !unicode.IsLetter(c)
    })) // ["foo" "bar" "baz"]

	// HasPrefix: 문자열이 특정 접두사로 시작하는지 확인합니다.
    fmt.Println(strings.HasPrefix("golang", "go")) // true

	// HasSuffix: 문자열이 특정 접미사로 끝나는지 확인합니다.
    fmt.Println(strings.HasSuffix("golang", "lang")) // true

	// Index: 하나의 문자열이 다른 문자열에서 처음 등장하는 위치를 반환합니다.
    fmt.Println(strings.Index("chicken", "ken")) // 4
    fmt.Println(strings.Index("chicken", "dmr")) // -1

	// IndexAny: 문자열 중 주어진 문자들 중 하나가 처음으로 등장하는 위치를 반환합니다.
    fmt.Println(strings.IndexAny("chicken", "aeiouy")) // 2

	// IndexByte: 문자열에서 특정 바이트가 처음으로 등장하는 위치를 반환합니다.
    fmt.Println(strings.IndexByte("gopher", 'p')) // 2

	// IndexFunc: 지정된 함수를 만족하는 첫 번째 문자의 위치를 반환합니다.
    fmt.Println(strings.IndexFunc("gopher", unicode.IsNumber)) // -1

	// IndexRune: 문자열에서 특정 룬이 처음으로 등장하는 위치를 반환합니다.
    fmt.Println(strings.IndexRune("gopher", 'p')) // 2

	// Join: 여러 문자열을 주어진 구분자로 결합합니다.
    fmt.Println(strings.Join([]string{"name", "surname"}, ", ")) // name, surname

	// LastIndex: 하나의 문자열이 다른 문자열에서 마지막으로 등장하는 위치를 반환합니다.
    fmt.Println(strings.LastIndex("go gopher", "go")) // 3

	// LastIndexAny: 문자열 중 주어진 문자들 중 하나가 마지막으로 등장하는 위치를 반환합니다.
    fmt.Println(strings.LastIndexAny("chicken", "aeiouy")) // 5
	
    // LastIndexByte: 문자열에서 특정 바이트가 마지막으로 등장하는 위치를 반환합니다.
    fmt.Println(strings.LastIndexByte("gophers rock", 'r')) // 9

	// LastIndexFunc: 지정된 함수를 만족하는 마지막 문자의 위치를 반환합니다.
    fmt.Println(strings.LastIndexFunc("go 123", unicode.IsNumber)) // 5

	// Map: 문자열의 각 문자에 대해 함수를 적용하고 결과를 새 문자열로 반환합니다.
    rot13 := func(r rune) rune {
        switch {
        case r >= 'A' && r <= 'Z':
            return 'A' + (r-'A'+13)%26
        case r >= 'a' && r <= 'z':
            return 'a' + (r-'a'+13)%26
        }
        return r
    }
    fmt.Println(strings.Map(rot13, "Terraform")) // Greensbez

	// Repeat: 문자열을 주어진 횟수만큼 반복하여 새 문자열을 생성합니다.
    fmt.Println(strings.Repeat("na", 2)) // nana

	// Replace: 문자열 내의 부분 문자열을 다른 문자열로 지정된 횟수만큼 교체합니다.
    fmt.Println(strings.Replace("oink oink oink", "k", "ky", 2)) // oinky oinky oink

	// ReplaceAll: 문자열 내의 부분 문자열을 다른 문자열로 모두 교체합니다.
    fmt.Println(strings.ReplaceAll("oink oink oink", "oink", "moo")) // moo moo moo

	// Split: 문자열을 주어진 구분자에 따라 분리하여 슬라이스로 반환합니다.
    fmt.Printf("%q\n", strings.Split("a,b,c", ",")) // ["a" "b" "c"]

	// SplitAfter: 구분자를 포함하여 문자열을 분리합니다.
    fmt.Printf("%q\n", strings.SplitAfter("a,b,c", ",")) // ["a," "b," "c"]
	
    // SplitAfterN: 구분자를 포함하여 문자열을 주어진 횟수만큼 분리합니다.
    fmt.Printf("%q\n", strings.SplitAfterN("a,b,c,d,e", ",", 3)) // ["a," "b," "c,d,e"]

	// SplitN: 문자열을 주어진 구분자와 횟수에 따라 분리합니다.
    fmt.Printf("%q\n", strings.SplitN("a,b,c,d,e", ",", 3)) // ["a" "b" "c,d,e"]

	// Title: 문자열의 각 단어의 첫 글자를 대문자로 변환합니다.
    fmt.Println(strings.Title("loud noises")) // Loud Noises

	// ToLower: 문자열의 모든 문자를 소문자로 변환합니다.
    fmt.Println(strings.ToLower("LOUD")) // loud

	// ToUpper: 문자열의 모든 문자를 대문자로 변환합니다.
    fmt.Println(strings.ToUpper("quiet")) // QUIET

	// Trim: 문자열 양쪽 끝에서 주어진 문자 집합을 제거합니다.
    fmt.Println(strings.Trim("   spacious   ", " ")) // "spacious"

	// TrimFunc: 문자열 양쪽 끝에서 지정된 함수를 만족하는 문자를 제거합니다.
    fmt.Println(strings.TrimFunc("12345abcde67890", func(r rune) bool { return unicode.IsNumber(r) })) // "abcde"

    // TrimLeft: 문자열 왼쪽 끝에서 주어진 문자 집합을 제거합니다.
	fmt.Println(strings.TrimLeft(">>>trim", ">")) // "trim"
	
    // TrimRight: 문자열 오른쪽 끝에서 주어진 문자 집합을 제거합니다.
	fmt.Println(strings.TrimRight("trim<<<", "<")) // "trim"

	// TrimSpace: 문자열 양쪽 끝에서 공백을 제거합니다.
    fmt.Println(strings.TrimSpace(" \t\n Hello, Gopher \n\t\r\n")) // "Hello, Gopher"
}

 

룬(rune)이란?

 Go 언어에서 "룬(rune)"은 문자를 나타내는 데이터 타입입니다. rune은 사실상 int32의 별칭(alias)으로, 유니코드 코드 포인트를 표현하는 데 사용됩니다. 즉, rune 타입은 모든 유니코드 문자를 저장할 수 있으며, Go의 문자열은 UTF-8 인코딩된 바이트 시퀀스로 저장되기 때문에, 이를 문자 단위로 다루기 위해 rune을 사용합니다.

 예를 들어, UTF-8 인코딩에서 하나의 문자는 1바이트에서 4바이트까지 다양한 길이를 가질 수 있는데, rune 타입은 이러한 다양한 크기의 문자를 일관되게 4바이트로 표현합니다. 이는 다국어 처리나 문자열에서 문자 단위로 접근할 때 매우 유용합니다.

Go에서 문자열을 rune 슬라이스로 변환하면 각 rune 값이 해당 문자의 유니코드 코드 포인트를 나타내게 됩니다. 다음은 rune과 관련된 간단한 예제입니다:

package main

import (
    "fmt"
)

func main() {
    s := "안녕하세요"
    r := []rune(s) // 문자열을 rune 슬라이스로 변환
    for i, runeValue := range r {
        fmt.Printf("%d번째 문자: %c (유니코드: %U)\n", i, runeValue, runeValue)
    }
}

 이 코드는 한글 문자열 "안녕하세요"를 rune 슬라이스로 변환하고, 각 문자의 값과 유니코드 코드 포인트를 출력합니다. rune을 사용함으로써 문자열의 각 문자에 정확하게 접근할 수 있습니다. 이렇게 rune을 사용하는 것은 문자열을 다룰 때 특히 다양한 글자를 포함하는 국제화된 어플리케이션에서 매우 중요합니다.

반응형