這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
renderer是Go語言的一個簡單的、輕量的、快速響應的呈現包,它可以支援JSON、JSONP、XML、HYAML、HTML、File等類型的響應。在開發web應用或RESTFul API的時候,這個包是非常方便的toolkit。
本文繞開如何使用它,深入到代碼實現中研究它,同時也嘗嘗Go語言套件的開發套路。
Go包基本結構體
package pkgnameimport ( "fmt" ...)const ( CONST1 typeX = xx ...)var ( VAR1 typeX = xxx ...)func Fn1() {}
在Go語言中包名和目錄名保持一致,同一包內可共用命名空間。
- 包檔案開頭除了注釋外,第一行,必須是package pkgname, 聲明包的名稱。
- 在包聲明之後,可以import標準庫中的包和其他外部包。
- 然後可以定義包常量、包變數(暴露變數和非暴露變數,以首字母大小寫來區分實現)。
- 然後定義自訂類型、函數或方法。
import語句
import可以引入標準庫的包,也可以引入外部包。Go語言中一旦引入某個包,必須在程式中使用到這個包的命名空間,否則編譯報錯會告訴你引入了某個包,但代碼中未曾使用。
當然你也會有疑問,我如果需要引入包,但又不想使用怎麼辦。這個Go語言有一個特殊的符號"_", 放在引入包名前面,就可以防止編譯報錯。為什麼會有這種考慮呢? 因為有時候,我們只是希望引入一個包,然後執行這個包的一些初始化設定。然後在代碼中暫時不使用該包的任何方法和變數。
import ( _ "gitHub.com/xxxxx/pkgname")
上面語句會引入pkgname命名空間,但是暫時不在代碼中使用這個命名空間。這樣引入之後,會在pkgname包中尋找init()函數,然後在main()函數執行之前先執行它們,這點對於需要使用包之前做初始化非常有用。
暴露與非暴露的實現
我們在其他程式設計語言中,都接觸過private, protected, public之類的修飾符。 但是在Go語言中完全沒有這些,但是Go語言還是可以某些東西從包中暴露出去,而某些東西不暴露出去,它用的原則很簡單的,就是標識符如果以小寫字母開頭的,包外不可見; 而如果是標識符以大寫字元開頭的,包外可見,可訪問。
對於暴露變數和函數(方法)非常直觀簡單,但是如果是暴露的結構體,情況稍微複雜一點。 不過本質上也是差不多, 結構體外部如果小寫字母開頭,內部屬性大寫字母開頭。 則外部包直接不訪問,但如果通過函數或方法返回這個外部類型,那麼可以通過:=得到這個外部類型,從而可以訪問其內部屬性。舉例如下:
// package pkgnamepackage pkgnametype admin struct { Name string Email String}func Admin() *admin { return &admin{ Name: "admin", Email: "admin@email.com", }}
那麼我們在外部包中,可以直接通過下面代碼訪問admin結構體內部的屬性:
admin := pkgname.Admin()fmt.Println(admin.Name, admin.Email)
當然這種情況下,需要你事Crowdsourced Security Testing道admin的結構以及包含的屬性名稱。