ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • golang: 문자열 함수
    Back-End/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을 사용하는 것은 문자열을 다룰 때 특히 다양한 글자를 포함하는 국제화된 어플리케이션에서 매우 중요합니다.

    반응형

    'Back-End > Golang' 카테고리의 다른 글

    golang: 1급 시민(First-class citizen)이란?  (1) 2024.04.28
    golang: Go 언어의 장점  (1) 2024.04.21
    golang: for-select 패턴  (0) 2024.04.19
    golang: 동시성에서 제한(Confinement)이란?  (0) 2024.04.19
    golang: 포인터(Pointer)란?  (0) 2024.03.30
Designed by Tistory.