Bir Go string'i değiştirilemez bir bayt dizisidir, normalde UTF-8 metin. Operatörler string'in kendisi üzerinde çalışır (+, ==, <, indeksleme, dilimleme); geri kalan her şey standart strings paketindedir.
String'leri Bölmek
| Fonksiyon | Neye göre böler | Notlar |
|---|---|---|
Split(s, sep) | her sep | boş parçaları tutar; Split("", ","), tek bir boş string olan [""] döndürür |
SplitN(s, sep, n) | en fazla n parça | son parça geri kalanı tutar |
SplitAfter(s, sep) | her sep | ayırıcıyı her parçada tutar |
Fields(s) | boşluk dizileri | asla boş parça döndürmez |
FieldsFunc(s, f) | f'nin true olduğu karakterler | özel ayırıcılar |
Cut(s, sep) | yalnızca ilk sep | öncesi, sonrası, bulundu döndürür (Go 1.18) |
Split("", ",") durumu insanları yakalar: boş bir girdi uzunluğu 0 değil 1 olan bir slice verir. Kullanıcı girdisini bölerken Fields ya da önce s == "" kontrolü, hayalet bir boş elemandan kaçınır.
strings.Cut, key=value, user@host ve benzeri çiftleri bölmenin en temiz yoludur. Go 1.24 ayrıca parçaları bir slice oluşturmadan tek tek veren iterator sürümlerini, strings.SplitSeq ve strings.FieldsSeq'i ekledi.
Arama
| Fonksiyon | Döndürdüğü |
|---|---|
Contains(s, sub) | sub s içinde geçiyorsa true |
ContainsAny(s, chars) | chars'ın herhangi bir karakteri geçiyorsa true |
HasPrefix(s, p) / HasSuffix(s, p) | s p ile başlıyor ya da bitiyorsa true |
Index(s, sub) | ilk eşleşmenin bayt konumu ya da -1 |
LastIndex(s, sub) | son eşleşmenin bayt konumu ya da -1 |
Count(s, sub) | çakışmayan eşleşme sayısı |
EqualFold(a, b) | büyük/küçük harf duyarsız eşitlik |
EqualFold dışındaki her arama büyük/küçük harfe duyarlıdır. Duyarsız arama için iki tarafı da küçük harfe çevirin ya da tüm string karşılaştırmaları için EqualFold kullanın.
Dönüştürmek
Bir tuzak: Trim, TrimLeft ve TrimRight bir önek değil bir karakter kümesi alır. strings.TrimLeft("abcab", "ab") baştaki her a ve b'yi kaldırır ve "cab" döndürür. Tam bir öneki ya da soneki kaldırmak için TrimPrefix ve TrimSuffix kullanın.
Birleştirme ve strings.Builder
+ string'leri birleştirir, fmt.Sprintf ise değerleri tek bir string'e biçimlendirir. İkisi de her seferinde yeni bir string ayırır, çünkü string'ler değiştirilemezdir. Bu, bir avuç işlem için sorun değildir ama her +='in o ana kadar oluşturulan her şeyi kopyaladığı bir döngüde yavaştır. Bunun yerine strings.Builder kullanın:
Sıfır değerli bir strings.Builder kullanıma hazırdır. io.Writer'ı gerçekleştirir, bu yüzden fmt.Fprintf doğrudan ona yazar. Sonucun kabaca ne kadar büyük olacağını biliyorsanız önce b.Grow(n) çağırın. Bir Builder'ı ona yazdıktan sonra kopyalamayın; bir pointer aktarın.
Çok Satırlı ve Ham String'ler
Go'da iki tür string literal'i vardır:
Çift tırnaklı string'ler kaçış dizilerini (\n, \t, \", \\, \u00e9) işler ve tek satıra sığmalıdır. Ters tırnaklı ham string'ler yeni satırlar dahil her şeyi olduğu gibi alır; bu da onları çok satırlı string'ler, düzenli ifadeler, JSON ve Windows yolları yazmanın yolu yapar. Ham bir string ters tırnak içeremez ve içindeki carriage return karakterleri atılır. Yukarıdaki sorgunun bir yeni satırla başladığına dikkat edin, çünkü literal açılış ters tırnağından hemen sonra başlar.
Uzunluk, İndeksleme ve Alt String'ler
len(s) bayt sayısıdır. s[i] bir bayttır, s[i:j] ise bayt konumlarına göre bir alt string'dir:
ï ve é ikişer bayt tutar, bu yüzden string 12 bayt ve 10 karakterdir. Konumlar karakter sınırlarında bayt konumları döndüren strings.Index ya da benzerlerinden geldiği sürece baytlara göre dilimlemek güvenlidir. "İlk n karakteri" almak için önce []rune'a dönüştürün. Runes and bytes sayfası UTF-8'i derinlemesine açıklıyor.
String'ler Değiştirilemezdir
Bir baytı yerinde değiştiremezsiniz: s[0] = 'H' bir derleme hatasıdır (cannot assign to s[0] (neither addressable nor a map index expression)). strings içindeki her fonksiyon yeni bir string döndürür. Düzenlemek için []byte ya da []rune'a dönüştürün, slice'ı değiştirin ve geri dönüştürün:
b := []byte("hello")
b[0] = 'H'
s := string(b) // "Hello"
Alt string'lerin ucuz olmasının nedeni de değiştirilemezliktir: s[2:5] kopyalamak yerine belleği s ile paylaşır. Öbür yüzü, devasa bir string'in küçük bir alt string'inin tüm devasa string'i canlı tutmasıdır. Büyük bir girdinin kısa bir parçasını tuttuğunuzda strings.Clone (Go 1.20) kullanın.
String'leri Karşılaştırmak
== ve != içeriği karşılaştırır, < ve > ise bayt bayt karşılaştırır; bu da ASCII için alfabetiktir. strings.Compare vardır ama nadiren gerekir; bir []string üzerinde slices.Sort < kullanır. İngilizce olmayan metnin yerel ayara duyarlı sıralaması için golang.org/x/text/collate kullanın.
Diğer Tipleri Dönüştürmek
Sayılar strconv.Itoa, strconv.FormatFloat ya da fmt.Sprintf ile string'e, string'ler ise strconv.Atoi ve strconv.ParseFloat ile sayıya dönüşür. string(42) yazmayın: kod noktası 42 olan karakteri, "*"'ı üretir. Tam tablo tip dönüşümü sayfasında.
Sıkça Sorulan Sorular
Go'da bir string nasıl bölünür?
strings.Split(s, sep) kullanın: strings.Split("a,b,c", ","), ["a" "b" "c"] döndürür. Herhangi bir boşluk dizisinde bölüp boş parçaları atmak için strings.Fields(s) kullanın. strings.SplitN parça sayısını sınırlar, strings.Cut ise ilk ayırıcının etrafında bir kez böler.
Go'da çok satırlı string nasıl yazılır?
Ters tırnak içinde ham bir string literal'i kullanın:
query := `SELECT id, name
FROM users
WHERE active = true`
Ters tırnaklar arasındaki her şey, yeni satırlar ve ters eğik çizgiler dahil, olduğu gibi alınır. Ham bir string ters tırnak içeremez.
Go'da bir string'in bir alt string içerip içermediği nasıl kontrol edilir?
strings.Contains(s, substr) bir bool döndürür. İlgili fonksiyonlar: strings.HasPrefix, strings.HasSuffix, strings.Index (konum ya da -1), strings.ContainsAny (bir karakter kümesinden herhangi biri) ve büyük/küçük harf duyarsız eşitlik için strings.EqualFold.
Go'da string birleştirmenin en hızlı yolu nedir?
Birkaç string için + yeterlidir. Bir döngüde string oluştururken strings.Builder kullanın: WriteString'i tekrar tekrar, String()'i sonda bir kez çağırın. Döngüde tekrarlanan += her seferinde tüm string'i kopyalar, bu yüzden string büyüdükçe yavaşlar. Bir slice'ı bir ayırıcıyla birleştirmek için strings.Join kullanın.
len neden string'im için yanlış uzunluk döndürüyor?
len(s) karakter sayısını değil bayt sayısını döndürür. Go string'leri UTF-8'dir; ASCII dışındaki karakterler 2 ila 4 bayt tutar, bu yüzden len("héllo") 6'dır. Unicode kod noktası sayısı için utf8.RuneCountInString(s) kullanın.