Skip to content

strings

Package strings mengimplementasikan fungsi sederhana untuk mengoperasikan string yang dikodekan UTF-8, sederhananya adalah package alat untuk mengoperasikan string.

Dokumentasi resmi: strings package - strings - Go Packages

TIP

Go secara native mendukung karakter UTF8, semua operasi string dibangun di atas UTF8.

Impor

go
import (
   "strings"
)

Di bawah ini akan menjelaskan fungsi yang umum digunakan dalam bentuk contoh.

Menyalin String

go
func Clone(s string) string

Akan mengalokasikan memori baru untuk salinan, jika string kosong diteruskan, tidak akan mengalokasikan memori dan mengembalikan string kosong.

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

Membandingkan String

go
func Compare(a, b string) int

Membandingkan string a dan b sesuai urutan kamus, jika a>b, mengembalikan 1, a<b mengembalikan -1, a=b mengembalikan 0.

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

Mengandung String

go
func Contains(s, substr string) bool

Menentukan apakah string s mengandung substring substr

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

Menentukan apakah sembarang karakter unicode dalam string chars ada dalam string s, dengan kata lain apakah s mengandung sembarang string dalam chars

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

Menentukan apakah string s mengandung karakter r

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

Jumlah Kemunculan Substring

go
func Count(s, substr string) int

Memberikan jumlah kemunculan substring substr dalam string s

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

Menghapus Substring Tertentu

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

Menghapus kemunculan pertama substring sep dalam s, dan mengembalikan hasil setelah penghapusan

  • before - String sebelum posisi substring yang dihapus
  • after - String setelah posisi substring yang dihapus
  • found - Apakah substring ditemukan
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

Sama Tanpa Memperhatikan Huruf Besar/Kecil

go
func EqualFold(s, t string) bool

Mengembalikan apakah string s dan t sama tanpa memperhatikan huruf besar/kecil

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

Membagi String

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

Yang pertama membagi string berdasarkan spasi, yang kedua menentukan apakah akan membagi string berdasarkan nilai kembalian fungsi 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

Mencari Prefix dan Suffix

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

Yang pertama mencari prefix, yang kedua mencari suffix, jika tertarik Anda dapat melihat implementasi kode sumber di sini, cukup cerdas.

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

Posisi Substring

Mengembalikan indeks kemunculan pertama substring

go
func Index(s, substr string) int

Mengembalikan indeks kemunculan pertama substring

go
func IndexAny(s, chars string) int

Mengembalikan indeks kemunculan pertama substring

go
func IndexRune(s string, r rune) int

Contoh

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

Mengembalikan indeks kemunculan terakhir substring

go
func LastIndex(s, substr string) int

Mengembalikan indeks sembarang karakter kemunculan terakhir substring

go
func LastIndexAny(s, chars string) int

Contoh

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

Iterasi dan Mengganti String

Map mengembalikan salinan string s, dan memodifikasi semua karakter string s sesuai fungsi pemetaan. Jika pemetaan mengembalikan nilai negatif, karakter tersebut akan dihapus dari string, tanpa penggantian

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

Contoh

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"))
}

Output

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

Mengulang String

Menyalin string sesuai Count yang diberikan, jika negatif akan menyebabkan panic

go
func Repeat(s string, count int) string

Contoh

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

Output

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

Mengganti String

s adalah string sumber, old mengacu pada bagian yang akan diganti, new mengacu pada bagian pengganti old, n mengacu pada jumlah penggantian, n kurang dari 0 menunjukkan tidak membatasi jumlah penggantian.

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

Contoh

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))
}

Output

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

Fungsi convenience Replace, setara dengan stings.Replace(s,old,new,-1)

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

Contoh

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

Output

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

Memisahkan String

Memisahkan string s menjadi slice string berdasarkan substring sep

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

Memisahkan string s menjadi slice string berdasarkan substring sep, jumlah pemisahannya ditentukan oleh n

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

Memisahkan string s menjadi slice string yang berisi elemen string sep

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

Memisahkan string s menjadi slice string yang berisi elemen string sep, jumlah pemisahannya ditentukan oleh n

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

Contoh

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))
}

Output

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

Konversi Huruf Besar/Kecil

Mengonversi string bahasa Inggris menjadi huruf kecil

go
func ToLower(s string) string

Mengonversi menjadi string huruf kecil bahasa yang sesuai berdasarkan unicode.SpecialCase bahasa yang diteruskan

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

Mengonversi string bahasa Inggris menjadi string huruf besar

go
func ToUpper(s string) string

Mengonversi menjadi string huruf besar bahasa yang sesuai berdasarkan unicode.SpecialCase bahasa yang diteruskan

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

Contoh

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ş"))
}

Output

=== 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

Memotong String

Memotong kedua ujung string, menghapus substring yang cocok dengan cutset

go
func Trim(s, cutset string) string

Memotong ujung kiri string, menghapus substring yang cocok dengan cutset

go
func TrimLeft(s, cutset string) string

Memotong prefix ujung kiri string, menghapus substring yang cocok dengan cutset, jika tidak cocok akan mengembalikan string s

go
func TrimPrefix(s, suffix string) string

Memotong ujung kanan string, menghapus substring yang cocok dengan cutset

go
func TrimRight(s, cutset string) string

Memotong suffix ujung kanan string, menghapus substring yang cocok dengan cutset, jika tidak cocok akan mengembalikan string s

go
func TrimSuffix(s, suffix string) string

Contoh

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!!", "!!!"))
}

Output

=== 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 lebih hemat memori dibandingkan mengoperasikan string secara langsung.

go
type Builder struct {
  // Field internal tidak diekspos ke luar
}

Contoh

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

Output

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

TIP

Jangan mencoba meneruskan Builder sebagai nilai, misalnya saat meneruskan strings.Builder sebagai parameter fungsi, program akan panic

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

Di dalamnya terdapat kode seperti berikut

go
type Builder struct {
  addr *Builder // Alamat sendiri
  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")
   }
}

Saat melakukan salinan nilai pada Builder, juga menyalin pointer slice internal, kedua Builder saat menulis string keduanya mengoperasikan slice yang sama, inilah alasan mengapa tidak diizinkan untuk disalin nilai.

String Replacer

Replacer khusus untuk mengganti string

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

Contoh

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

Output

This is <b>HTML</b>!

String Reader

Reader mengimplementasikan interface io.Reader, io.ReaderAt, io.ByteReader, io.ByteScanner, io.RuneReader, io.RuneScanner, io.Seeker, dan io.WriterTo.

go
func NewReader(s string) *Reader

Contoh

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))
}

Output

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

Golang by www.golangdev.cn edit