Menu

Golang String'ler: Split, Join, Contains, Replace ve Fazlası

Go'da string'lerle çalışmak: strings paketi (Split, Join, Contains, Replace, Fields, TrimSpace, ToUpper), strings.Builder ile verimli string oluşturmak, çok satırlı ham string'ler, değiştirilemezlik ve len'in neden bayt saydığı.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

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

FonksiyonNeye göre bölerNotlar
Split(s, sep)her sepboş parçaları tutar; Split("", ","), tek bir boş string olan [""] döndürür
SplitN(s, sep, n)en fazla n parçason parça geri kalanı tutar
SplitAfter(s, sep)her sepayırıcıyı her parçada tutar
Fields(s)boşluk dizileriasla 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

FonksiyonDö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.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA