1.15 قالب بندی رشته‌ها

1.15 قالب بندی رشته‌ها

در زبان گو مانند سایر زبان‌ها یکسری عناوین برای قالب‌بندی رشته وجود دارد که برخی از این عناوین مشترک بین همه زبان‌ها هست و برخی مختص زبان گو.

1.15.1 قالب بندی با توابع Printf و Sprintf #

زمانیکه شما از تابع Printf یا Sprintf استفاده می‌کنید می‌توانید رشته خروجی را با استفاده از پارامترهای بعد از رشته قالب‌بندی کنید، و در نهایت به‌صورت یک رشته نمایش دهید.

1fmt.Printf("{{Verb}}", value1, value2, value3, ..., valueN)
1fmt.Sprintf("{{Verb}}", value1, value2, value3, ..., valueN)

توجه کنید هر دو تابع فوق خیلی کاربردی و پر استفاده هستند. این ۲ تابع کارکردشان مشترک است ولی خروجی متفاوتی دارند.

به عنوان مثال :

  • شما با استفاده از Printf می‌توانید یک رشته را قالب‌بندی کنید و در نهایت به عنوان خروجی چاپ کنید.
  • ولی با استفاده از Sprintf می‌توانید یک رشته را قالب‌بندی کنید و در نهایت به جای اینکه مقدار خروجی را چاپ کنید، اون رو داخل یک متغیر قرار بریزید. به مثال زیر توجه کنید:
1x := fmt.Sprintf("age %s is %d years", "Javad", 30)

1.15.1.1 قالب‌بندی یک slice #

Verbfmt.Printf("{{Verb}}", []int64{0, 1}) خروجیتوضیحات
%v[0 1]فرمت پیش‌فرض
%#v[]int64{0, 1}قالب‌بندی کد گو
%T[]int64تایپ مقدار
توجه کنید v% یکی از پرکاربرد‌ترین Verb‌ها در گولنگ است و مواقعی مورد استفاده قرار می‌گیرد که شما قصد دارید یک مقدار را داخل رشته بزارید، ولی از تایپ اون مقدار خبر ندارید.

1.15.1.2 قالب‌بندی اعداد صحیح #

Verbfmt.Printf("{{Verb}}", 15) خروجیتوضیحات
%d15عدد پایه ۱۰
%+d+15نمایش + در کنار عدد
%4d␣␣15۴ کارکتر با فاصله از راست
%-4d15␣␣۴ کارکتر با فاصله از چپ
%04d0015نمایش عدد با پیشوند صفر
%b1111عدد با پایه باینری
%o17عدد با پایه ۸ اکتال
%xfعدد با پایه ۱۶ هگز حروف کوچک
%XFعدد با پایه ۱۶ هگز حروف بزرگ
%#x0xfعدد با پایه ۱۶ هگز به همراه 0x

1.15.1.3 قالب‌بندی اعداد اعشاری #

Verbfmt.Printf("{{Verb}}", 123.456) خروجیتوضیحات
%e1.234560e+02نمایش بصورت نماد عملی
%f123.456000نقطه اعشاری، بدون نما. دقت پیش فرض 6 است
%.2f123.46عرض پیش فرض، دقت 2 رقم بعد از نقطه اعشار
%8.2f␣␣123.46عرض 8 کاراکتر، دقت 2 رقم بعد از نقطه اعشار. کاراکتر پیش‌فرض padding space است
%08.2f00123.46عرض 8 کاراکتر، دقت 2 رقم بعد از نقطه اعشار. لایه سمت چپ با نویسه مشخص شده (اینجا، 0)
%g123.456نما در صورت نیاز، فقط ارقام ضروری

1.15.1.4 قالب‌بندی کارکترها #

Verbfmt.Printf("{{Verb}}", 'A') خروجیتوضیحات
%cAکارکتر
%q"A"کارکتر به همراه دابل کوتیشن
%UU+0041یونیکد
%#UU+0041 'A'یونیکد به همراه کارکتر

1.15.1.5 قالب‌بندی رشته (string) و slice بایت #

Verbfmt.Printf("{{Verb}}", "gophers") خروجیتوضیحات
%sgophersرشته ساده
%8s␣␣gophersبا ۸ پدینگ راست چین شده
%-8sgophers␣␣با ۸ پدینگ چپ چین شده
%q"gophers"رشته به همراه دابل کوتیشن
%x676f7068657273خروجی هگز مقدار
% x67 6f 70 68 65 72 73خروجی هگز مقدار با فاصله

1.15.1.6 قالب‌بندی بولین #

Verbfmt.Printf("{{Verb}}", true) خروجیتوضیحات
%ttrueنمایش مقدار بولین در رشته

1.15.1.6 قالب‌بندی اشاره‌گر (pointer) #

Verbfmt.Printf("{{Verb}}", new(int)) خروجیتوضیحات
%p0xc0000b2000نمایش آدرس حافظه با پایه ۱۶ به همراه 0x

1.15.2 مقادیر خاص در رشته #

همانطور که گفتیم زبان گو یکسری کارکترهای خاص دارد که باعث تغییراتی در خروجی رشته خواهد شد و این کارکترهای خاص بین همه زبان‌ها مشترک هستند. در ادامه لیست این کاراکتر‌ها را آورده‌ایم:

Verbتوضیحات
\aU+0007 هشدار یا زنگ
\bU+0008 بک اسپیس backspace
\\U+005c بک اسلش backslash
\tU+0009 تب بصورت افقی
\nU+000A خط جدید
\fU+000C حالت فرم
\rU+000D حالت برگشت
\vU+000b تب بصورت عمودی
%%نمایش درصد برای حالت‌های خاص نظیر fmt.Printf("%05.2f%%", math.Pi)

1.15.3 پکیج strings و متد های پر کاربرد آن #

برای کار با رشته ها، یکی از پکیج های پرکاربرد strings است که به‌صورت built-in در گولنگ وجود دارد. در این قسمت با برخی از متد های این پکیج آشنا می شویم.

1.15.3.1 متد Contains و ContainsAny #

با استفاده از این دو متد می توانید چک کنید که در رشته مدنظر شما، آن چیزی که می خواهید وجود دارد یا نه. فرق بین Contains و ContainsAny در این است که Contains باید دقیقا همان الگویی که داده اید داخل رشته پیدا شود اما ContainsAny حتی اگر یکی از کاراکتر ها وجود داشته باشد true بر میگرداند.

 1package main
 2
 3import (
 4	"fmt"
 5	"strings"
 6)
 7
 8func main() {
 9
10	text := "Go will make you love programming again. We promise"
11
12	fmt.Println(strings.Contains(text, "Golang"))
13	fmt.Println(strings.ContainsAny(text, "Golang"))
14}

پس از اجرای کد. خروجی زیر را مشاهده می کنید.

1$ go run main.go
2Result:
3false
4true

1.15.3.2 متد Count #

با استفاده از این متد، می توانید تعداد تکرار یک الگو را بدست بیاورید. Count نسبت به بزرگ و کوچک بودن کلمات حساس است.

 1package main
 2
 3import (
 4	"fmt"
 5	"strings"
 6)
 7
 8func main() {
 9
10	text := "Golang go Go will make you love programming again. We promise"
11
12	fmt.Println(strings.Count(text, "Go"))
13}

پس از اجرای کد. خروجی زیر را مشاهده می کنید.

1$ go run main.go
2Result:
32

1.15.3.3 متد Index و LastIndex #

با استفاده از متد های Index می توانیم اندیس قرارگرفتن کاراکتر مدنظر را پیدا کنیم. فرق بین Index و LastIndex این است که متد Index اولین کاراکتری که پیدا می کند اندیسش را برمیگرداند، اما LastIndex آخرین کاراکتری که پیدا می کند.

 1package main
 2
 3import (
 4	"fmt"
 5	"strings"
 6)
 7
 8func main() {
 9
10	text := "Go will make you love programming again. We promise"
11
12	fmt.Println(strings.Index(text, "o"))
13	fmt.Println(strings.LastIndex(text, "o"))
14}

پس از اجرای کد. خروجی زیر را مشاهده می کنید.

1$ go run main.go
2Result:
31
446

1.15.3.4 متد Split #

با استفاده از متد Split می توانیم یک رشته را بر اساس یک الگویی(برای مثال space) تکه تکه کنیم. خروجی این متد یک slice از جنس string است.

 1package main
 2
 3import (
 4	"fmt"
 5	"strings"
 6)
 7
 8func main() {
 9	text := "Go will make you love programming again. We promise"
10
11	textSlice := strings.Split(text, " ")
12	for _, item := range textSlice {
13		fmt.Println(item)
14	}
15}

پس از اجرای کد. خروجی زیر را مشاهده می کنید.

 1$ go run main.go
 2Result:
 3Go
 4will
 5make
 6you
 7love
 8programming
 9again.
10We
11promise

1.15.3.5 متد Join #

با Join می توانیم المنت های یک اسلایس از جنس string را با یک الگویی به یکدیگر بچسبانیم و در خروجی یک string از المنت های داخل اسلایس بدست بیاوریم. در این مثال text قبلی را که با Split تکه تکه کردیم و داخل textSlice ریختیم، با Join تبدیل به text می کنیم.

 1package main
 2
 3import (
 4	"fmt"
 5	"strings"
 6)
 7
 8func main() {
 9	// array of strings
10    	textSlice := []string{"Go", "will", "make", "you", "love", "programming", "again.", "We", "promise"} 
11  
12    	// joining the string by separator 
13    	fmt.Println(strings.Join(textSlice, " ")) 
14}

پس از اجرای کد. خروجی زیر را مشاهده می کنید.

1$ go run main.go
2Result:
3Go will make you love programming again. We promise

1.15.3.6 متد HasPrefix و HasSuffix #

با استفاده از HasPrefix می توانیم چک کنیم که اول رشته با چیزی که ما می خواهیم شروع شده است یا خیر. با HasSuffix می توانیم چک کنیم که اتمام رشته با آن چیزی که ما می خواهیم هست یا خیر.

 1package main
 2
 3import (
 4	"fmt"
 5	"strings"
 6)
 7
 8func main() {
 9	text := "Go will make you love programming again. We promise"
10
11	fmt.Println("HasPrefix Go:", strings.HasPrefix(text, "Go"))
12	fmt.Println("HasPrefix se:", strings.HasPrefix(text, "se"))
13
14	fmt.Println("HasSuffix se:", strings.HasSuffix(text, "se"))
15	fmt.Println("HasSuffix Go:", strings.HasSuffix(text, "Go"))
16}

پس از اجرای کد. خروجی زیر را مشاهده می کنید.

1$ go run main.go
2Result:
3HasPrefix Go: true
4HasPrefix se: false
5HasSuffix se: true
6HasSuffix Go: false

متد های پرکاربرد دیگری مانند Replace, ReplaceAll برای جاگزین کردن. متد های Compare و EqualFold برای مقایسه بین دو رشته. متد های Trim, TrimLeft, TrimRight برای حذف کردن کاراکتر های اضافی از اول و آخر رشته و … نیز وجود دارند که پیشنهاد می کنم حتما مطالعه کنید.