Skip to content

strings

Das Paket strings implementiert einfache Funktionen zur Manipulation von UTF-8-kodierten Strings. Kurz gesagt, es ist ein Werkzeugpaket für String-Operationen.

Offizielle Dokumentation: strings package - strings - Go Packages

TIP

Go unterstützt von Haus aus UTF8-Zeichen. Alle String-Operationen basieren auf UTF8.

Import

go
import (
   "strings"
)

Im Folgenden werden anhand von Beispielen die häufig verwendeten Funktionen erklärt.

String kopieren

go
func Clone(s string) string

Weist neuen Speicher für die Kopie zu. Wenn ein leerer String übergeben wird, wird kein Speicher zugewiesen und ein leerer String zurückgegeben.

go
func TestClone(t *testing.T) {
   ori := "hello Welt"
   copys := strings.Clone(ori)
   fmt.Println(ori, copys)
   fmt.Println(&ori, &copys)
}
=== RUN   TestClone
hello Welt hello Welt
0xc00005e5d0 0xc00005e5e0
--- PASS: TestClone (0.00s)
PASS

Strings vergleichen

go
func Compare(a, b string) int

Vergleicht Strings a und b in lexikografischer Reihenfolge. Wenn a>b, wird 1 zurückgegeben, wenn a<b wird -1 zurückgegeben, wenn a=b wird 0 zurückgegeben.

go
func TestCompare(t *testing.T) {
  fmt.Println(strings.Compare("abc", "abe"))
  fmt.Println(strings.Compare("abcd", "abe"))
  fmt.Println(strings.Compare("abijk", "abe"))
  fmt.Println(strings.Compare("abe", "abe"))
}
=== RUN   TestCompare
-1
-1
1
0
--- PASS: TestCompare (0.00s)
PASS

String enthält

go
func Contains(s, substr string) bool

Prüft, ob ein String s einen Teilstring substr enthält

go
func TestContains(t *testing.T) {
  fmt.Println(strings.Contains("abcdefg", "a"))
  fmt.Println(strings.Contains("abcdefg", "abc"))
  fmt.Println(strings.Contains("abcdefg", "ba"))
}
=== RUN   TestContains
true
true
false
--- PASS: TestContains (0.00s)
PASS
go
func ContainsAny(s, chars string) bool

Prüft, ob ein beliebiges Zeichen aus chars im String s enthalten ist

go
func TestContainsAny(t *testing.T) {
  fmt.Println(strings.ContainsAny("abcedfg", "bac"))
  fmt.Println(strings.ContainsAny("abcedfg", "gfdecba"))
}
=== RUN   TestContainsAny
true
--- PASS: TestContainsAny (0.00s)
PASS
go
func ContainsRune(s string, r rune) bool

Prüft, ob das Zeichen r im String s enthalten ist

go
func TestContainsRune(t *testing.T) {
   fmt.Println(strings.ContainsRune("abcedf", 'a'))
   fmt.Println(strings.ContainsRune("abcedf", 'b'))
   fmt.Println(strings.ContainsRune("Hallo Welt", 'W'))
}
=== RUN   TestContainsRune
true
true
true
--- PASS: TestContainsRune (0.00s)
PASS

Häufigkeit eines Teilstrings

go
func Count(s, substr string) int

Gibt zurück, wie oft der Teilstring substr im String s vorkommt

go
func TestCount(t *testing.T) {
  fmt.Println(strings.Count("3.1415926", "1"))
  fmt.Println(strings.Count("there is a girl", "e"))
  fmt.Println(strings.Count("there is a girl", ""))
}
=== RUN   TestCount
2
2
16
--- PASS: TestCount (0.00s)
PASS

Teilstring entfernen

go
func Cut(s, sep string) (before, after string, found bool)

Entfernt das erste Vorkommen des Teilstrings sep in s und gibt das Ergebnis zurück

  • before - der String vor dem entfernten Teilstring
  • after - der String nach dem entfernten Teilstring
  • found - ob der Teilstring gefunden wurde
go
func TestCut(t *testing.T) {
  show := func(s, sep string) {
    before, after, found := strings.Cut(s, sep)
    fmt.Printf("Cut(%q, %q) = %q, %q, %v\n", s, sep, before, after, found)
  }
  show("Hello world", " ")
  show("Hello world", "world")
  show("Hello world", "Hello")
  show("Hello world", "Hello world")
}
=== RUN   TestCut
Cut("Hello world", " ") = "Hello", "world", true
Cut("Hello world", "world") = "Hello ", "", true
Cut("Hello world", "Hello") = "", " world", true
Cut("Hello world", "Hello world") = "", "", true
--- PASS: TestCut (0.00s)
PASS

Groß-/Kleinschreibung ignorieren

go
func EqualFold(s, t string) bool

Gibt zurück, ob die Strings s und t bei Ignorierung der Groß-/Kleinschreibung gleich sind

go
func TestEqualFold(t *testing.T) {
   fmt.Println(strings.EqualFold("Hallo", "Hallo"))
   fmt.Println(strings.EqualFold("Hello", "Hello"))
   fmt.Println(strings.EqualFold("Hello", "hELLO"))
}
=== RUN   TestEqualFold
true
true
true
--- PASS: TestEqualFold (0.00s)
PASS

String aufteilen

go
func Fields(s string) []string
go
func FieldsFunc(s string, f func(rune) bool) []string

Erstere teilt den String anhand von Leerzeichen, letztere anhand des Rückgabewerts der Funktion f.

go
func TestField(t *testing.T) {
   fmt.Printf("%q\n", strings.Fields(" a b c d e f g "))
   fmt.Printf("%q\n", strings.FieldsFunc("a,b,c,d,e,f,g", func(r rune) bool {
      return r == ','
   }))
}
=== RUN   TestField
["a" "b" "c" "d" "e" "f" "g"]
["a" "b" "c" "d" "e" "f" "g"]
--- PASS: TestField (0.00s)
PASS

Präfix und Suffix suchen

go
func HasPrefix(s, prefix string) bool
go
func HasSuffix(s, suffix string) bool

Erstere sucht nach einem Präfix, letztere nach einem Suffix.

go
func TestPreSuffix(t *testing.T) {
   str := "abbc cbba"
   fmt.Println(strings.HasPrefix(str, "abb"))
   fmt.Println(strings.HasSuffix(str, "bba"))
}
=== RUN   TestPreSuffix
true
true
--- PASS: TestPreSuffix (0.00s)
PASS

Position eines Teilstrings

Gibt den Index des ersten Vorkommens eines Teilstrings zurück

go
func Index(s, substr string) int

Gibt den Index des ersten Vorkommens eines beliebigen Zeichens aus chars zurück

go
func IndexAny(s, chars string) int

Gibt den Index des ersten Vorkommens eines Runes zurück

go
func IndexRune(s string, r rune) int

Beispiel

go
func TestIndex(t *testing.T) {
   fmt.Println(strings.Index("abcdefg", "bc"))
   fmt.Println(strings.IndexAny("abcdefg", "cb"))
   fmt.Println(strings.IndexRune("abcdefg", 'g'))
}
=== RUN   TestIndex
1
1
6
--- PASS: TestIndex (0.00s)
PASS

Gibt den Index des letzten Vorkommens eines Teilstrings zurück

go
func LastIndex(s, substr string) int

Gibt den Index des letzten Vorkommens eines beliebigen Zeichens aus chars zurück

go
func LastIndexAny(s, chars string) int

Beispiel

go
func TestLastIndex(t *testing.T) {
  fmt.Println(strings.LastIndex("abcdefga", "a"))
  fmt.Println(strings.LastIndexAny("abcdefghisa", "ba"))
}

String durchlaufen und ersetzen

Map gibt eine Kopie des Strings s zurück und modifiziert alle Zeichen basierend auf der Mapping-Funktion. Wenn die Mapping-Funktion einen negativen Wert zurückgibt, wird das Zeichen aus dem String entfernt, ohne ersetzt zu werden.

go
func Map(mapping func(rune) rune, s string) string

Beispiel

go
func TestMap(t *testing.T) {
   fmt.Println(strings.Map(func(r rune) rune {
      return r - 32
   }, "abcdefghijk"))
   fmt.Println(strings.Map(func(r rune) rune {
      return r + 32
   }, "ABCDEFGHIJK"))
   fmt.Println(strings.Map(func(r rune) rune {
      if r < 'F' {
         return -1
      } else {
         return r
      }
   }, "ABCDEFGHIJK"))
}

Ausgabe

text
=== RUN   TestMap
ABCDEFGHIJK
abcdefghijk
FGHIJK
--- PASS: TestMap (0.00s)
PASS

String wiederholen

Kopiert den String entsprechend der angegebenen Anzahl. Eine negative Zahl führt zu panic.

go
func Repeat(s string, count int) string

Beispiel

go
func TestRepeat(t *testing.T) {
   fmt.Println(strings.Repeat("a", 10))
   fmt.Println(strings.Repeat("abc", 10))
}

Ausgabe

=== RUN   TestRepeat
aaaaaaaaaa
abcabcabcabcabcabcabcabcabcabc
--- PASS: TestRepeat (0.00s)
PASS

String ersetzen

s ist der Quellstring, old ist der zu ersetzende Teil, new ist der Ersatzteil, n ist die Anzahl der Ersetzungen. Wenn n kleiner als 0 ist, wird unbegrenzt ersetzt.

go
func Replace(s, old, new string, n int) string

Beispiel

go
func TestReplace(t *testing.T) {
   fmt.Println(strings.Replace("Hello this is golang", "golang", "c++", 1))
   fmt.Println(strings.Replace("Hello this is golang", "o", "c", -1))
   fmt.Println(strings.Replace("Hello this is golang", "o", "c", 1))
}

Ausgabe

=== RUN   TestReplace
Hello this is c++
Hellc this is gclang
Hellc this is golang
--- PASS: TestReplace (0.00s)
PASS

Praktische Funktion für Replace, äquivalent zu strings.Replace(s, old, new, -1)

go
func ReplaceAll(s, old, new string) string

Beispiel

go
func TestReplaceAll(t *testing.T) {
  fmt.Println(strings.ReplaceAll("Hello this is golang", "o", "c++"))
}

Ausgabe

=== RUN   TestReplaceAll
Hellc++ this is gc++lang
--- PASS: TestReplaceAll (0.00s)
PASS

String trennen

Trennt den String s anhand des Teilstrings sep in ein String-Slice

go
func Split(s, sep string) []string

Trennt den String s anhand des Teilstrings sep in ein String-Slice, die Anzahl der Trennungen wird durch n bestimmt

go
func SplitN(s, sep string, n int) []string

Trennt den String s anhand des Teilstrings sep in ein String-Slice, das sep enthält

go
func SplitAfter(s, sep string) []string

Trennt den String s anhand des Teilstrings sep in ein String-Slice, das sep enthält, die Anzahl der Trennungen wird durch n bestimmt

go
func SplitAfterN(s, sep string, n int) []string

Beispiel

go
func TestSplit(t *testing.T) {
   fmt.Printf("%q\n", strings.Split("this is go language", " "))
   fmt.Printf("%q\n", strings.SplitN("this is go language", " ", 2))
   fmt.Printf("%q\n", strings.SplitAfter("this is go language", " "))
   fmt.Printf("%q\n", strings.SplitAfterN("this is go language", " ", 2))
}

Ausgabe

=== RUN   TestSplit
["this" "is" "go" "language"]
["this" "is go language"]
["this " "is " "go " "language"]
["this " "is go language"]
--- PASS: TestSplit (0.00s)
PASS

Groß-/Kleinschreibung umwandeln

Wandelt englische Strings in Kleinbuchstaben um

go
func ToLower(s string) string

Wandelt basierend auf der übergebenen unicode.SpecialCase in Kleinbuchstaben der entsprechenden Sprache um

go
func ToLowerSpecial(c unicode.SpecialCase, s string) string

Wandelt englische Strings in Großbuchstaben um

go
func ToUpper(s string) string

Wandelt basierend auf der übergebenen unicode.SpecialCase in Großbuchstaben der entsprechenden Sprache um

go
func ToUpperSpecial(c unicode.SpecialCase, s string) string

Beispiel

go
func TestLowerAndUpper(t *testing.T) {
   fmt.Println(strings.ToLower("My name is jack,Nice to meet you!"))
   fmt.Println(strings.ToLowerSpecial(unicode.TurkishCase, "Önnek İş"))
   fmt.Println(strings.ToUpper("My name is jack,Nice to meet you!"))
   fmt.Println(strings.ToUpperSpecial(unicode.TurkishCase, "örnek iş"))
}

Ausgabe

=== RUN   TestLowerAndUpper
my name is jack,nice to meet you!
önnek iş
MY NAME IS JACK,NICE TO MEET YOU!
ÖRNEK İŞ
--- PASS: TestLowerAndUpper (0.00s)
PASS

String trimmen

Trimmt beide Enden des Strings und löscht alle übereinstimmenden Teilstrings aus cutset

go
func Trim(s, cutset string) string

Trimmt das linke Ende des Strings und löscht alle übereinstimmenden Teilstrings aus cutset

go
func TrimLeft(s, cutset string) string

Trimmt das Präfix am linken Ende und löscht den übereinstimmenden Teilstring aus cutset. Wenn nicht übereinstimmend, wird der String s zurückgegeben

go
func TrimPrefix(s, suffix string) string

Trimmt das rechte Ende des Strings und löscht alle übereinstimmenden Teilstrings aus cutset

go
func TrimRight(s, cutset string) string

Trimmt das Suffix am rechten Ende und löscht den übereinstimmenden Teilstring aus cutset. Wenn nicht übereinstimmend, wird der String s zurückgegeben

go
func TrimSuffix(s, suffix string) string

Beispiel

go
func TestTrim(t *testing.T) {
  fmt.Println(strings.Trim("!!this is a test statement!!", "!!!"))
  fmt.Println(strings.TrimLeft("!!this is a test statement!!", "!!!"))
  fmt.Println(strings.TrimRight("!!this is a test statement!!", "!!!"))
  fmt.Println(strings.TrimPrefix("!!this is a test statement!!", "!!!"))
  fmt.Println(strings.TrimSuffix("!!this is a test statement!!", "!!!"))
}

Ausgabe

=== RUN   TestTrim
this is a test statement
this is a test statement!!
!!this is a test statement
!!this is a test statement!!
!!this is a test statement!!
--- PASS: TestTrim (0.00s)
PASS

String Builder

String Builder ist speichereffizienter als direkte String-Manipulation.

go
type Builder struct {
  // interne Felder nicht öffentlich
}

Beispiel

go
func TestBuilder(t *testing.T) {
   builder := strings.Builder{}
   builder.WriteString("hello")
   builder.WriteString(" world")
   fmt.Println(builder.Len())
   fmt.Println(builder.String())
}

Ausgabe

=== RUN   TestBuilder
11
hello world
--- PASS: TestBuilder (0.00s)
PASS

TIP

Versuchen Sie nicht, Builder als Wert zu übergeben. Wenn Sie strings.Builder beispielsweise als Funktionsparameter übergeben, wird das Programm panic auslösen.

strings: illegal use of non-zero Builder copied by value

Intern enthält es folgenden Code:

go
type Builder struct {
  addr *Builder // eigene Adresse
  buf  []byte
}

func (b *Builder) copyCheck() {
   if b.addr == nil {
      b.addr = (*Builder)(noescape(unsafe.Pointer(b)))
   } else if b.addr != b {
      panic("strings: illegal use of non-zero Builder copied by value")
   }
}

Wenn Builder als Wert kopiert wird, wird auch der Zeiger auf den internen Slice kopiert. Beide Builder schreiben in denselben Slice. Deshalb ist die Wertkopie nicht erlaubt.

String Replacer

Replacer ist speziell für das Ersetzen von Strings

go
func NewReplacer(oldnew ...string) *Replacer

Beispiel

go
func TestReplacer(t *testing.T) {
  r := strings.NewReplacer("<", "<", ">", ">")
  fmt.Println(r.Replace("This is <b>HTML</b>!"))
}

Ausgabe

This is <b>HTML</b>!

String Reader

Reader implementiert die Schnittstellen io.Reader, io.ReaderAt, io.ByteReader, io.ByteScanner, io.RuneReader, io.RuneScanner, io.Seeker und io.WriterTo.

go
func NewReader(s string) *Reader

Beispiel

go
func TestReader(t *testing.T) {
   reader := strings.NewReader("abcdefghijk")
   buffer := make([]byte, 20, 20)
   read, err := reader.Read(buffer)
   if err != nil {
      log.Panic(err)
   }
   fmt.Println(read)
   fmt.Println(string(buffer))
}

Ausgabe

=== RUN   TestReader
11
abcdefghijk
--- PASS: TestReader (0.00s)
PASS

Golang by www.golangdev.cn edit