GoFrame v0.99.682 beta 釋出,更強大的 Go Web 框架

類別: IT

GoFrame v0.99.682 beta 釋出了。GF(Go Frame)是一款模組化、鬆耦合、輕量級、高效能的Go語言Web開發框架。支援熱重啟、熱更新、多域名、多埠、多服務、HTTP/HTTPS、動態路由等特性,並提供了Web服務開發的系列核心元件,如:Router、Cookie、Session、服務註冊、配置管理、模板引擎、資料校驗、分頁管理、資料庫ORM等等等等,並且提供了數十個實用開發模組集,如:快取、日誌、時間、命令列、二進位制、檔案鎖、物件池、連線池、資料編碼、程式管理、程式通訊、TCP/UDP元件、併發安全容器、Goroutine池等等等等等等。

新特性:

  • 新增gdes包,用於DES加密/加密演算法處理;

  • 新增gkafka包,kafka的golang客戶端;

  • 新增gpool物件複用池,比較於標準庫的sync.Pool更加靈活強大,可自定義物件的快取時間、建立方法、銷燬方法(http://gf.johng.cn/686654);

  • 完成網路通訊gtcp/gudp包的重構,並進行了大量的改進工作,新增了詳盡的開發文件及示例程式碼(http://gf.johng.cn/494382);

  • 增加gring併發安全環,標準庫container/ring包的併發安全版本,並做了易用性的封裝(http://gf.johng.cn/686655);

  • gtime包新增了自定義日期格式話的支援,格式化語法類似PHP的date語法(http://gf.johng.cn/494387);

  • gdb增加除錯模式特性,使用SetDebug方法實現,在除錯模式下可以獲取詳細的SQL執行記錄,增加了詳細的開發文件及示例程式碼(http://gf.johng.cn/702801);

  • gdb增加查詢快取特性,使用Cache方法實現,增加了詳細的開發文件及示例程式碼(http://gf.johng.cn/702801);

  • ghttp.Server路由功能增加欄位匹配規則特性,支援如:/order/list/{page}.html 動態路由規則特性(http://gf.johng.cn/702766);

  • gpage分頁包增加分頁URL規則生成模板特性,內部可使用{.page}變數指定頁碼位置(http://gf.johng.cn/716438);

  • 增加gmap.Map物件,這是gmap.InterfaceInterfaceMap的別名;

新功能:

  • gdb增加MaxIdleConnCount/MaxOpenConnCount/MaxConnLifetime三項配置,並增加SetMaxConnLifetime方法;

  • ghttp.Client增加HTTP賬號密碼設定功能(SetBasicAuth);

  • glog新增對系統換行符號的自適配調整(\n|\r\n);

  • 增加glog控制檯除錯模式列印開關(SetDebug);

  • gcfg增加SetFileName方法設定預設讀取的配置檔名稱;

  • gcfg/gjson/gparser包新增Int8/16/32/64,Uint8/16/32/64方法;

  • 增加gzip方法的封裝(Zip/Unzip);

  • gview增加模板變數分隔符設定方法SetDelimiters;

  • ghttp.Response增加Writef、Writefln方法;

功能改進:

  • 改進gfilepool檔案指標池設計;改進gfile文字內容寫入,增加指標池使用

  • gdb包增加除錯模式特性,並支援在除錯模式下獲得已執行的SQL列表結果

  • 改進gproc程式間通訊機制,增加程式訊息分組特性,並限定佇列大小

  • gdb結果方法處理增加ToXml/ToJson方法

  • gregx包名修改為gregex

  • 改進gtime.StrToTime方法,新增對常見標準時間日期的自動轉換,以及對時區的自動識別支援,並調整gconv,gvalid對該包的引用

  • 增加對字符集轉換的封裝,gxml包中使用新增的字符集轉換包來做處理

  • ghttp.Server.EnableAdmin頁面Restart介面支援GET引數newExeFilePath支援

  • ghttp.Server平滑重啟機制增加可自定義重啟可執行檔案路徑,特別是針對windows系統特別有用(因為windows下不支援可執行檔案覆蓋更新)

  • 改進ghttp.Server靜態檔案檢索設計,增加開發環境時的main包原始碼目錄查詢機制;改進gcfg/gview的main包原始碼目錄查詢機制

  • 優化gcache設計,LRU特性非預設開啟;優化gtype/gcache基準測試指令碼;新增gregx基準測試指令碼,改進設計,提升效能

  • gfile包增加GoRootOfBuild方法,用於獲取編譯時的GOROOT數值;並改進glog包中backtrace的GOROOT路徑過濾處理;

  • 改進grpool程式碼質量,並改進對池化goroutine數量的限制設計

  • 改進gdb.Map/List及g.Map/List的型別定義,改用別名特性以便支援原生型別輸入(map/slice),並修復gdb.Model.Update方法引數處理問題

  • 調整ghttp包示例程式碼目錄結構,增加ghttp.Client自定義Header方法,ghttp.Cookie增加Map方法用於獲得客戶端提交的所有cookie值,構造成map返回

  • 刪除gcharset中的getcharset方法

  • 去掉gmap中常用的基本資料型別轉換獲取方法

  • 改進gconv.String方法,當無法使用基本型別進行字串轉換時,使用json.Marshal進行轉換

  • gvalid.CheckObject方法名稱修改為gvalid.CheckStruct

問題修復:

  • 修正gstr.IsNumeric錯誤

  • 修復當xml中encoding字符集為非UTF-8字符集時報錯的問題

  • 修正gconv包float32->float64精度問題

  • 修復gpage包分頁計數問題

  • 修復gdb批量資料Save錯誤

  • 去掉gpool中math.MAXINT64常量的使用,以修復int64到int型別的轉換錯誤,相容32位系統

  • 修正ghttp包沒有使用Server仍然初始化相關非同步goroutine的問題

安裝

go get -u gitee.com/johng/gf

限制

golang版本 >= 1.9.2

特點

  1. 輕量級、高效能,模組化、鬆耦合設計,豐富的開發模組;

  2. 熱重啟、熱更新特性,並支援Web介面及命令列管理介面;

  3. 專業的技術交流群,完善的開發文件及示例程式碼,良好的中文化支援;

  4. 支援多種形式的服務註冊特性,靈活高效的路由控制管理;

  5. 支援服務事件回撥註冊功能,可供選擇的pprof效能分析模組;

  6. 支援配置檔案及模板檔案的自動檢測更新機制,即修改即生效;

  7. 支援自定義日期時間格式的時間模組,類似PHP日期時間格式化;

  8. 強大的資料/表單校驗模組,支援常用的40種及自定義校驗規則;

  9. 強大的網路通訊TCP/UDP元件,並提供TCP連線池特性,簡便高效;

  10. 提供了對基本資料型別的併發安全封裝,提供了常用的資料結構容器;

  11. 支援Go變數/Json/Xml/Yml/Toml任意資料格式之間的相互轉換及建立;

  12. 強大的資料庫ORM,支援應用層級的叢集管理、讀寫分離、負載均衡,查詢快取、方法及鏈式ORM操作;

  13. 更多特點請查閱框架手冊原始碼

文件

GoFrame開發文件:http://gf.johng.cn

使用

Hello World

package mainimport (    "gitee.com/johng/gf/g"    "gitee.com/johng/gf/g/net/ghttp")func main() {    s := g.Server()    s.BindHandler("/", func(r *ghttp.Request) {        r.Response.Write("Hello World")    })    s.Run()}

多域名支援

package mainimport (    "gitee.com/johng/gf/g"    "gitee.com/johng/gf/g/net/ghttp")func main() {    s := g.Server()    s.Domain("localhost1,localhost2").BindHandler("/", func(r *ghttp.Request) {        r.Response.Write("localhostx")    })    s.Run()}

多埠支援

package mainimport (    "gitee.com/johng/gf/g"    "gitee.com/johng/gf/g/net/ghttp")func main() {    s := g.Server()    s.BindHandler("/", func(r *ghttp.Request){        r.Response.Writeln("go frame!")    })    s.SetPort(8080, 8081, 8082)    s.Run()}

路由控制

package mainimport (    "gitee.com/johng/gf/g"    "gitee.com/johng/gf/g/net/ghttp")func main() {    s := g.Server()    s.BindHandler("/order/:action/{page}.html", func(r *ghttp.Request){        r.Response.Writef("action:%s, page:%s", r.Get("action"), r.Get("page"))    })    s.SetPort(8199)    s.Run()}

資料庫ORM

ORM建立/關閉

// 獲取預設配置的資料庫物件(配置名稱為"default")db, err := gdb.New()// 獲取配置分組名稱為"user-center"的資料庫物件db, err := gdb.New("user-center")// 關閉資料庫操作物件(丟回連線池物件複用)db.Close()

單表/聯表查詢

// 查詢多條記錄並使用Limit分頁r, err := db.Table("user").Where("u.uid > ?", 1).Limit(0, 10).Select()// 查詢符合條件的單條記錄(第一條)r, err := db.Table("user u").LeftJoin("user_detail ud", "u.uid=ud.uid").Fields("u.*,ud.site").Where("u.uid=?", 1).One()// 查詢指定欄位值r, err := db.Table("user u").RightJoin("user_detail ud", "u.uid=ud.uid").Fields("ud.site").Where("u.uid=?", 1).Value()// 分組及排序r, err := db.Table("user u").InnerJoin("user_detail ud", "u.uid=ud.uid").Fields("u.*,ud.city").GroupBy("city").OrderBy("register_time asc").Select()// 不使用john的聯表查詢r, err := db.Table("user u,user_detail ud").Where("u.uid=ud.uid").Fields("u.*,ud.city").All()// 不使用Fields方法指定查詢欄位時,預設查詢為"*"r, err := db.Table("user").Where("u.uid=1",).One()

更新/刪除

// 更新r, err := db.Table("user").Data(gdb.Map{"name" : "john2"}).Where("name=?", "john").Update()r, err := db.Table("user").Data("name='john3'").Where("name=?", "john2").Update()// 刪除r, err := db.Table("user").Where("uid=?", 10).Delete()// Data數值方法的引數形式比較靈活r, err := db.Table("user").Data(`name="john"`).Update()r, err := db.Table("user").Data("name", "john").Update()r, err := db.Table("user").Data(g.Map{"name" : "john"}).Update()

寫入/儲存

r, err := db.Table("user").Data(gdb.Map{"name": "john"}).Insert()r, err := db.Table("user").Data(gdb.Map{"uid": 10000, "name": "john"}).Replace()r, err := db.Table("user").Data(gdb.Map{"uid": 10001, "name": "john"}).Save()

事務操作

if tx, err := db.Begin(); err == nil {    if r, err := tx.Table("user").Data(gdb.Map{"uid":1, "name": "john"}).Save(); err == nil {        tx.Commit()    } else {        tx.Rollback()    }    fmt.Println(r, err)}

...

更多特性及示例請檢視官方開發文件:gf.johng.cn

GoFrame v0.99.682 beta 釋出,更強大的 Go Web 框架原文請看這裡