در زبان گو مانند سایر زبانها یکسری عناوین برای قالببندی رشته وجود دارد که برخی از این عناوین مشترک بین همه زبانها هست و برخی مختص زبان گو.
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 #
Verb | fmt.Printf("{{Verb}}", []int64{0, 1}) خروجی | توضیحات |
---|---|---|
%v | [0 1] | فرمت پیشفرض |
%#v | []int64{0, 1} | قالببندی کد گو |
%T | []int64 | تایپ مقدار |
توجه کنید v%
یکی از پرکاربردترین Verbها در گولنگ است و مواقعی مورد استفاده قرار میگیرد که شما قصد دارید یک مقدار را داخل رشته بزارید، ولی از تایپ اون مقدار خبر ندارید.
1.15.1.2 قالببندی اعداد صحیح #
Verb | fmt.Printf("{{Verb}}", 15) خروجی | توضیحات |
---|---|---|
%d | 15 | عدد پایه ۱۰ |
%+d | +15 | نمایش + در کنار عدد |
%4d | ␣␣15 | ۴ کارکتر با فاصله از راست |
%-4d | 15 ␣␣ | ۴ کارکتر با فاصله از چپ |
%04d | 0015 | نمایش عدد با پیشوند صفر |
%b | 1111 | عدد با پایه باینری |
%o | 17 | عدد با پایه ۸ اکتال |
%x | f | عدد با پایه ۱۶ هگز حروف کوچک |
%X | F | عدد با پایه ۱۶ هگز حروف بزرگ |
%#x | 0xf | عدد با پایه ۱۶ هگز به همراه 0x |
1.15.1.3 قالببندی اعداد اعشاری #
Verb | fmt.Printf("{{Verb}}", 123.456) خروجی | توضیحات |
---|---|---|
%e | 1.234560e+02 | نمایش بصورت نماد عملی |
%f | 123.456000 | نقطه اعشاری، بدون نما. دقت پیش فرض 6 است |
%.2f | 123.46 | عرض پیش فرض، دقت 2 رقم بعد از نقطه اعشار |
%8.2f | ␣␣123.46 | عرض 8 کاراکتر، دقت 2 رقم بعد از نقطه اعشار. کاراکتر پیشفرض padding space است |
%08.2f | 00123.46 | عرض 8 کاراکتر، دقت 2 رقم بعد از نقطه اعشار. لایه سمت چپ با نویسه مشخص شده (اینجا، 0) |
%g | 123.456 | نما در صورت نیاز، فقط ارقام ضروری |
1.15.1.4 قالببندی کارکترها #
Verb | fmt.Printf("{{Verb}}", 'A') خروجی | توضیحات |
---|---|---|
%c | A | کارکتر |
%q | "A" | کارکتر به همراه دابل کوتیشن |
%U | U+0041 | یونیکد |
%#U | U+0041 'A' | یونیکد به همراه کارکتر |
1.15.1.5 قالببندی رشته (string) و slice بایت #
Verb | fmt.Printf("{{Verb}}", "gophers") خروجی | توضیحات |
---|---|---|
%s | gophers | رشته ساده |
%8s | ␣␣gophers | با ۸ پدینگ راست چین شده |
%-8s | gophers ␣␣ | با ۸ پدینگ چپ چین شده |
%q | "gophers" | رشته به همراه دابل کوتیشن |
%x | 676f7068657273 | خروجی هگز مقدار |
% x | 67 6f 70 68 65 72 73 | خروجی هگز مقدار با فاصله |
1.15.1.6 قالببندی بولین #
Verb | fmt.Printf("{{Verb}}", true) خروجی | توضیحات |
---|---|---|
%t | true | نمایش مقدار بولین در رشته |
1.15.1.6 قالببندی اشارهگر (pointer) #
Verb | fmt.Printf("{{Verb}}", new(int)) خروجی | توضیحات |
---|---|---|
%p | 0xc0000b2000 | نمایش آدرس حافظه با پایه ۱۶ به همراه 0x |
1.15.2 مقادیر خاص در رشته #
همانطور که گفتیم زبان گو یکسری کارکترهای خاص دارد که باعث تغییراتی در خروجی رشته خواهد شد و این کارکترهای خاص بین همه زبانها مشترک هستند. در ادامه لیست این کاراکترها را آوردهایم:
Verb | توضیحات |
---|---|
\a | U+0007 هشدار یا زنگ |
\b | U+0008 بک اسپیس backspace |
\\ | U+005c بک اسلش backslash |
\t | U+0009 تب بصورت افقی |
\n | U+000A خط جدید |
\f | U+000C حالت فرم |
\r | U+000D حالت برگشت |
\v | U+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.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.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.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.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.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 برای حذف کردن کاراکتر های اضافی از اول و آخر رشته و … نیز وجود دارند که پیشنهاد می کنم حتما مطالعه کنید.