4.17 آموزش stringer

4.17 آموزش stringer

Stringer به طور کلی برای پیاده‌سازی مفهوم شمارشی (enumeration) استفاده می‌شود در حالی که از برنامه‌نویسی ثابت رشته‌های مقدار استفاده نمی‌کند. شمارشی یا enum زمانی استفاده می‌شود که می‌خواهید مجموعه‌ای متناهی و ثابتی از مقادیر یک نوع داده‌ای را تعریف کنید. به عنوان مثال، انواع غذا در منو (پیش غذا، اصلی، دسر)، انواع پوکمون (گیاهی، آبی، آتشی، و غیره).

بنابراین، زمانی که می‌خواهیم از این مجموعه‌های تعریف شده استفاده کنیم، باید از برنامه‌نویسی ثابت رشته‌های مقدار استفاده کنیم زیرا ممکن است به خطاهای انسانی مانند اشتباهات املایی منجر شود. اگر از Stringer استفاده کنیم، مقادیر را یکبار تولید می‌کنیم و مطمئن می‌شویم که هیچ خطایی ایجاد نمی‌شود. پس از آن، می‌توانیم از آن‌ها بدون نگرانی از خطاهای انسانی استفاده کنیم.

4.17.1 پیاده سازی متد String برای آبجکت ها #

شما می توانید برای هر یک از آبجکت ها متد String را پیاده سازی کنید و یک خروجی استرینگ در خصوص مقادیر آبجکت داشته باشید.

به مثال کاربردی زیر توجه کنید:

 1package main
 2
 3import "fmt"
 4
 5type Age int
 6
 7const (
 8	CHILDERN Age = iota
 9	ADOLESCENTS
10	ADULTS
11)
12
13func (a Age) String() string {
14	switch a {
15	case CHILDERN:
16		return "childern"
17	case ADOLESCENTS:
18		return "adolescents"
19	case ADULTS:
20		return "adults"
21	default:
22		return ""
23	}
24}
25
26func main() {
27	fmt.Println(CHILDERN.String())
28}
1$ go run main.go
2childern

در مثال فوق ما یک تایپ Age تعریف کردیم و سپس یکسری enum با همان تایپ قرار دادیم پس از آن متد String را پیاده سازی کردیم که بتوانیم رشته هرکدام از enum ها را بگیریم.

4.17.2 استفاده از ابزار stringer #

شما با استفاده از ابزار stringer می توانید به راحتی برای enum های خود رشته را بصورت خودکار ایجاد کنید.

برای نصب این ابزار در ابتدا باید دستور زیر را بزنید تا داخل go bin نصب شود:

1$ go install golang.org/x/tools/cmd/stringer@latest

اکنون بخواهیم با استفاده از ابزار stringer متد استرینگ جنریت کنیم کافیه مثال زیر توجه کنید:

 1package main
 2
 3import "fmt"
 4
 5//go:generate stringer -type=Age
 6
 7type Age int
 8
 9const (
10	CHILDERN Age = iota
11	ADOLESCENTS
12	ADULTS
13)
14
15func main() {
16	fmt.Println(CHILDERN.String())
17}

در کد فوق ما یک directive comment اضافه کردیم حال کافیه با استفاده از دستور go generate متد استرینگ تایپ را جنریت کنیم.

go generate ./...