کدی که از استانداردهای رایج استفاده می کند، خواندن آسان تر و قابل نگهداری تر است. به دوستان برنامه نویس خود لطف کنید و از ابزارهای قالب بندی داخلی Go استفاده کنید.
قالب بندی کد شما یک راه مهم برای افزایش خوانایی، سازگاری و قابلیت استفاده مجدد آن است. درک، اصلاح و نگهداری کد با فرمت مناسب آسان تر است.
یکی از ویژگی های عالی Go، قراردادهای قالب بندی به خوبی تعریف شده آن است. می توانید از بسته فرمت داخلی و دستور go fmt برای فرمت خودکار کد خود استفاده کنید. این کمک می کند تا اطمینان حاصل شود که دیگر برنامه نویسان Go می توانند آن را تا حد امکان به راحتی بخوانند.
بسته فرمت و فرمان fmt
بسته فرمت قالب بندی استاندارد برای کد منبع Go را پیاده سازی می کند. این بسته با ابزار خط فرمان go format برای انعطاف پذیری در قالب بندی کد Go تعامل دارد.
بسته قالب یک زیر ماژول در بسته go است. در اینجا نحوه وارد کردن آن آمده است:
import "go/format"
می توانید با تعیین دستور help قبل از دستور fmt، اسناد دستور go fmt را مرور کنید:
go help fmt
بعد از دستور fmt یک نام فایل برای فرمت آن فایل مشخص کنید. با این کار فضای خالی و تورفتگی کد شما مطابق با استانداردهای Go تنظیم می شود.
go fmt main.go
در پشت صحنه، go fmt نام مستعار دستور gofmt است، به طور خاص:
gofmt -l -w
این پرچمها باعث میشوند gofmt هر تغییری را در هر فایلی که ارائه میکنید بنویسد و نام فایلهایی را که تغییر میدهد فهرست کند.
می توانید پرچم -x را به دستور fmt اضافه کنید. پرچم -x به نوشتن تغییرات از فرمتکننده به فایل اصلی کمک میکند.
go fmt -x main.go
پرچم -n مشابه -x کار می کند، اما تغییراتی ایجاد نمی کند. در عوض، دستوراتی را نشان می دهد که fmt بدون -n اجرا می شود:
go fmt -n main.go
پرچم به فرمتکننده میگوید که تغییرات را نشان دهد، که به شما اجازه میدهد قبل از اعمال آنها را ابتدا مرور کنید.
در اینجا یک برنامه Go ساده وجود دارد که از بین اعداد صحیح از صفر تا پنج حلقه می زند و رشته “Hello World!” را چاپ می کند.
// formatting a file named main.go as shown in the example above
package main
import "fmt"
func main() {
var x int=5
for i:=0;i<x;i++{
fmt.Println("Hello World!")
}
}
قالببندی کد منبع Go
بسته قالب حاوی یک تابع Source برای قالببندی فایلهای Go از برنامهها است. شما باید فایل را بخوانید و محتویات را به عنوان آرگومان به تابع Source ارسال کنید.
تابع Source محتوای فایل فرمت شده ای را که می توانید در فایل یا فایل جدید بنویسید برمی گرداند.
می توانید فایل ها را با تابع ReadFile بسته ioutil بخوانید. تابع ReadFile نام فایل را می گیرد و محتوای فایل و یک خطا را برای مدیریت برمی گرداند.
fileContent, err := ioutil.ReadFile("main.go")
if err != nil {
log.Fatalln("There was an error reading the file", err)
}
ارسال محتوای فایل به تابع Source، محتوای فایل فرمت شده و یک خطا را برای مدیریت باز می گرداند.
formatted, err := format.Source(fileContent)
if err != nil {
log.Fatalln("There was a formatting error with the source function", err)
}
می توانید محتوای فایل فرمت شده را با تابع WriteFile بسته ioutil در فایل بنویسید. تابع WriteFile نام فایل، محتویات و حالت مجوز فایل را دریافت میکند و هرگونه خطا (خطایی) را برمیگرداند. حالت مجوز تنها زمانی مرتبط است که فایل وجود نداشته باشد، در این صورت WriteFile آن را ایجاد می کند.
حالت مجوز فایل 0644 می دهد:
- مالک فایل مجوزهای خواندن و نوشتن را دارد.
- خواندن مجوزها برای سایر کاربران در همان گروه با مالک.
- بدون مجوز برای سایر کاربران
err = ioutil.WriteFile("main.go", formatted, 0644)
if err != nil {
log.Fatalln("There was an error writing the file", err)
}
همچنین، میتوانید کد منبع Go را برای قالببندی به تابع Source ارسال کنید. می توانید کد را در یک بایت با استفاده از تیک (`) مشخص کنید:
package main
import (
"fmt"
"go/format"
)
func main() {
// simple program that calculates the area of a triangle with the math
// function
formatted, err := format.Source([]byte(`
package main
import(
"fmt"
"math"
)
func main(){
var a float64=3
var b float64=4
var c float64=5
var s float64=(a+b+c)/2
var area float64=math.Sqrt(s*(s-a)*(s-b)*(s-c))
fmt.Println("The area of the triangle is: ",area)
}
`))
if err != nil {
log.Fatalln("There was a formatting error with the source function", err)
} else {
fmt.Println(string(formatted))
}
}
در قالببندی، باید برش بایت را با تابع رشته به رشته تبدیل کنید. در اینجا کد منبع فرمت شده است.
سفارشی کردن فرآیند قالب بندی
میتوانید فرآیند قالببندی را با ساختار پیکربندی بسته قالب سفارشی کنید. ساختار Config شامل فیلدهایی است که می توانید گزینه های قالب را در نمونه سازی مشخص کنید.
import "go/format"
config := &format.Config{
// Tabwidth sets the number of spaces per tab.
Tabwidth: 8,
// UseTabs indicates whether the formatter should use tabs instead of
// spaces.
UseTabs: false,
// TabIndent is used to determine if the initial indentation should be
// done using tabs or spaces.
TabIndent: true,
// NoFinalTab specifies whether a final tab should be removed from
// lines before they are formatted.
NoFinalTab: true,
// Spaces specifies whether spaces should be used for alignment.
Spaces: true,
// NoTrimTrailingSpace specifies whether trailing white space should
// be trimmed from lines before they are formatted.
NoTrimTrailingSpace: false,
}
میتوانید از فیلدها برای سفارشی کردن رفتار قالبکننده خود با تنظیم گزینهها بر اساس نیاز خود استفاده کنید.
سپس می توانید از روش منبع این ساختار برای قالب بندی یک تکه بایت بر اساس پیکربندی خود استفاده کنید.
func main() {
fileContent, err := ioutil.ReadFile("main.go")
// note that this is a Source method of the `config` type, not from the
// `format` package itself although the functionality is the same, you'll
// need to adhere to this if you need to configure the formatter
formatted, err := config.Source(fileContent)
if err != nil {
log.Fatalln("There was a formatting error with the config type", err)
}
ioutil.WriteFile("main.go", formatted, 0644)
}
فراخوانی تابع config.Source() مانند این محتویات فایل main.go را با استفاده از گزینه های پیکربندی فرمت می کند. محتوای فرمت شده را به صورت یک تکه بایت و یک خطا برمی گرداند.
شما می توانید رشته را در Go قالب بندی و دستکاری کنید
بسته فرمت و دستور go fmt می تواند به شما در خودکارسازی فرآیند قالب بندی کد کمک کند.
Go همچنین یک بسته fmt برای قالب بندی رشته و یک بسته رشته برای دستکاری رشته ارائه می دهد.
بسته fmt I/O با فرمت سادهتر را با توابع مشابه با توابع printf و scanf در C پیادهسازی میکند. تابع رشته ها توابع ساده ای را برای دستکاری رشته های رمزگذاری شده UTF-8 پیاده سازی می کند.