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
import (
"strings"
)Di bawah ini akan menjelaskan fungsi yang umum digunakan dalam bentuk contoh.
Menyalin String
func Clone(s string) stringAkan mengalokasikan memori baru untuk salinan, jika string kosong diteruskan, tidak akan mengalokasikan memori dan mengembalikan string kosong.
func TestClone(t *testing.T) {
ori := "hello 世界"
copys := strings.Clone(ori)
fmt.Println(ori, copys)
fmt.Println(&ori, ©s)
}=== RUN TestClone
hello 世界 hello 世界
0xc00005e5d0 0xc00005e5e0
--- PASS: TestClone (0.00s)
PASSMembandingkan String
func Compare(a, b string) intMembandingkan string a dan b sesuai urutan kamus, jika a>b, mengembalikan 1, a<b mengembalikan -1, a=b mengembalikan 0.
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)
PASSMengandung String
func Contains(s, substr string) boolMenentukan apakah string s mengandung substring substr
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)
PASSfunc ContainsAny(s, chars string) boolMenentukan apakah sembarang karakter unicode dalam string chars ada dalam string s, dengan kata lain apakah s mengandung sembarang string dalam chars
func TestContainsAny(t *testing.T) {
fmt.Println(strings.ContainsAny("abcedfg", "bac"))
fmt.Println(strings.ContainsAny("abcedfg", "gfdecba"))
}=== RUN TestContainsAny
true
--- PASS: TestContainsAny (0.00s)
PASSfunc ContainsRune(s string, r rune) boolMenentukan apakah string s mengandung karakter r
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)
PASSJumlah Kemunculan Substring
func Count(s, substr string) intMemberikan jumlah kemunculan substring substr dalam string s
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)
PASSMenghapus Substring Tertentu
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 dihapusafter- String setelah posisi substring yang dihapusfound- Apakah substring ditemukan
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)
PASSSama Tanpa Memperhatikan Huruf Besar/Kecil
func EqualFold(s, t string) boolMengembalikan apakah string s dan t sama tanpa memperhatikan huruf besar/kecil
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)
PASSMembagi String
func Fields(s string) []stringfunc FieldsFunc(s string, f func(rune) bool) []stringYang pertama membagi string berdasarkan spasi, yang kedua menentukan apakah akan membagi string berdasarkan nilai kembalian fungsi f.
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)
PASSMencari Prefix dan Suffix
func HasPrefix(s, prefix string) boolfunc HasSuffix(s, suffix string) boolYang pertama mencari prefix, yang kedua mencari suffix, jika tertarik Anda dapat melihat implementasi kode sumber di sini, cukup cerdas.
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)
PASSPosisi Substring
Mengembalikan indeks kemunculan pertama substring
func Index(s, substr string) intMengembalikan indeks kemunculan pertama substring
func IndexAny(s, chars string) intMengembalikan indeks kemunculan pertama substring
func IndexRune(s string, r rune) intContoh
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)
PASSMengembalikan indeks kemunculan terakhir substring
func LastIndex(s, substr string) intMengembalikan indeks sembarang karakter kemunculan terakhir substring
func LastIndexAny(s, chars string) intContoh
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
func Map(mapping func(rune) rune, s string) stringContoh
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
=== RUN TestMap
ABCDEFGHIJK
abcdefghijk
FGHIJK
--- PASS: TestMap (0.00s)
PASSMengulang String
Menyalin string sesuai Count yang diberikan, jika negatif akan menyebabkan panic
func Repeat(s string, count int) stringContoh
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)
PASSMengganti 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.
func Replace(s, old, new string, n int) stringContoh
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)
PASSFungsi convenience Replace, setara dengan stings.Replace(s,old,new,-1)
func ReplaceAll(s, old, new string) stringContoh
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)
PASSMemisahkan String
Memisahkan string s menjadi slice string berdasarkan substring sep
func Split(s, sep string) []stringMemisahkan string s menjadi slice string berdasarkan substring sep, jumlah pemisahannya ditentukan oleh n
func SplitN(s, sep string, n int) []stringMemisahkan string s menjadi slice string yang berisi elemen string sep
func SplitAfter(s, sep string) []stringMemisahkan string s menjadi slice string yang berisi elemen string sep, jumlah pemisahannya ditentukan oleh n
func SplitAfterN(s, sep string, n int) []stringContoh
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)
PASSKonversi Huruf Besar/Kecil
Mengonversi string bahasa Inggris menjadi huruf kecil
func ToLower(s string) stringMengonversi menjadi string huruf kecil bahasa yang sesuai berdasarkan unicode.SpecialCase bahasa yang diteruskan
func ToLowerSpecial(c unicode.SpecialCase, s string) stringMengonversi string bahasa Inggris menjadi string huruf besar
func ToUpper(s string) stringMengonversi menjadi string huruf besar bahasa yang sesuai berdasarkan unicode.SpecialCase bahasa yang diteruskan
func ToUpperSpecial(c unicode.SpecialCase, s string) stringContoh
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)
PASSMemotong String
Memotong kedua ujung string, menghapus substring yang cocok dengan cutset
func Trim(s, cutset string) stringMemotong ujung kiri string, menghapus substring yang cocok dengan cutset
func TrimLeft(s, cutset string) stringMemotong prefix ujung kiri string, menghapus substring yang cocok dengan cutset, jika tidak cocok akan mengembalikan string s
func TrimPrefix(s, suffix string) stringMemotong ujung kanan string, menghapus substring yang cocok dengan cutset
func TrimRight(s, cutset string) stringMemotong suffix ujung kanan string, menghapus substring yang cocok dengan cutset, jika tidak cocok akan mengembalikan string s
func TrimSuffix(s, suffix string) stringContoh
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)
PASSString Builder
String Builder lebih hemat memori dibandingkan mengoperasikan string secara langsung.
type Builder struct {
// Field internal tidak diekspos ke luar
}Contoh
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)
PASSTIP
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 valueDi dalamnya terdapat kode seperti berikut
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
func NewReplacer(oldnew ...string) *ReplacerContoh
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.
func NewReader(s string) *ReaderContoh
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