Compare commits

...

193 Commits

Author SHA1 Message Date
fe142c93fd add function Transaction for gdb.Model 2021-05-29 17:07:49 +08:00
578e7d634b comment updates for package gvalid 2021-05-29 16:47:39 +08:00
6659a49869 Merge branch 'master' of https://github.com/gogf/gf 2021-05-29 16:45:19 +08:00
d9bc8b05e1 add example for package gvalid 2021-05-29 16:45:08 +08:00
571405597b Merge pull request #1271 from wangle201210/master
add valid size method
2021-05-29 16:16:21 +08:00
1441ce7f5f add examples for package gproc 2021-05-29 15:47:07 +08:00
071a587755 Merge remote-tracking branch 'upstream/master' 2021-05-29 12:35:56 +08:00
c1db01425e fix remarks 2021-05-29 12:25:50 +08:00
7bfd48e2ab valid field length 2021-05-29 12:15:37 +08:00
e80309af32 Merge branch 'master' of https://github.com/gogf/gf 2021-05-29 11:30:47 +08:00
fa1814ff54 add custom rule fucntions feature for package gvalid 2021-05-29 11:30:34 +08:00
d7b8a2684a Revert ""gvalid length" compatible with only one parameter"
This reverts commit b2d3c7d1fd.
2021-05-29 11:28:26 +08:00
8559cd299d Merge pull request #1268 from wangle201210/master
"gvalid  length" compatible with only one parameter
2021-05-28 13:44:36 +08:00
b2d3c7d1fd "gvalid length" compatible with only one parameter 2021-05-28 11:34:51 +08:00
5100e0e8b7 add sub-query feature for orm 2021-05-27 22:18:16 +08:00
8acb921ee3 improve package gtimer for times limitation 2021-05-27 13:10:10 +08:00
fc88001a8c revert name from Job to Entry for package gtimer/gcron 2021-05-26 09:55:33 +08:00
fab6c4048d comment update 2021-05-25 22:16:55 +08:00
5903eb8ceb fix issue #1254 2021-05-25 09:56:23 +08:00
211e62a8e7 add timestamptz type support for pgsql for package gdb 2021-05-24 13:30:04 +08:00
64a9b06e64 comment update 2021-05-23 00:02:49 +08:00
6d81aa4462 infract internal link 2021-05-21 15:38:56 +08:00
406b6bf410 infract internal link 2021-05-21 15:30:21 +08:00
4e41d8aff8 improve context and nested transaction feature for package gdb 2021-05-21 13:25:53 +08:00
017c6e4e1f add example for i18n feature of package gvalid 2021-05-19 23:17:13 +08:00
7d3233c7ad add context for custom validation rule function;add function WhereNot for gdb.Model 2021-05-19 22:33:50 +08:00
3e2662582c improve nested transaction feature for package gdb 2021-05-19 21:17:21 +08:00
c94dee8191 improve nested transaction feature for package gdb 2021-05-19 21:11:51 +08:00
ab2ef13d99 improve transaction for package gdb 2021-05-19 20:33:19 +08:00
fac9ab5c01 improve package gvalid 2021-05-19 19:00:34 +08:00
420e0b9ca4 improve package gvalid 2021-05-19 13:29:40 +08:00
ea0340db8e improve validation manager feature for package gvalid 2021-05-19 09:25:49 +08:00
0bd1ea07a7 example update 2021-05-18 20:52:39 +08:00
c8c28770fb change Error from struct to interface for package gvalid;error string update for package gdb 2021-05-18 20:51:31 +08:00
0dfd968824 comment update for package gconv/gproc 2021-05-17 21:26:39 +08:00
b84ca9cc13 debug 2021-05-17 20:25:00 +08:00
e5734425ba debug 2021-05-17 20:18:21 +08:00
2274a10cfd fx issue #1250 2021-05-17 19:59:34 +08:00
302e234bfe comment update for package gfsnotify 2021-05-17 19:17:04 +08:00
2b942bf06b Merge pull request #1247 from notnear/master
add websocket client
2021-05-17 13:52:39 +08:00
522f6cb455 fix issue of failing in folder watching with no recursive option for package gfsnotify 2021-05-17 13:43:36 +08:00
a757fbd37d improve package gcfg 2021-05-17 00:07:06 +08:00
33567ef338 remove unit testing file for package internal/json 2021-05-15 23:42:39 +08:00
b2a15c259e improve unit testing case for package internal/json 2021-05-15 23:21:38 +08:00
d12409b118 revert json.UnmarshalUseNumber to json.Unmarshal for code in the example folder 2021-05-15 23:13:31 +08:00
8aed1eca13 version updates 2021-05-15 23:02:44 +08:00
f389688caa add unit testing cases for package internal/json 2021-05-15 23:02:21 +08:00
7003c284d0 replace json.Unmarshal with json.UnmarshalUseNumber for packages 2021-05-15 22:38:07 +08:00
facb2949c3 improve unit testing cases for package gtimer 2021-05-15 18:31:46 +08:00
1b1355a595 improve package gtimer 2021-05-15 18:27:46 +08:00
d76e4c8aed refract package gtimer for more stable 2021-05-15 18:13:51 +08:00
cc1224e032 add context for package gvalid.Check* functions 2021-05-13 20:56:52 +08:00
tom
09de115670 add websocket client 2021-05-13 17:51:06 +08:00
23110b5d19 fix issue in unit testing case of package gins 2021-05-13 08:53:54 +08:00
a326f4a989 improve package gi18n/gview/gvalid for more flexable i18n feature controll,add custom error configuration and i18n translation for custom error message 2021-05-13 00:16:45 +08:00
d21b9d58e1 improve with feature by supporting attributes struct which also have 'with' tag 2021-05-12 21:34:15 +08:00
9d362c3738 merge feature/improve_struct_validation 2021-05-12 00:15:53 +08:00
b06580d343 improve struct validation for package gvalid 2021-05-12 00:01:52 +08:00
a4240bdfb7 improve struct validation for package gvalid 2021-05-11 20:57:30 +08:00
1eab1cb367 add more unit testing cases,remove function Filter usage in unit testing cases for package gdb 2021-05-11 20:14:06 +08:00
2e38416e12 improve struct embedded association case of with feature for package gdb 2021-05-11 20:00:50 +08:00
034a3f1808 improve struct validation 2021-05-11 19:20:39 +08:00
6a80091fef version updates 2021-05-03 00:00:29 +08:00
742653ce75 improve Model function for struct parameter that can retrieve table name tag from 2021-05-02 23:28:24 +08:00
a8c3d07d9f improve with feature for package gdb 2021-05-02 22:35:47 +08:00
df1ef5db78 add example for package gdb 2021-05-02 17:57:00 +08:00
4b15ab5e99 improve OrderRandom function for package gdb 2021-05-02 16:42:34 +08:00
cdc97e9b2b improve logging for transaction feature for package gdb 2021-05-02 15:58:28 +08:00
bd84b97614 add more Where*/Min/Max/Avg/Sum/CountColumn/Increment/Decrement/OrderAsc/OrderDesc/OrderRandom functions and associated unit testing cases for package gdb 2021-05-02 12:17:06 +08:00
d7eb1cca07 add nested transaction feature for package gdb 2021-05-02 09:35:54 +08:00
5856f74d83 up 2021-05-02 08:10:35 +08:00
563509c4a6 route map dumping updates 2021-05-01 09:04:16 +08:00
d0753fa527 Merge branch 'develop' 2021-04-26 20:38:16 +08:00
524e3bedc7 improve empty value validation for required-with* patterns for package gvalid 2021-04-26 20:37:36 +08:00
30b60754e3 README update 2021-04-16 10:32:55 +08:00
88c49dc2cb README update 2021-04-16 10:27:39 +08:00
bb3dcc2622 Merge branch 'master' of https://github.com/gogf/gf 2021-04-16 10:22:02 +08:00
5cca0640d9 README update 2021-04-16 10:21:42 +08:00
fb48ceeeee Merge pull request #1214 from ansionfor/add-graceful-timeout
add graceful reload timeout config
2021-04-10 08:23:54 +08:00
90f4bba8fd gofmt格式化 2021-04-07 20:52:38 +08:00
802187abc4 add graceful reload timeout 2021-04-07 16:06:37 +08:00
49dd17c047 remove maxIdleTime feature due to be compatible with old Golang version <= v1.14 2021-04-04 12:13:51 +08:00
a3b94c24de fix issue #854; add maxIdleTime configuration and comments update for package gdb; version updates 2021-04-04 12:01:22 +08:00
ac4485dc84 comment update for package gsession 2021-04-02 18:00:50 +08:00
4d1e25cdab change internal constant varibale names for package gqueue 2021-04-02 16:16:54 +08:00
ec00e99477 comments update for package gtime 2021-04-01 09:41:14 +08:00
a73dca3e50 Merge pull request #1196 from yanllllk/yys 2021-04-01 09:27:59 +08:00
yys
ed71d2b2ac add test 2021-03-31 14:07:28 +08:00
3911c2e0a2 README updates 2021-03-30 18:00:44 +08:00
1b6765db50 README updates 2021-03-30 17:44:57 +08:00
345fb69521 README updates 2021-03-30 17:43:44 +08:00
83a6abc70f README updates 2021-03-30 17:42:00 +08:00
cfef726205 README updates 2021-03-30 17:41:10 +08:00
de0f9e728c README updates 2021-03-30 17:39:56 +08:00
d9754a532b version updates 2021-03-30 17:20:13 +08:00
dc51023c61 upgrade github.com/olekukonko/tablewriter from 0.0.1 to 0.0.5 2021-03-30 16:54:52 +08:00
87ce5c5419 Merge branch 'master' of https://github.com/gogf/gf 2021-03-30 16:48:19 +08:00
c4fc9f9618 fix issue #1204: improve validation support for time value, eg: gtime.Time/*gtime.Time, time.Time/*time.Time. 2021-03-30 16:06:20 +08:00
8d7aa5db83 Merge pull request #1205 from Zh1Cheung/master
bug:The parameter of the New method is a pointer
2021-03-30 15:39:31 +08:00
9c70fe3be8 add more unit testing case for package gvalid 2021-03-30 15:25:26 +08:00
78027d2ec6 deprecated comments update 2021-03-30 13:43:08 +08:00
d4e4b9addf improve package gcfg for automatically checking and adding path of package main 2021-03-29 18:05:47 +08:00
b2acd22f58 improve package gi18n 2021-03-29 17:36:51 +08:00
ae5ecb5bfa update unit testing case for package gtrace 2021-03-29 16:12:14 +08:00
6f1340ce36 upgrade otel from v0.18.0 to v0.19.0 2021-03-29 16:00:56 +08:00
473fdba14f add replace in go.mod for otel 2021-03-29 15:51:03 +08:00
93a01a1aaf bug:The parameter of the New method is a pointer 2021-03-27 16:21:28 +08:00
yys
7c51ff4707 gtime 修改 2021-03-25 13:38:59 +08:00
bb6883213f fix issue #1202 2021-03-24 22:04:04 +08:00
54395b39a6 fix issue #1202 2021-03-24 21:19:23 +08:00
6deb817fd0 fix issue in unit testing case for package gpage 2021-03-23 17:58:09 +08:00
482e093331 add map/[]map converting support for gconv.Scan;improve gconv.MaptoMaps 2021-03-23 17:53:20 +08:00
042f903157 Merge branch 'master' of https://github.com/gogf/gf 2021-03-23 14:23:47 +08:00
c423ad4830 fix issue in gfile.MainPkgPath;improve fields filter for package gdb 2021-03-23 14:21:54 +08:00
958b109a12 fix removing cookie issue 2021-03-19 19:16:21 +08:00
113fffdd69 Merge pull request #1199 from yangyanqing/yangyanqing/fix-zte-chinese 2021-03-19 17:08:31 +08:00
4aaf09fded improve gfile.MainPkgPath 2021-03-19 16:35:55 +08:00
2f3df76f37 fix issue #1190 2021-03-19 15:37:33 +08:00
cf7706b16d ZTE 的中文名应该是“中兴通讯”,不是“中兴科技” 2021-03-19 11:45:17 +08:00
36963c05a2 fix issue #1190 2021-03-19 11:35:12 +08:00
48d840a1b8 ad go.sum 2021-03-18 15:29:42 +08:00
e3ebc908bb improve package gconv 2021-03-18 15:21:05 +08:00
9ed8d8c113 rename max content log size name for gtrace from maxlogsize to maxcontentlogsize 2021-03-18 11:22:44 +08:00
9eab5daf19 update required minimum go version from 1.11 to 1.14 2021-03-18 11:19:36 +08:00
6a24b595f0 upgrade otel from 0.16.0 to 0.18.0 2021-03-18 10:39:23 +08:00
150f237f13 fix issue in incorrect parameter sequence in package gi18n;improve package gcfg for detailed error printing 2021-03-16 14:39:01 +08:00
yys
17233084f1 为gtime添加scanner和valuer 2021-03-13 14:07:22 +08:00
41f2138b39 fix issue of overflow in grand.D 2021-03-11 23:29:39 +08:00
6376b8aaa6 remove session storage file removing feature for package gsession 2021-03-11 21:21:47 +08:00
58362ad143 add grand.D for random time.Duration;add checking and removing session files for package gsession 2021-03-11 20:05:08 +08:00
d72d23c2eb change browser mode from boolean markable variable to cookiejar for ghttp.Client 2021-03-11 18:58:13 +08:00
7702c5bfde add internal logging for package gdb/gredis 2021-03-11 11:39:49 +08:00
20f2a6c003 add recursive validation feature of struct attribute for package gvalid for #1165 2021-03-10 23:28:34 +08:00
0d4c1c47d5 improve package grand 2021-03-10 21:19:11 +08:00
4d32733790 improve ghttp.Client for #1179 2021-03-09 22:54:38 +08:00
0e58b6e95b README updates 2021-03-08 23:27:48 +08:00
19bfc48dca version updates 2021-03-04 22:49:11 +08:00
ae0cc5a4b6 add more unit testing case for ScanList feature 2021-03-04 20:45:05 +08:00
ba74e0beb2 improve ScanList of the same replation names for package gdb 2021-03-04 00:07:06 +08:00
e5ca4e788e fix issue #1190 2021-03-03 14:29:01 +08:00
1c7f034135 Merge branch 'master' of https://github.com/gogf/gf 2021-03-02 23:32:50 +08:00
4c78ce6e3f fix issue #1187 2021-03-02 23:27:50 +08:00
7803d557b3 Merge pull request #1183 from rc452860/master 2021-03-02 00:04:05 +08:00
204fea395c add struct object support in group router registering for package ghttp 2021-03-01 20:49:09 +08:00
bd13de2b39 improve package internal/intlog 2021-03-01 17:50:02 +08:00
d0f649b328 improve package internal/intlog 2021-03-01 17:39:13 +08:00
04e42d2175 improve package internal/intlog 2021-03-01 17:15:18 +08:00
ffc88eaaa7 improve package gcfg for main package path searching 2021-03-01 17:05:44 +08:00
4b4cc5ebb9 improve package gcfg for main package path searching 2021-03-01 17:02:07 +08:00
0e6cddb547 去除cancelFunc避免退出之前关闭mysqlConn导致数据获取不完整 2021-03-01 01:43:53 +08:00
a69aec9070 Merge branch 'master' of https://github.com/gogf/gf 2021-02-28 20:14:10 +08:00
d2bd37962e add unit testing case of UnmarshalValue for struct converting of querying result; improve package gdb 2021-02-27 23:58:36 +08:00
eb6763b0fd fix issue of failing configuration for default configuration file for package gcfg 2021-02-26 13:57:47 +08:00
d330afdd36 add required* rules checks for map/slice 2021-02-24 01:20:06 +08:00
5db4bbc186 fix issue 1162 2021-02-24 01:07:09 +08:00
e00f2666ff Merge pull request #1176 from develop1024/master 2021-02-24 00:39:35 +08:00
0238cdd5ec 修改注释错误-os/gbuild/GetVar 2021-02-23 23:07:28 +08:00
2c34d96b9d add tls configuration for ghttp.Client 2021-02-23 22:00:11 +08:00
65b3630f6d Merge pull request #1174 from aimingo/master
style:  code style
2021-02-22 11:41:45 +08:00
54b629561e style: code style 2021-02-22 11:20:10 +08:00
285ad36e7d add short datetime string parsing support for package gtime 2021-02-21 22:24:51 +08:00
5adde275fc add switch variable for internal type tracing components 2021-02-14 22:00:56 +08:00
a3fa10d820 great! completed 'with' feature for package gdb 2021-02-09 18:00:43 +08:00
acf47f3907 orm with feature 2021-02-08 17:57:21 +08:00
b4d5335e43 add package gmeta for embedded struct of meta data feature 2021-02-07 21:23:09 +08:00
39fb842e9b Merge branch 'master' into feature/ormwith 2021-02-07 15:34:50 +08:00
7a5d86b44d README updates 2021-02-07 15:34:36 +08:00
397e11e124 improve package gdb for association feature 2021-02-07 14:39:32 +08:00
f4314c318e up 2021-02-07 10:40:02 +08:00
9bb5536163 Merge branch 'master' of https://github.com/gogf/gf into develop 2021-02-07 10:32:18 +08:00
2344701f22 README updates 2021-02-07 10:31:59 +08:00
3bb909ba4f improve comment for package gspath 2021-02-06 11:42:58 +08:00
8ae0bd148b improve ScanList for package gdb; improve Structs for package gconv 2021-02-05 17:42:05 +08:00
72251b880a improve package gconv for slice converting 2021-02-05 14:44:20 +08:00
fefde4c290 improve stack feature for package gdebug/gerror 2021-02-04 00:10:13 +08:00
3b2bae6128 improve soft deletion for package gdb 2021-02-03 23:11:17 +08:00
ae559b57de fix dryrun configuration for package gdb 2021-02-03 22:46:59 +08:00
6135085d61 improve package gtrace 2021-02-03 15:27:41 +08:00
40bdc76af1 improve package gtrace 2021-02-03 15:14:07 +08:00
d4f982a9cf Merge branch 'master' of https://github.com/gogf/gf 2021-02-02 15:18:37 +08:00
813841bb68 rename GetWithEnv to GetOptWithEnv for packge gcmd 2021-02-02 15:16:09 +08:00
930e63e6b9 Merge pull request #1154 from gouguoyin/master
formatMonthDaySuffixMap() misjudged suffix
2021-02-02 13:16:17 +08:00
ce40d139e7 fix issue of nil response handling for ghttp.Client 2021-02-01 21:51:42 +08:00
8368e11827 merge develop 2021-02-01 17:14:08 +08:00
e6b4662ec2 improve tracing feature 2021-02-01 17:10:50 +08:00
28f83d3d32 formatMonthDaySuffixMap() misjudged suffix
when day is 21,abbreviated as 21st,suffix is st ,is not th
when day is 22,abbreviated as 22nd,suffix is nd ,is not th
when day is 23,abbreviated as 23rd,suffix is rd ,is not th
when day is 31,abbreviated as 31st,suffix is st ,is not th
2021-01-31 15:40:27 +08:00
3e33d66ab4 fix issue https://github.com/gogf/gf/issues/1148 2021-01-30 23:05:02 +08:00
13248d6736 Merge pull request #1149 from tangjoin/master
Update client_request.go
2021-01-30 22:57:14 +08:00
8bd24724e7 Update client_request.go 2021-01-30 22:10:06 +08:00
80248e9a6e improve tracing 2021-01-28 14:09:13 +08:00
2734903886 tracing baggage 2021-01-28 13:51:23 +08:00
2451b40d3e improve package gtrace 2021-01-28 13:11:09 +08:00
9fb6227461 fix issue in signal handler for windows 2021-01-28 10:08:52 +08:00
362 changed files with 15494 additions and 7407 deletions

View File

@ -0,0 +1,9 @@
package main
import (
"github.com/gogf/gf/frame/g"
)
func main() {
g.DB().Model("user").Distinct().CountColumn("uid,name")
}

View File

@ -0,0 +1,27 @@
package main
import (
"github.com/gogf/gf/frame/g"
)
func main() {
var (
db = g.DB()
table = "user"
)
tx, err := db.Begin()
if err != nil {
panic(err)
}
if err = tx.Begin(); err != nil {
panic(err)
}
_, err = tx.Model(table).Data(g.Map{"id": 1, "name": "john"}).Insert()
if err = tx.Rollback(); err != nil {
panic(err)
}
_, err = tx.Model(table).Data(g.Map{"id": 2, "name": "smith"}).Insert()
if err = tx.Commit(); err != nil {
panic(err)
}
}

View File

@ -0,0 +1,34 @@
package main
import (
"github.com/gogf/gf/database/gdb"
"github.com/gogf/gf/frame/g"
)
func main() {
var (
err error
db = g.DB()
table = "user"
)
if err = db.Transaction(func(tx *gdb.TX) error {
// Nested transaction 1.
if err = tx.Transaction(func(tx *gdb.TX) error {
_, err = tx.Model(table).Data(g.Map{"id": 1, "name": "john"}).Insert()
return err
}); err != nil {
return err
}
// Nested transaction 2, panic.
if err = tx.Transaction(func(tx *gdb.TX) error {
_, err = tx.Model(table).Data(g.Map{"id": 2, "name": "smith"}).Insert()
// Create a panic that can make this transaction rollback automatically.
panic("error")
}); err != nil {
return err
}
return nil
}); err != nil {
panic(err)
}
}

View File

@ -0,0 +1,40 @@
package main
import (
"github.com/gogf/gf/frame/g"
)
func main() {
var (
err error
db = g.DB()
table = "user"
)
tx, err := db.Begin()
if err != nil {
panic(err)
}
defer func() {
if err := recover(); err != nil {
_ = tx.Rollback()
}
}()
if _, err = tx.Model(table).Data(g.Map{"id": 1, "name": "john"}).Insert(); err != nil {
panic(err)
}
if err = tx.SavePoint("MyPoint"); err != nil {
panic(err)
}
if _, err = tx.Model(table).Data(g.Map{"id": 2, "name": "smith"}).Insert(); err != nil {
panic(err)
}
if _, err = tx.Model(table).Data(g.Map{"id": 3, "name": "green"}).Insert(); err != nil {
panic(err)
}
if err = tx.RollbackTo("MyPoint"); err != nil {
panic(err)
}
if err = tx.Commit(); err != nil {
panic(err)
}
}

View File

@ -0,0 +1,66 @@
package main
import (
"fmt"
"github.com/gogf/gf/database/gdb"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/util/gmeta"
)
func main() {
type UserDetail struct {
gmeta.Meta `orm:"table:user_detail"`
Uid int `json:"uid"`
Address string `json:"address"`
}
type UserScore struct {
gmeta.Meta `orm:"table:user_score"`
Id int `json:"id"`
Uid int `json:"uid"`
Score int `json:"score"`
}
type User struct {
gmeta.Meta `orm:"table:user"`
Id int `json:"id"`
Name string `json:"name"`
UserDetail *UserDetail `orm:"with:uid=id"`
UserScores []*UserScore `orm:"with:uid=id"`
}
db := g.DB()
db.Transaction(func(tx *gdb.TX) error {
for i := 1; i <= 5; i++ {
// User.
user := User{
Name: fmt.Sprintf(`name_%d`, i),
}
lastInsertId, err := db.Model(user).Data(user).OmitEmpty().InsertAndGetId()
if err != nil {
return err
}
// Detail.
userDetail := UserDetail{
Uid: int(lastInsertId),
Address: fmt.Sprintf(`address_%d`, lastInsertId),
}
_, err = db.Model(userDetail).Data(userDetail).OmitEmpty().Insert()
if err != nil {
return err
}
// Scores.
for j := 1; j <= 5; j++ {
userScore := UserScore{
Uid: int(lastInsertId),
Score: j,
}
_, err = db.Model(userScore).Data(userScore).OmitEmpty().Insert()
if err != nil {
return err
}
}
}
return nil
})
}

View File

@ -0,0 +1,37 @@
package main
import (
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/util/gmeta"
)
func main() {
type UserDetail struct {
gmeta.Meta `orm:"table:user_detail"`
Uid int `json:"uid"`
Address string `json:"address"`
}
type UserScore struct {
gmeta.Meta `orm:"table:user_score"`
Id int `json:"id"`
Uid int `json:"uid"`
Score int `json:"score"`
}
type User struct {
gmeta.Meta `orm:"table:user"`
Id int `json:"id"`
Name string `json:"name"`
UserDetail *UserDetail `orm:"with:uid=id"`
UserScores []*UserScore `orm:"with:uid=id"`
}
db := g.DB()
var user *User
err := db.Model(user).WithAll().Where("id", 3).Scan(&user)
if err != nil {
panic(err)
}
g.Dump(user)
}

View File

@ -9,10 +9,11 @@ import (
// 使用原生gredis.New操作redis但是注意需要自己调用Close方法关闭redis链接池
func main() {
redis := gredis.New(gredis.Config{
config := &gredis.Config{
Host: "127.0.0.1",
Port: 6379,
})
}
redis := gredis.New(config)
defer redis.Close()
redis.Do("SET", "k", "v")
v, _ := redis.Do("GET", "k")

View File

@ -1,6 +1,7 @@
package main
import (
"context"
"fmt"
"github.com/gogf/gf/i18n/gi18n"
@ -13,6 +14,6 @@ func main() {
if err != nil {
panic(err)
}
fmt.Println(t.Translate(`hello`))
fmt.Println(t.Translate(`{#hello}{#world}!`))
fmt.Println(t.Translate(context.TODO(), `hello`))
fmt.Println(t.Translate(context.TODO(), `{#hello}{#world}!`))
}

View File

@ -1,6 +1,7 @@
package main
import (
"context"
"fmt"
"github.com/gogf/gf/i18n/gi18n"
@ -13,6 +14,6 @@ func main() {
if err != nil {
panic(err)
}
fmt.Println(t.Translate(`hello`))
fmt.Println(t.Translate(`{#hello}{#world}!`))
fmt.Println(t.Translate(context.TODO(), `hello`))
fmt.Println(t.Translate(context.TODO(), `{#hello}{#world}!`))
}

View File

@ -1,8 +1,10 @@
package main
import (
"context"
"fmt"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/i18n/gi18n"
)
func main() {
@ -10,6 +12,12 @@ func main() {
orderId = 865271654
orderAmount = 99.8
)
fmt.Println(g.I18n().Tfl(`en`, `{#OrderPaid}`, orderId, orderAmount))
fmt.Println(g.I18n().Tfl(`zh-CN`, `{#OrderPaid}`, orderId, orderAmount))
fmt.Println(g.I18n().Tf(
gi18n.WithLanguage(context.TODO(), `en`),
`{#OrderPaid}`, orderId, orderAmount,
))
fmt.Println(g.I18n().Tf(
gi18n.WithLanguage(context.TODO(), `zh-CN`),
`{#OrderPaid}`, orderId, orderAmount,
))
}

View File

@ -2,15 +2,19 @@ package main
import (
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/i18n/gi18n"
"github.com/gogf/gf/net/ghttp"
)
func main() {
g.I18n().SetPath("/Users/john/Workspace/Go/GOPATH/src/github.com/gogf/gf/.example/i18n/gi18n/i18n")
s := g.Server()
s.BindHandler("/", func(r *ghttp.Request) {
r.Response.WriteTplContent(`{#hello}{#world}!`, g.Map{
"I18nLanguage": r.Get("lang", "zh-CN"),
s.Group("/", func(group *ghttp.RouterGroup) {
group.Middleware(func(r *ghttp.Request) {
r.SetCtx(gi18n.WithLanguage(r.Context(), r.GetString("lang", "zh-CN")))
r.Middleware.Next()
})
group.ALL("/", func(r *ghttp.Request) {
r.Response.WriteTplContent(`{#hello}{#world}!`)
})
})
s.SetPort(8199)

View File

@ -1 +1,3 @@
OrderPaid = "您已成功完成订单号 #%d 支付,支付金额¥%.2f。"
OrderPaid = "您已成功完成订单号 #%d 支付,支付金额¥%.2f。"
hello = "你好"
world = "世界"

View File

@ -0,0 +1,64 @@
package main
import (
"bytes"
"fmt"
"github.com/gogf/gf/container/garray"
"github.com/gogf/gf/crypto/gmd5"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/internal/json"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/os/gtime"
"github.com/gogf/gf/util/gconv"
"github.com/gogf/gf/util/guid"
"github.com/gogf/gf/util/gutil"
"io/ioutil"
"net/http"
)
const (
appId = "123"
appSecret = "456"
)
// 注入统一的接口签名参数
func injectSignature(jsonContent []byte) []byte {
var m map[string]interface{}
_ = json.Unmarshal(jsonContent, &m)
if len(m) > 0 {
m["appid"] = appId
m["nonce"] = guid.S()
m["timestamp"] = gtime.Timestamp()
var (
keyArray = garray.NewSortedStrArrayFrom(gutil.Keys(m))
sigContent string
)
keyArray.Iterator(func(k int, v string) bool {
sigContent += v
sigContent += gconv.String(m[v])
return true
})
m["signature"] = gmd5.MustEncryptString(gmd5.MustEncryptString(sigContent) + appSecret)
jsonContent, _ = json.Marshal(m)
}
return jsonContent
}
func main() {
c := g.Client()
c.Use(func(c *ghttp.Client, r *http.Request) (resp *ghttp.ClientResponse, err error) {
bodyBytes, _ := ioutil.ReadAll(r.Body)
if len(bodyBytes) > 0 {
// 注入签名相关参数修改Request原有的提交参数
bodyBytes = injectSignature(bodyBytes)
r.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
r.ContentLength = int64(len(bodyBytes))
}
return c.Next(r)
})
content := c.ContentJson().PostContent("http://127.0.0.1:8199/", g.Map{
"name": "goframe",
"site": "https://goframe.org",
})
fmt.Println(content)
}

View File

@ -0,0 +1,17 @@
package main
import (
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
)
func main() {
s := g.Server()
s.Group("/", func(group *ghttp.RouterGroup) {
group.ALL("/", func(r *ghttp.Request) {
r.Response.Write(r.GetMap())
})
})
s.SetPort(8199)
s.Run()
}

View File

@ -25,7 +25,7 @@ func main() {
//fmt.Println(r.GetBody())
if err := r.Parse(&req); err != nil {
// Validation error.
if v, ok := err.(*gvalid.Error); ok {
if v, ok := err.(gvalid.Error); ok {
r.Response.WriteJsonExit(RegisterRes{
Code: 1,
Error: v.FirstString(),

View File

@ -18,13 +18,13 @@ func main() {
s.Group("/", func(rgroup *ghttp.RouterGroup) {
rgroup.ALL("/user", func(r *ghttp.Request) {
user := new(User)
if err := r.GetToStruct(user); err != nil {
if err := r.GetStruct(user); err != nil {
r.Response.WriteJsonExit(g.Map{
"message": err,
"errcode": 1,
})
}
if err := gvalid.CheckStruct(user, nil); err != nil {
if err := gvalid.CheckStruct(r.Context(), user, nil); err != nil {
r.Response.WriteJsonExit(g.Map{
"message": err.Maps(),
"errcode": 1,

View File

@ -24,7 +24,7 @@ func main() {
var req *RegisterReq
if err := r.Parse(&req); err != nil {
// Validation error.
if v, ok := err.(*gvalid.Error); ok {
if v, ok := err.(gvalid.Error); ok {
r.Response.WriteJsonExit(RegisterRes{
Code: 1,
Error: v.FirstString(),

View File

@ -8,7 +8,6 @@ import (
func main() {
s := g.Server()
s.SetSessionCookieMaxAge(0)
s.Group("/", func(group *ghttp.RouterGroup) {
group.GET("/set", func(r *ghttp.Request) {
r.Session.Set("time", gtime.Timestamp())

View File

@ -0,0 +1,36 @@
package main
import (
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/os/gsession"
)
func main() {
type User struct {
Id int64
Name string
}
s := g.Server()
s.SetSessionStorage(gsession.NewStorageRedis(g.Redis()))
s.Group("/", func(group *ghttp.RouterGroup) {
group.GET("/set", func(r *ghttp.Request) {
user := &User{
Id: 1265476890672672808,
Name: "john",
}
if err := r.Session.Set("user", user); err != nil {
panic(err)
}
r.Response.Write("ok")
})
group.GET("/get", func(r *ghttp.Request) {
r.Response.WriteJson(r.Session.Get("user"))
})
group.GET("/clear", func(r *ghttp.Request) {
r.Session.Clear()
})
})
s.SetPort(8199)
s.Run()
}

View File

@ -0,0 +1,54 @@
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
"time"
)
func signalHandlerForMQ() {
var (
sig os.Signal
receivedChan = make(chan os.Signal)
)
signal.Notify(
receivedChan,
syscall.SIGINT,
syscall.SIGQUIT,
syscall.SIGKILL,
syscall.SIGTERM,
syscall.SIGABRT,
)
for {
sig = <-receivedChan
fmt.Println("MQ is shutting down due to signal:", sig.String())
time.Sleep(time.Second)
fmt.Println("MQ is shut down smoothly")
return
}
}
func main() {
fmt.Println("Process start, pid:", os.Getpid())
go signalHandlerForMQ()
var (
sig os.Signal
receivedChan = make(chan os.Signal)
)
signal.Notify(
receivedChan,
syscall.SIGINT,
syscall.SIGQUIT,
syscall.SIGKILL,
syscall.SIGTERM,
syscall.SIGABRT,
)
for {
sig = <-receivedChan
fmt.Println("MainProcess is shutting down due to signal:", sig.String())
return
}
}

View File

@ -0,0 +1,27 @@
package main
import (
"fmt"
"github.com/gogf/gf/os/gproc"
"os"
"time"
)
func signalHandlerForMQ(sig os.Signal) {
fmt.Println("MQ is shutting down due to signal:", sig.String())
time.Sleep(time.Second)
fmt.Println("MQ is shut down smoothly")
}
func signalHandlerForMain(sig os.Signal) {
fmt.Println("MainProcess is shutting down due to signal:", sig.String())
}
func main() {
fmt.Println("Process start, pid:", os.Getpid())
gproc.AddSigHandlerShutdown(
signalHandlerForMQ,
signalHandlerForMain,
)
gproc.Listen()
}

View File

@ -0,0 +1,14 @@
# MySQL.
[database]
[database.default]
link = "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
debug = true

View File

@ -1,31 +1,32 @@
package main
import (
"context"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/util/gvalid"
)
func main() {
//rule := "length:6,16"
//if m := gvalid.Check("123456", rule, nil); m != nil {
//if m := gvalid.Check(context.TODO(), "123456", rule, nil); m != nil {
// fmt.Println(m)
//}
//if m := gvalid.Check("12345", rule, nil); m != nil {
//if m := gvalid.Check(context.TODO(), "12345", rule, nil); m != nil {
// fmt.Println(m)
// // map[length:字段长度为6到16个字符]
//}
//rule := "integer|between:6,16"
//msgs := "请输入一个整数|参数大小不对啊老铁"
//fmt.Println(gvalid.Check("5.66", rule, msgs))
//fmt.Println(gvalid.Check(context.TODO(), "5.66", rule, msgs))
//// map[integer:请输入一个整数 between:参数大小不对啊老铁]
//// 参数长度至少为6个数字或者6个字母但是总长度不能超过16个字符
//rule := `regex:\d{6,}|\D{6,}|max-length:16`
//if m := gvalid.Check("123456", rule, nil); m != nil {
//if m := gvalid.Check(context.TODO(), "123456", rule, nil); m != nil {
// fmt.Println(m)
//}
//if m := gvalid.Check("abcde6", rule, nil); m != nil {
//if m := gvalid.Check(context.TODO(), "abcde6", rule, nil); m != nil {
// fmt.Println(m)
// // map[regex:字段值不合法]
//}
@ -40,18 +41,20 @@ func main() {
// "password" : "required|length:6,16|same:password2",
// "password2" : "required|length:6,16",
//}
//fmt.Println(gvalid.CheckMap(params, rules))
//fmt.Println(gvalid.CheckMap(context.TODO(), params, rules))
//// map[passport:map[length:字段长度为6到16个字符] password:map[same:字段值不合法]]
params := map[string]interface{}{
"passport": "john",
"password": "123456",
"password2": "1234567",
"name": "gf",
}
rules := map[string]string{
"passport": "required|length:6,16",
"password": "required|length:6,16|same:password2",
"password2": "required|length:6,16",
"name": "size:5",
}
msgs := map[string]interface{}{
"passport": "账号不能为空|账号长度应当在:min到:max之间",
@ -59,8 +62,9 @@ func main() {
"required": "密码不能为空",
"same": "两次密码输入不相等",
},
"name": "名字长度必须为:size",
}
if e := gvalid.CheckMap(params, rules, msgs); e != nil {
if e := gvalid.CheckMap(context.TODO(), params, rules, msgs); e != nil {
g.Dump(e.Maps())
}
// map[passport:map[length:账号长度应当在6到16之间] password:map[same:两次密码输入不相等]]

View File

@ -0,0 +1,28 @@
package main
import (
"context"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/util/gconv"
"github.com/gogf/gf/util/gvalid"
)
func main() {
type User struct {
Name string `v:"required#请输入用户姓名"`
Type int `v:"required#请选择用户类型"`
}
data := g.Map{
"name": "john",
}
user := User{}
if err := gconv.Scan(data, &user); err != nil {
panic(err)
}
err := gvalid.CheckStructWithData(context.TODO(), user, data, nil)
// 也可以使用
// err := g.Validator().Data(data).CheckStruct(user)
if err != nil {
g.Dump(err.Items())
}
}

View File

@ -1,6 +1,7 @@
package main
import (
"context"
"fmt"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/util/gvalid"
@ -8,6 +9,6 @@ import (
func main() {
g.I18n().SetLanguage("cn")
err := gvalid.Check("", "required", nil)
err := gvalid.Check(context.TODO(), "", "required", nil)
fmt.Println(err.String())
}

View File

@ -1,6 +1,7 @@
package main
import (
"context"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/util/gvalid"
)
@ -17,7 +18,7 @@ func main() {
ConfiemPassword: "",
}
e := gvalid.CheckStruct(user, nil)
e := gvalid.CheckStruct(context.TODO(), user, nil)
g.Dump(e.Map())
g.Dump(e.Maps())
g.Dump(e.String())

View File

@ -0,0 +1,38 @@
package main
import (
"context"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/i18n/gi18n"
"github.com/gogf/gf/util/gconv"
)
func main() {
type User struct {
Name string `v:"required#ReuiredUserName"`
Type int `v:"required#ReuiredUserType"`
Project string `v:"size:10#MustSize"`
}
var (
data = g.Map{
"name": "john",
"project": "gf",
}
user = User{}
ctxEn = gi18n.WithLanguage(context.TODO(), "en")
ctxCh = gi18n.WithLanguage(context.TODO(), "zh-CN")
)
if err := gconv.Scan(data, &user); err != nil {
panic(err)
}
// 英文
if err := g.Validator().Ctx(ctxEn).Data(data).CheckStruct(user); err != nil {
g.Dump(err.String())
}
// 中文
if err := g.Validator().Ctx(ctxCh).Data(data).CheckStruct(user); err != nil {
g.Dump(err.String())
}
}

View File

@ -1,6 +1,7 @@
package main
import (
"context"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/util/gvalid"
)
@ -18,7 +19,7 @@ func main() {
Pass2: "123",
}
e := gvalid.CheckStruct(user, nil)
e := gvalid.CheckStruct(context.TODO(), user, nil)
g.Dump(e.String())
g.Dump(e.FirstString())
}

View File

@ -1,6 +1,7 @@
package main
import (
"context"
"fmt"
"github.com/gogf/gf/util/gvalid"
@ -17,7 +18,7 @@ func main() {
"password@required|length:6,16|same:password2#密码不能为空}|两次密码输入不相等",
"password2@required|length:6,16#",
}
if e := gvalid.CheckMap(params, rules); e != nil {
if e := gvalid.CheckMap(context.TODO(), params, rules); e != nil {
fmt.Println(e.Map())
fmt.Println(e.FirstItem())
fmt.Println(e.FirstString())

View File

@ -1,6 +1,7 @@
package main
import (
"context"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/util/gvalid"
)
@ -20,7 +21,7 @@ func main() {
}
// 使用结构体定义的校验规则和错误提示进行校验
g.Dump(gvalid.CheckStruct(user, nil).Map())
g.Dump(gvalid.CheckStruct(context.TODO(), user, nil).Map())
// 自定义校验规则和错误提示,对定义的特定校验规则和错误提示进行覆盖
rules := map[string]string{
@ -31,5 +32,5 @@ func main() {
"password3": "名称不能为空",
},
}
g.Dump(gvalid.CheckStruct(user, rules, msgs).Map())
g.Dump(gvalid.CheckStruct(context.TODO(), user, rules, msgs).Map())
}

View File

@ -1,6 +1,7 @@
package main
import (
"context"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/util/gvalid"
)
@ -13,5 +14,5 @@ func main() {
user := &User{}
g.Dump(gvalid.CheckStruct(user, nil))
g.Dump(gvalid.CheckStruct(context.TODO(), user, nil))
}

View File

@ -1,6 +1,7 @@
package main
import (
"context"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/util/gvalid"
)
@ -15,5 +16,5 @@ func main() {
Pass: "1",
}
g.Dump(gvalid.CheckStruct(user, nil).Maps())
g.Dump(gvalid.CheckStruct(context.TODO(), user, nil).Maps())
}

View File

@ -0,0 +1,40 @@
package main
import (
"context"
"fmt"
"github.com/gogf/gf/errors/gerror"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/util/gmeta"
)
type UserCreateReq struct {
gmeta.Meta `v:"UserCreateReq"`
Name string
Pass string
}
func UserCreateReqChecker(ctx context.Context, rule string, value interface{}, message string, data interface{}) error {
user := &UserCreateReq{}
if v, ok := data.(*UserCreateReq); ok {
user = v
}
// SELECT COUNT(*) FROM `user` WHERE `name` = xxx
count, err := g.Model("user").Ctx(ctx).Where("name", user.Name).Count()
if err != nil {
return err
}
if count > 0 {
return gerror.Newf(`The name "%s" is already token`, user.Name)
}
return nil
}
func main() {
user := &UserCreateReq{
Name: "john",
Pass: "123456",
}
err := g.Validator().RuleFunc("UserCreateReq", UserCreateReqChecker).CheckStruct(user)
fmt.Println(err)
}

View File

@ -1,14 +0,0 @@
"gf.gvalid.required" = "字段不能为空"

View File

@ -0,0 +1,7 @@
"gf.gvalid.required" = "字段不能为空"
"ReuiredUserName" = "Please input user name"
"ReuiredUserType" = "Please select user type"
"MustSize" = "Size of :attribute must be :size"

View File

@ -0,0 +1,16 @@
"gf.gvalid.required" = "字段不能为空"
"ReuiredUserName" = "请输入用户名称"
"ReuiredUserType" = "请选择用户类型"
"MustSize" = ":attribute长度必须为:size"

1
.gitignore vendored
View File

@ -14,5 +14,4 @@ bin/
cbuild
**/.DS_Store
.vscode/
go.sum
.example/other/

View File

@ -4,11 +4,9 @@ arch: arm64-graviton2
language: go
go:
- "1.11.x"
- "1.12.x"
- "1.13.x"
- "1.14.x"
- "1.15.x"
- "1.16.x"
branches:
only:

View File

@ -1,7 +1,7 @@
# GoFrame
[![Go Doc](https://godoc.org/github.com/gogf/gf?status.svg)](https://godoc.org/github.com/gogf/gf)
[![Build Status](https://travis-ci.org/gogf/gf.svg?branch=master)](https://travis-ci.org/gogf/gf)
[![Build Status](https://travis-ci.com/gogf/gf.svg?branch=master)](https://travis-ci.org/gogf/gf)
[![Go Report](https://goreportcard.com/badge/github.com/gogf/gf?v=1)](https://goreportcard.com/report/github.com/gogf/gf)
[![Code Coverage](https://codecov.io/gh/gogf/gf/branch/master/graph/badge.svg)](https://codecov.io/gh/gogf/gf/branch/master)
[![Production Ready](https://img.shields.io/badge/production-ready-blue.svg)](https://github.com/gogf/gf)
@ -9,11 +9,8 @@
English | [简体中文](README_ZH.MD)
`GF(GoFrame)` is a modular, powerful, high-performance and enterprise-class application development framework
of Golang. Providing a series of core components and dozens of practical modules, such as:
cache, logging, containers, timer, resource, validator, database orm, etc.
Supporting web server integrated with router, cookie, session, middleware, logger, configure,
template, https, hooks, rewrites and many more features.
`GoFrame` is a modular, powerful, high-performance and enterprise-class application development framework
of Golang.
> If you're a newbie to `Go`, you may consider `GoFrame` easy and great as `Laravel` in `PHP`, `SpringBoot` in `Java` or `Django` in `Python`.
@ -33,7 +30,7 @@ golang version >= 1.11
# Architecture
<div align=center>
<img src="https://itician.org/download/attachments/1114119/arch.png"/>
<img src="https://goframe.org/download/attachments/1114119/arch.png"/>
</div>
# Packages
@ -53,17 +50,10 @@ The `Web` component performance of `GoFrame`, please refer to third-party projec
# Documentation
* 中文官网: https://goframe.org
* GoDoc API: https://godoc.org/github.com/gogf/gf
* 中文官网: [https://goframe.org](https://goframe.org/display/gf)
* GoDoc API: [https://pkg.go.dev/github.com/gogf/gf](https://pkg.go.dev/github.com/gogf/gf)
# Discussion
- QQ Group[116707870](//shang.qq.com/wpa/qunwpa?idkey=195f91eceeb5d7fa76009b7cd5a4641f70bf4897b7f5a520635eb26ff17adfe7)
- WX GroupAdd friend`389961817` in WeChat, commenting `GF`
- Issueshttps://github.com/gogf/gf/issues
> It's recommended learning `GoFrame` through its awesome source codes and API reference.
# License
`GF` is licensed under the [MIT License](LICENSE), 100% free and open-source, forever.
@ -80,7 +70,7 @@ The `Web` component performance of `GoFrame`, please refer to third-party projec
- [XiMaLaYa](https://www.ximalaya.com)
- [ZYBang](https://www.zybang.com/)
> We list part of the users here, if your company or products are using `GoFrame`, please let us know [here](https://itician.org/pages/viewpage.action?pageId=1114415).
> We list part of the users here, if your company or products are using `GoFrame`, please let us know [here](https://goframe.org/pages/viewpage.action?pageId=1114415).
# Contributors
@ -90,7 +80,7 @@ This project exists thanks to all the people who contribute. [[Contributors](htt
# Donators
If you love `GF`, why not [buy developer a cup of coffee](https://itician.org/pages/viewpage.action?pageId=1115633)?
If you love `GF`, why not [buy developer a cup of coffee](https://goframe.org/pages/viewpage.action?pageId=1115633)?
# Sponsors
We appreciate any kind of sponsorship for `GF` development. If you've got some interesting, please contact WeChat `389961817` / Email `john@goframe.org`.
@ -98,8 +88,8 @@ We appreciate any kind of sponsorship for `GF` development. If you've got some i
# Thanks
<a href="https://www.jetbrains.com/?from=GoFrame"><img src="https://itician.org/download/thumbnails/1114119/jetbrains.png?version=1&modificationDate=1608649325806&api=v2" height="120" alt="JetBrains"/></a>
<a href="https://www.atlassian.com/?from=GoFrame"><img src="https://itician.org/download/thumbnails/1114119/u%3D605052180%2C3099422872%26fm%3D11%26gp%3D0.jpg?version=1&modificationDate=1608649343601&api=v2" height="120" alt="Atlassian"/></a>
<a href="https://www.jetbrains.com/?from=GoFrame"><img src="https://goframe.org/download/thumbnails/1114119/jetbrains.png" height="120" alt="JetBrains"/></a>
<a href="https://www.atlassian.com/?from=GoFrame"><img src="https://goframe.org/download/attachments/1114119/atlassian.jpg" height="120" alt="Atlassian"/></a>

View File

@ -1,6 +1,6 @@
# GoFrame
[![Go Doc](https://godoc.org/github.com/gogf/gf?status.svg)](https://godoc.org/github.com/gogf/gf)
[![Build Status](https://travis-ci.org/gogf/gf.svg?branch=master)](https://travis-ci.org/gogf/gf)
[![Build Status](https://travis-ci.com/gogf/gf.svg?branch=master)](https://travis-ci.org/gogf/gf)
[![Go Report](https://goreportcard.com/badge/github.com/gogf/gf?v=1)](https://goreportcard.com/report/github.com/gogf/gf)
[![Code Coverage](https://codecov.io/gh/gogf/gf/branch/master/graph/badge.svg)](https://codecov.io/gh/gogf/gf/branch/master)
[![Production Ready](https://img.shields.io/badge/production-ready-blue.svg)](https://github.com/gogf/gf)
@ -8,24 +8,21 @@
[English](README.MD) | 简体中文
`GF(Go Frame)`是一款模块化、高性能、企业级的Go基础开发框架。
实现了比较完善的基础设施建设以及开发工具链,提供了常用的基础开发模块,
如:缓存、日志、队列、数组、集合、容器、定时器、命令行、内存锁、对象池、
配置管理、资源管理、数据校验、数据编码、定时任务、数据库ORM、TCP/UDP组件、进程管理/通信等等。
并提供了Web服务开发的系列核心组件Router、Cookie、Session、Middleware、服务注册、模板引擎等等
支持热重启、热更新、域名绑定、TLS/HTTPS、Rewrite等特性。
`GoFrame`是一款模块化、高性能、企业级的Go基础开发框架。
> 如果您初识`Go`语言,您可以将`GoFrame`类似于`PHP`中的`Laravel`, `Java`中的`SpringBoot`或者`Python`中的`Django`。
# 特点
* 模块化、松耦合设计;
* 模块丰富、开箱即用
* 简便易用、易于维护;
* 高代码质量、高单元测试覆盖率;
* 社区活跃,大牛谦逊低调脾气好;
* 详尽的开发文档及示例;
* 完善的本地中文化支持;
* 设计为团队及企业使用;
* 模块化、松耦合
* 模块丰富、开箱即用
* 简洁易用、快速接入
* 文档详尽、易于维护
* 自顶向下、体系化设计
* 统一框架、统一组件、降低选择成本
* 开发规范、设计模式、代码分层模型
* 强大便捷的开发工具链
* 完善的本地中文化支持
* 设计为团队及企业使用
# 地址
- **主库**https://github.com/gogf/gf
@ -49,7 +46,7 @@ golang版本 >= 1.11
# 架构
<div align=center>
<img src="https://itician.org/download/attachments/1114119/arch.png"/>
<img src="https://goframe.org/download/attachments/1114119/arch.png"/>
</div>
# 模块
@ -68,16 +65,10 @@ golang版本 >= 1.11
# 文档
开发文档:https://goframe.org
官方站点:[https://goframe.org](https://goframe.org/display/gf)
接口文档https://godoc.org/github.com/gogf/gf
接口文档:[https://pkg.go.dev/github.com/gogf/gf](https://pkg.go.dev/github.com/gogf/gf)
# 帮助
- QQ交流群[116707870](//shang.qq.com/wpa/qunwpa?idkey=195f91eceeb5d7fa76009b7cd5a4641f70bf4897b7f5a520635eb26ff17adfe7)
- WX交流群微信添加`389961817`备注`GF`
- 主库ISSUEhttps://github.com/gogf/gf/issues
> 建议通过阅读`GoFrame`的源码以及API文档深度学习`GoFrame`,了解更多的精妙设计。
# 协议
@ -86,7 +77,7 @@ golang版本 >= 1.11
# 用户
- [腾讯科技](https://www.tencent.com/)
- [中兴科技](https://www.zte.com.cn/china/)
- [中兴通讯](https://www.zte.com.cn/china/)
- [蚂蚁金服](https://www.antfin.com/)
- [医联科技](https://www.medlinker.com/)
- [库币科技](https://www.kucoin.io/)
@ -95,7 +86,7 @@ golang版本 >= 1.11
- [喜马拉雅](https://www.ximalaya.com)
- [作业帮](https://www.zybang.com/)
> 在这里只列举了部分知名的用户,如果您的企业或者产品正在使用`GoFrame`,欢迎到 [这里](https://itician.org/pages/viewpage.action?pageId=1114415) 留言。
> 在这里只列举了部分知名的用户,如果您的企业或者产品正在使用`GoFrame`,欢迎到 [这里](https://goframe.org/pages/viewpage.action?pageId=1114415) 留言。
# 贡献
@ -105,7 +96,7 @@ golang版本 >= 1.11
# 捐赠
如果您喜欢`GF`,要不给开发者 [来杯咖啡](https://itician.org/pages/viewpage.action?pageId=1115633) 吧!
如果您喜欢`GF`,要不给开发者 [来杯咖啡](https://goframe.org/pages/viewpage.action?pageId=1115633) 吧!
请在捐赠时备注您的`github`/`gitee`账号名称。
# 赞助
@ -113,5 +104,6 @@ golang版本 >= 1.11
赞助支持`GF`框架的快速研发,如果您感兴趣,请联系 微信 `389961817` / 邮件 `john@goframe.org`。
# 感谢
<a href="https://www.jetbrains.com/?from=GoFrame"><img src="https://itician.org/download/thumbnails/1114119/jetbrains.png?version=1&modificationDate=1608649325806&api=v2" height="120" alt="JetBrains"/></a>
<a href="https://www.atlassian.com/?from=GoFrame"><img src="https://itician.org/download/thumbnails/1114119/u%3D605052180%2C3099422872%26fm%3D11%26gp%3D0.jpg?version=1&modificationDate=1608649343601&api=v2" height="120" alt="Atlassian"/></a>
<a href="https://www.jetbrains.com/?from=GoFrame"><img src="https://goframe.org/download/thumbnails/1114119/jetbrains.png" height="120" alt="JetBrains"/></a>
<a href="https://www.atlassian.com/?from=GoFrame"><img src="https://goframe.org/download/attachments/1114119/atlassian.jpg" height="120" alt="Atlassian"/></a>

View File

@ -736,7 +736,7 @@ func (a *Array) UnmarshalJSON(b []byte) error {
}
a.mu.Lock()
defer a.mu.Unlock()
if err := json.Unmarshal(b, &a.array); err != nil {
if err := json.UnmarshalUseNumber(b, &a.array); err != nil {
return err
}
return nil
@ -748,7 +748,7 @@ func (a *Array) UnmarshalValue(value interface{}) error {
defer a.mu.Unlock()
switch value.(type) {
case string, []byte:
return json.Unmarshal(gconv.Bytes(value), &a.array)
return json.UnmarshalUseNumber(gconv.Bytes(value), &a.array)
default:
a.array = gconv.SliceAny(value)
}

View File

@ -735,7 +735,7 @@ func (a *IntArray) UnmarshalJSON(b []byte) error {
}
a.mu.Lock()
defer a.mu.Unlock()
if err := json.Unmarshal(b, &a.array); err != nil {
if err := json.UnmarshalUseNumber(b, &a.array); err != nil {
return err
}
return nil
@ -747,7 +747,7 @@ func (a *IntArray) UnmarshalValue(value interface{}) error {
defer a.mu.Unlock()
switch value.(type) {
case string, []byte:
return json.Unmarshal(gconv.Bytes(value), &a.array)
return json.UnmarshalUseNumber(gconv.Bytes(value), &a.array)
default:
a.array = gconv.SliceInt(value)
}

View File

@ -750,7 +750,7 @@ func (a *StrArray) UnmarshalJSON(b []byte) error {
}
a.mu.Lock()
defer a.mu.Unlock()
if err := json.Unmarshal(b, &a.array); err != nil {
if err := json.UnmarshalUseNumber(b, &a.array); err != nil {
return err
}
return nil
@ -762,7 +762,7 @@ func (a *StrArray) UnmarshalValue(value interface{}) error {
defer a.mu.Unlock()
switch value.(type) {
case string, []byte:
return json.Unmarshal(gconv.Bytes(value), &a.array)
return json.UnmarshalUseNumber(gconv.Bytes(value), &a.array)
default:
a.array = gconv.SliceStr(value)
}

View File

@ -685,7 +685,7 @@ func (a *SortedArray) UnmarshalJSON(b []byte) error {
}
a.mu.Lock()
defer a.mu.Unlock()
if err := json.Unmarshal(b, &a.array); err != nil {
if err := json.UnmarshalUseNumber(b, &a.array); err != nil {
return err
}
if a.comparator != nil && a.array != nil {
@ -706,7 +706,7 @@ func (a *SortedArray) UnmarshalValue(value interface{}) (err error) {
defer a.mu.Unlock()
switch value.(type) {
case string, []byte:
err = json.Unmarshal(gconv.Bytes(value), &a.array)
err = json.UnmarshalUseNumber(gconv.Bytes(value), &a.array)
default:
a.array = gconv.SliceAny(value)
}

View File

@ -658,7 +658,7 @@ func (a *SortedIntArray) UnmarshalJSON(b []byte) error {
}
a.mu.Lock()
defer a.mu.Unlock()
if err := json.Unmarshal(b, &a.array); err != nil {
if err := json.UnmarshalUseNumber(b, &a.array); err != nil {
return err
}
if a.array != nil {
@ -676,7 +676,7 @@ func (a *SortedIntArray) UnmarshalValue(value interface{}) (err error) {
defer a.mu.Unlock()
switch value.(type) {
case string, []byte:
err = json.Unmarshal(gconv.Bytes(value), &a.array)
err = json.UnmarshalUseNumber(gconv.Bytes(value), &a.array)
default:
a.array = gconv.SliceInt(value)
}

View File

@ -671,7 +671,7 @@ func (a *SortedStrArray) UnmarshalJSON(b []byte) error {
}
a.mu.Lock()
defer a.mu.Unlock()
if err := json.Unmarshal(b, &a.array); err != nil {
if err := json.UnmarshalUseNumber(b, &a.array); err != nil {
return err
}
if a.array != nil {
@ -689,7 +689,7 @@ func (a *SortedStrArray) UnmarshalValue(value interface{}) (err error) {
defer a.mu.Unlock()
switch value.(type) {
case string, []byte:
err = json.Unmarshal(gconv.Bytes(value), &a.array)
err = json.UnmarshalUseNumber(gconv.Bytes(value), &a.array)
default:
a.array = gconv.SliceStr(value)
}

View File

@ -570,12 +570,12 @@ func TestArray_Json(t *testing.T) {
t.Assert(err1, err2)
a2 := garray.New()
err2 = json.Unmarshal(b2, &a2)
err2 = json.UnmarshalUseNumber(b2, &a2)
t.Assert(err2, nil)
t.Assert(a2.Slice(), s1)
var a3 garray.Array
err := json.Unmarshal(b2, &a3)
err := json.UnmarshalUseNumber(b2, &a3)
t.Assert(err, nil)
t.Assert(a3.Slice(), s1)
})
@ -589,12 +589,12 @@ func TestArray_Json(t *testing.T) {
t.Assert(err1, err2)
a2 := garray.New()
err2 = json.Unmarshal(b2, &a2)
err2 = json.UnmarshalUseNumber(b2, &a2)
t.Assert(err2, nil)
t.Assert(a2.Slice(), s1)
var a3 garray.Array
err := json.Unmarshal(b2, &a3)
err := json.UnmarshalUseNumber(b2, &a3)
t.Assert(err, nil)
t.Assert(a3.Slice(), s1)
})
@ -612,7 +612,7 @@ func TestArray_Json(t *testing.T) {
t.Assert(err, nil)
user := new(User)
err = json.Unmarshal(b, user)
err = json.UnmarshalUseNumber(b, user)
t.Assert(err, nil)
t.Assert(user.Name, data["Name"])
t.Assert(user.Scores, data["Scores"])
@ -631,7 +631,7 @@ func TestArray_Json(t *testing.T) {
t.Assert(err, nil)
user := new(User)
err = json.Unmarshal(b, user)
err = json.UnmarshalUseNumber(b, user)
t.Assert(err, nil)
t.Assert(user.Name, data["Name"])
t.Assert(user.Scores, data["Scores"])

View File

@ -615,11 +615,11 @@ func TestIntArray_Json(t *testing.T) {
t.Assert(err1, err2)
a2 := garray.NewIntArray()
err1 = json.Unmarshal(b2, &a2)
err1 = json.UnmarshalUseNumber(b2, &a2)
t.Assert(a2.Slice(), s1)
var a3 garray.IntArray
err := json.Unmarshal(b2, &a3)
err := json.UnmarshalUseNumber(b2, &a3)
t.Assert(err, nil)
t.Assert(a3.Slice(), s1)
})
@ -633,11 +633,11 @@ func TestIntArray_Json(t *testing.T) {
t.Assert(err1, err2)
a2 := garray.NewIntArray()
err1 = json.Unmarshal(b2, &a2)
err1 = json.UnmarshalUseNumber(b2, &a2)
t.Assert(a2.Slice(), s1)
var a3 garray.IntArray
err := json.Unmarshal(b2, &a3)
err := json.UnmarshalUseNumber(b2, &a3)
t.Assert(err, nil)
t.Assert(a3.Slice(), s1)
})
@ -655,7 +655,7 @@ func TestIntArray_Json(t *testing.T) {
t.Assert(err, nil)
user := new(User)
err = json.Unmarshal(b, user)
err = json.UnmarshalUseNumber(b, user)
t.Assert(err, nil)
t.Assert(user.Name, data["Name"])
t.Assert(user.Scores, data["Scores"])
@ -674,7 +674,7 @@ func TestIntArray_Json(t *testing.T) {
t.Assert(err, nil)
user := new(User)
err = json.Unmarshal(b, user)
err = json.UnmarshalUseNumber(b, user)
t.Assert(err, nil)
t.Assert(user.Name, data["Name"])
t.Assert(user.Scores, data["Scores"])

View File

@ -614,11 +614,11 @@ func TestStrArray_Json(t *testing.T) {
t.Assert(err1, err2)
a2 := garray.NewStrArray()
err1 = json.Unmarshal(b2, &a2)
err1 = json.UnmarshalUseNumber(b2, &a2)
t.Assert(a2.Slice(), s1)
var a3 garray.StrArray
err := json.Unmarshal(b2, &a3)
err := json.UnmarshalUseNumber(b2, &a3)
t.Assert(err, nil)
t.Assert(a3.Slice(), s1)
})
@ -632,11 +632,11 @@ func TestStrArray_Json(t *testing.T) {
t.Assert(err1, err2)
a2 := garray.NewStrArray()
err1 = json.Unmarshal(b2, &a2)
err1 = json.UnmarshalUseNumber(b2, &a2)
t.Assert(a2.Slice(), s1)
var a3 garray.StrArray
err := json.Unmarshal(b2, &a3)
err := json.UnmarshalUseNumber(b2, &a3)
t.Assert(err, nil)
t.Assert(a3.Slice(), s1)
})
@ -654,7 +654,7 @@ func TestStrArray_Json(t *testing.T) {
t.Assert(err, nil)
user := new(User)
err = json.Unmarshal(b, user)
err = json.UnmarshalUseNumber(b, user)
t.Assert(err, nil)
t.Assert(user.Name, data["Name"])
t.Assert(user.Scores, data["Scores"])
@ -673,7 +673,7 @@ func TestStrArray_Json(t *testing.T) {
t.Assert(err, nil)
user := new(User)
err = json.Unmarshal(b, user)
err = json.UnmarshalUseNumber(b, user)
t.Assert(err, nil)
t.Assert(user.Name, data["Name"])
t.Assert(user.Scores, data["Scores"])

View File

@ -656,11 +656,11 @@ func TestSortedArray_Json(t *testing.T) {
t.Assert(err1, err2)
a2 := garray.NewSortedArray(gutil.ComparatorString)
err1 = json.Unmarshal(b2, &a2)
err1 = json.UnmarshalUseNumber(b2, &a2)
t.Assert(a2.Slice(), s2)
var a3 garray.SortedArray
err := json.Unmarshal(b2, &a3)
err := json.UnmarshalUseNumber(b2, &a3)
t.Assert(err, nil)
t.Assert(a3.Slice(), s1)
t.Assert(a3.Interfaces(), s1)
@ -676,11 +676,11 @@ func TestSortedArray_Json(t *testing.T) {
t.Assert(err1, err2)
a2 := garray.NewSortedArray(gutil.ComparatorString)
err1 = json.Unmarshal(b2, &a2)
err1 = json.UnmarshalUseNumber(b2, &a2)
t.Assert(a2.Slice(), s2)
var a3 garray.SortedArray
err := json.Unmarshal(b2, &a3)
err := json.UnmarshalUseNumber(b2, &a3)
t.Assert(err, nil)
t.Assert(a3.Slice(), s1)
t.Assert(a3.Interfaces(), s1)
@ -699,7 +699,7 @@ func TestSortedArray_Json(t *testing.T) {
t.Assert(err, nil)
user := new(User)
err = json.Unmarshal(b, user)
err = json.UnmarshalUseNumber(b, user)
t.Assert(err, nil)
t.Assert(user.Name, data["Name"])
t.AssertNE(user.Scores, nil)
@ -735,7 +735,7 @@ func TestSortedArray_Json(t *testing.T) {
t.Assert(err, nil)
user := new(User)
err = json.Unmarshal(b, user)
err = json.UnmarshalUseNumber(b, user)
t.Assert(err, nil)
t.Assert(user.Name, data["Name"])
t.AssertNE(user.Scores, nil)

View File

@ -557,11 +557,11 @@ func TestSortedIntArray_Json(t *testing.T) {
t.Assert(err1, err2)
a2 := garray.NewSortedIntArray()
err1 = json.Unmarshal(b2, &a2)
err1 = json.UnmarshalUseNumber(b2, &a2)
t.Assert(a2.Slice(), s2)
var a3 garray.SortedIntArray
err := json.Unmarshal(b2, &a3)
err := json.UnmarshalUseNumber(b2, &a3)
t.Assert(err, nil)
t.Assert(a3.Slice(), s1)
})
@ -576,11 +576,11 @@ func TestSortedIntArray_Json(t *testing.T) {
t.Assert(err1, err2)
a2 := garray.NewSortedIntArray()
err1 = json.Unmarshal(b2, &a2)
err1 = json.UnmarshalUseNumber(b2, &a2)
t.Assert(a2.Slice(), s2)
var a3 garray.SortedIntArray
err := json.Unmarshal(b2, &a3)
err := json.UnmarshalUseNumber(b2, &a3)
t.Assert(err, nil)
t.Assert(a3.Slice(), s1)
})
@ -598,7 +598,7 @@ func TestSortedIntArray_Json(t *testing.T) {
t.Assert(err, nil)
user := new(User)
err = json.Unmarshal(b, user)
err = json.UnmarshalUseNumber(b, user)
t.Assert(err, nil)
t.Assert(user.Name, data["Name"])
t.Assert(user.Scores, []int{98, 99, 100})
@ -617,7 +617,7 @@ func TestSortedIntArray_Json(t *testing.T) {
t.Assert(err, nil)
user := new(User)
err = json.Unmarshal(b, user)
err = json.UnmarshalUseNumber(b, user)
t.Assert(err, nil)
t.Assert(user.Name, data["Name"])
t.Assert(user.Scores, []int{98, 99, 100})

View File

@ -577,12 +577,12 @@ func TestSortedStrArray_Json(t *testing.T) {
t.Assert(err1, err2)
a2 := garray.NewSortedStrArray()
err1 = json.Unmarshal(b2, &a2)
err1 = json.UnmarshalUseNumber(b2, &a2)
t.Assert(a2.Slice(), s2)
t.Assert(a2.Interfaces(), s2)
var a3 garray.SortedStrArray
err := json.Unmarshal(b2, &a3)
err := json.UnmarshalUseNumber(b2, &a3)
t.Assert(err, nil)
t.Assert(a3.Slice(), s1)
t.Assert(a3.Interfaces(), s1)
@ -598,12 +598,12 @@ func TestSortedStrArray_Json(t *testing.T) {
t.Assert(err1, err2)
a2 := garray.NewSortedStrArray()
err1 = json.Unmarshal(b2, &a2)
err1 = json.UnmarshalUseNumber(b2, &a2)
t.Assert(a2.Slice(), s2)
t.Assert(a2.Interfaces(), s2)
var a3 garray.SortedStrArray
err := json.Unmarshal(b2, &a3)
err := json.UnmarshalUseNumber(b2, &a3)
t.Assert(err, nil)
t.Assert(a3.Slice(), s1)
t.Assert(a3.Interfaces(), s1)
@ -622,7 +622,7 @@ func TestSortedStrArray_Json(t *testing.T) {
t.Assert(err, nil)
user := new(User)
err = json.Unmarshal(b, user)
err = json.UnmarshalUseNumber(b, user)
t.Assert(err, nil)
t.Assert(user.Name, data["Name"])
t.Assert(user.Scores, []string{"A", "A", "A+"})
@ -641,7 +641,7 @@ func TestSortedStrArray_Json(t *testing.T) {
t.Assert(err, nil)
user := new(User)
err = json.Unmarshal(b, user)
err = json.UnmarshalUseNumber(b, user)
t.Assert(err, nil)
t.Assert(user.Name, data["Name"])
t.Assert(user.Scores, []string{"A", "A", "A+"})

View File

@ -519,7 +519,7 @@ func (l *List) UnmarshalJSON(b []byte) error {
l.list = list.New()
}
var array []interface{}
if err := json.Unmarshal(b, &array); err != nil {
if err := json.UnmarshalUseNumber(b, &array); err != nil {
return err
}
l.PushBacks(array)
@ -536,7 +536,7 @@ func (l *List) UnmarshalValue(value interface{}) (err error) {
var array []interface{}
switch value.(type) {
case string, []byte:
err = json.Unmarshal(gconv.Bytes(value), &array)
err = json.UnmarshalUseNumber(gconv.Bytes(value), &array)
default:
array = gconv.SliceAny(value)
}

View File

@ -711,7 +711,7 @@ func TestList_Json(t *testing.T) {
b, err := json.Marshal(a)
t.Assert(err, nil)
err = json.Unmarshal(b, l)
err = json.UnmarshalUseNumber(b, l)
t.Assert(err, nil)
t.Assert(l.FrontAll(), a)
})
@ -721,7 +721,7 @@ func TestList_Json(t *testing.T) {
b, err := json.Marshal(a)
t.Assert(err, nil)
err = json.Unmarshal(b, &l)
err = json.UnmarshalUseNumber(b, &l)
t.Assert(err, nil)
t.Assert(l.FrontAll(), a)
})

View File

@ -476,7 +476,7 @@ func (m *AnyAnyMap) UnmarshalJSON(b []byte) error {
m.data = make(map[interface{}]interface{})
}
var data map[string]interface{}
if err := json.Unmarshal(b, &data); err != nil {
if err := json.UnmarshalUseNumber(b, &data); err != nil {
return err
}
for k, v := range data {

View File

@ -475,7 +475,7 @@ func (m *IntAnyMap) UnmarshalJSON(b []byte) error {
if m.data == nil {
m.data = make(map[int]interface{})
}
if err := json.Unmarshal(b, &m.data); err != nil {
if err := json.UnmarshalUseNumber(b, &m.data); err != nil {
return err
}
return nil
@ -490,7 +490,7 @@ func (m *IntAnyMap) UnmarshalValue(value interface{}) (err error) {
}
switch value.(type) {
case string, []byte:
return json.Unmarshal(gconv.Bytes(value), &m.data)
return json.UnmarshalUseNumber(gconv.Bytes(value), &m.data)
default:
for k, v := range gconv.Map(value) {
m.data[gconv.Int(k)] = v

View File

@ -446,7 +446,7 @@ func (m *IntIntMap) UnmarshalJSON(b []byte) error {
if m.data == nil {
m.data = make(map[int]int)
}
if err := json.Unmarshal(b, &m.data); err != nil {
if err := json.UnmarshalUseNumber(b, &m.data); err != nil {
return err
}
return nil
@ -461,7 +461,7 @@ func (m *IntIntMap) UnmarshalValue(value interface{}) (err error) {
}
switch value.(type) {
case string, []byte:
return json.Unmarshal(gconv.Bytes(value), &m.data)
return json.UnmarshalUseNumber(gconv.Bytes(value), &m.data)
default:
for k, v := range gconv.Map(value) {
m.data[gconv.Int(k)] = gconv.Int(v)

View File

@ -446,7 +446,7 @@ func (m *IntStrMap) UnmarshalJSON(b []byte) error {
if m.data == nil {
m.data = make(map[int]string)
}
if err := json.Unmarshal(b, &m.data); err != nil {
if err := json.UnmarshalUseNumber(b, &m.data); err != nil {
return err
}
return nil
@ -461,7 +461,7 @@ func (m *IntStrMap) UnmarshalValue(value interface{}) (err error) {
}
switch value.(type) {
case string, []byte:
return json.Unmarshal(gconv.Bytes(value), &m.data)
return json.UnmarshalUseNumber(gconv.Bytes(value), &m.data)
default:
for k, v := range gconv.Map(value) {
m.data[gconv.Int(k)] = gconv.String(v)

View File

@ -471,7 +471,7 @@ func (m *StrAnyMap) UnmarshalJSON(b []byte) error {
if m.data == nil {
m.data = make(map[string]interface{})
}
if err := json.Unmarshal(b, &m.data); err != nil {
if err := json.UnmarshalUseNumber(b, &m.data); err != nil {
return err
}
return nil

View File

@ -449,7 +449,7 @@ func (m *StrIntMap) UnmarshalJSON(b []byte) error {
if m.data == nil {
m.data = make(map[string]int)
}
if err := json.Unmarshal(b, &m.data); err != nil {
if err := json.UnmarshalUseNumber(b, &m.data); err != nil {
return err
}
return nil
@ -464,7 +464,7 @@ func (m *StrIntMap) UnmarshalValue(value interface{}) (err error) {
}
switch value.(type) {
case string, []byte:
return json.Unmarshal(gconv.Bytes(value), &m.data)
return json.UnmarshalUseNumber(gconv.Bytes(value), &m.data)
default:
for k, v := range gconv.Map(value) {
m.data[k] = gconv.Int(v)

View File

@ -449,7 +449,7 @@ func (m *StrStrMap) UnmarshalJSON(b []byte) error {
if m.data == nil {
m.data = make(map[string]string)
}
if err := json.Unmarshal(b, &m.data); err != nil {
if err := json.UnmarshalUseNumber(b, &m.data); err != nil {
return err
}
return nil

View File

@ -530,7 +530,7 @@ func (m *ListMap) UnmarshalJSON(b []byte) error {
m.list = glist.New()
}
var data map[string]interface{}
if err := json.Unmarshal(b, &data); err != nil {
if err := json.UnmarshalUseNumber(b, &data); err != nil {
return err
}
for key, value := range data {

View File

@ -255,7 +255,7 @@ func Test_AnyAnyMap_Json(t *testing.T) {
t.Assert(err, nil)
m := gmap.New()
err = json.Unmarshal(b, m)
err = json.UnmarshalUseNumber(b, m)
t.Assert(err, nil)
t.Assert(m.Get("k1"), data["k1"])
t.Assert(m.Get("k2"), data["k2"])
@ -269,7 +269,7 @@ func Test_AnyAnyMap_Json(t *testing.T) {
t.Assert(err, nil)
var m gmap.Map
err = json.Unmarshal(b, &m)
err = json.UnmarshalUseNumber(b, &m)
t.Assert(err, nil)
t.Assert(m.Get("k1"), data["k1"])
t.Assert(m.Get("k2"), data["k2"])

View File

@ -245,7 +245,7 @@ func Test_IntAnyMap_Json(t *testing.T) {
t.Assert(err, nil)
m := gmap.NewIntAnyMap()
err = json.Unmarshal(b, m)
err = json.UnmarshalUseNumber(b, m)
t.Assert(err, nil)
t.Assert(m.Get(1), data[1])
t.Assert(m.Get(2), data[2])

View File

@ -251,7 +251,7 @@ func Test_IntIntMap_Json(t *testing.T) {
t.Assert(err, nil)
m := gmap.NewIntIntMap()
err = json.Unmarshal(b, m)
err = json.UnmarshalUseNumber(b, m)
t.Assert(err, nil)
t.Assert(m.Get(1), data[1])
t.Assert(m.Get(2), data[2])

View File

@ -249,7 +249,7 @@ func Test_IntStrMap_Json(t *testing.T) {
t.Assert(err, nil)
m := gmap.NewIntStrMap()
err = json.Unmarshal(b, m)
err = json.UnmarshalUseNumber(b, m)
t.Assert(err, nil)
t.Assert(m.Get(1), data[1])
t.Assert(m.Get(2), data[2])

View File

@ -204,7 +204,7 @@ func Test_ListMap_Json(t *testing.T) {
t.Assert(err, nil)
m := gmap.NewListMap()
err = json.Unmarshal(b, m)
err = json.UnmarshalUseNumber(b, m)
t.Assert(err, nil)
t.Assert(m.Get("k1"), data["k1"])
t.Assert(m.Get("k2"), data["k2"])
@ -219,7 +219,7 @@ func Test_ListMap_Json(t *testing.T) {
t.Assert(err, nil)
var m gmap.ListMap
err = json.Unmarshal(b, &m)
err = json.UnmarshalUseNumber(b, &m)
t.Assert(err, nil)
t.Assert(m.Get("k1"), data["k1"])
t.Assert(m.Get("k2"), data["k2"])

View File

@ -243,7 +243,7 @@ func Test_StrAnyMap_Json(t *testing.T) {
t.Assert(err, nil)
m := gmap.NewStrAnyMap()
err = json.Unmarshal(b, m)
err = json.UnmarshalUseNumber(b, m)
t.Assert(err, nil)
t.Assert(m.Get("k1"), data["k1"])
t.Assert(m.Get("k2"), data["k2"])
@ -257,7 +257,7 @@ func Test_StrAnyMap_Json(t *testing.T) {
t.Assert(err, nil)
var m gmap.StrAnyMap
err = json.Unmarshal(b, &m)
err = json.UnmarshalUseNumber(b, &m)
t.Assert(err, nil)
t.Assert(m.Get("k1"), data["k1"])
t.Assert(m.Get("k2"), data["k2"])

View File

@ -247,7 +247,7 @@ func Test_StrIntMap_Json(t *testing.T) {
t.Assert(err, nil)
m := gmap.NewStrIntMap()
err = json.Unmarshal(b, m)
err = json.UnmarshalUseNumber(b, m)
t.Assert(err, nil)
t.Assert(m.Get("k1"), data["k1"])
t.Assert(m.Get("k2"), data["k2"])
@ -261,7 +261,7 @@ func Test_StrIntMap_Json(t *testing.T) {
t.Assert(err, nil)
var m gmap.StrIntMap
err = json.Unmarshal(b, &m)
err = json.UnmarshalUseNumber(b, &m)
t.Assert(err, nil)
t.Assert(m.Get("k1"), data["k1"])
t.Assert(m.Get("k2"), data["k2"])

View File

@ -244,7 +244,7 @@ func Test_StrStrMap_Json(t *testing.T) {
t.Assert(err, nil)
m := gmap.NewStrStrMap()
err = json.Unmarshal(b, m)
err = json.UnmarshalUseNumber(b, m)
t.Assert(err, nil)
t.Assert(m.Get("k1"), data["k1"])
t.Assert(m.Get("k2"), data["k2"])
@ -258,7 +258,7 @@ func Test_StrStrMap_Json(t *testing.T) {
t.Assert(err, nil)
var m gmap.StrStrMap
err = json.Unmarshal(b, &m)
err = json.UnmarshalUseNumber(b, &m)
t.Assert(err, nil)
t.Assert(m.Get("k1"), data["k1"])
t.Assert(m.Get("k2"), data["k2"])

View File

@ -188,7 +188,7 @@ func Test_TreeMap_Json(t *testing.T) {
t.Assert(err, nil)
m := gmap.NewTreeMap(gutil.ComparatorString)
err = json.Unmarshal(b, m)
err = json.UnmarshalUseNumber(b, m)
t.Assert(err, nil)
t.Assert(m.Get("k1"), data["k1"])
t.Assert(m.Get("k2"), data["k2"])
@ -202,7 +202,7 @@ func Test_TreeMap_Json(t *testing.T) {
t.Assert(err, nil)
var m gmap.TreeMap
err = json.Unmarshal(b, &m)
err = json.UnmarshalUseNumber(b, &m)
t.Assert(err, nil)
t.Assert(m.Get("k1"), data["k1"])
t.Assert(m.Get("k2"), data["k2"])

View File

@ -35,10 +35,8 @@ type Queue struct {
}
const (
// Size for queue buffer.
gDEFAULT_QUEUE_SIZE = 10000
// Max batch size per-fetching from list.
gDEFAULT_MAX_BATCH_SIZE = 10
defaultQueueSize = 10000 // Size for queue buffer.
defaultBatchSize = 10 // Max batch size per-fetching from list.
)
// New returns an empty queue object.
@ -54,7 +52,7 @@ func New(limit ...int) *Queue {
} else {
q.list = glist.New(true)
q.events = make(chan struct{}, math.MaxInt32)
q.C = make(chan interface{}, gDEFAULT_QUEUE_SIZE)
q.C = make(chan interface{}, defaultQueueSize)
go q.asyncLoopFromListToChannel()
}
return q
@ -72,8 +70,8 @@ func (q *Queue) asyncLoopFromListToChannel() {
<-q.events
for !q.closed.Val() {
if length := q.list.Len(); length > 0 {
if length > gDEFAULT_MAX_BATCH_SIZE {
length = gDEFAULT_MAX_BATCH_SIZE
if length > defaultBatchSize {
length = defaultBatchSize
}
for _, v := range q.list.PopFronts(length) {
// When q.C is closed, it will panic here, especially q.C is being blocked for writing.
@ -101,7 +99,7 @@ func (q *Queue) Push(v interface{}) {
q.C <- v
} else {
q.list.PushBack(v)
if len(q.events) < gDEFAULT_QUEUE_SIZE {
if len(q.events) < defaultQueueSize {
q.events <- struct{}{}
}
}
@ -124,14 +122,14 @@ func (q *Queue) Close() {
if q.limit > 0 {
close(q.C)
}
for i := 0; i < gDEFAULT_MAX_BATCH_SIZE; i++ {
for i := 0; i < defaultBatchSize; i++ {
q.Pop()
}
}
// Len returns the length of the queue.
// Note that the result might not be accurate as there's a
// asynchronize channel reading the list constantly.
// asynchronous channel reading the list constantly.
func (q *Queue) Len() (length int) {
if q.list != nil {
length += q.list.Len()

View File

@ -477,7 +477,7 @@ func (set *Set) UnmarshalJSON(b []byte) error {
set.data = make(map[interface{}]struct{})
}
var array []interface{}
if err := json.Unmarshal(b, &array); err != nil {
if err := json.UnmarshalUseNumber(b, &array); err != nil {
return err
}
for _, v := range array {
@ -496,7 +496,7 @@ func (set *Set) UnmarshalValue(value interface{}) (err error) {
var array []interface{}
switch value.(type) {
case string, []byte:
err = json.Unmarshal(gconv.Bytes(value), &array)
err = json.UnmarshalUseNumber(gconv.Bytes(value), &array)
default:
array = gconv.SliceAny(value)
}

View File

@ -437,7 +437,7 @@ func (set *IntSet) UnmarshalJSON(b []byte) error {
set.data = make(map[int]struct{})
}
var array []int
if err := json.Unmarshal(b, &array); err != nil {
if err := json.UnmarshalUseNumber(b, &array); err != nil {
return err
}
for _, v := range array {
@ -456,7 +456,7 @@ func (set *IntSet) UnmarshalValue(value interface{}) (err error) {
var array []int
switch value.(type) {
case string, []byte:
err = json.Unmarshal(gconv.Bytes(value), &array)
err = json.UnmarshalUseNumber(gconv.Bytes(value), &array)
default:
array = gconv.SliceInt(value)
}

View File

@ -465,7 +465,7 @@ func (set *StrSet) UnmarshalJSON(b []byte) error {
set.data = make(map[string]struct{})
}
var array []string
if err := json.Unmarshal(b, &array); err != nil {
if err := json.UnmarshalUseNumber(b, &array); err != nil {
return err
}
for _, v := range array {
@ -484,7 +484,7 @@ func (set *StrSet) UnmarshalValue(value interface{}) (err error) {
var array []string
switch value.(type) {
case string, []byte:
err = json.Unmarshal(gconv.Bytes(value), &array)
err = json.UnmarshalUseNumber(gconv.Bytes(value), &array)
default:
array = gconv.SliceStr(value)
}

View File

@ -327,7 +327,7 @@ func TestSet_Json(t *testing.T) {
t.Assert(err1, err2)
a2 := gset.New()
err2 = json.Unmarshal(b2, &a2)
err2 = json.UnmarshalUseNumber(b2, &a2)
t.Assert(err2, nil)
t.Assert(a2.Contains("a"), true)
t.Assert(a2.Contains("b"), true)
@ -336,7 +336,7 @@ func TestSet_Json(t *testing.T) {
t.Assert(a2.Contains("e"), false)
var a3 gset.Set
err := json.Unmarshal(b2, &a3)
err := json.UnmarshalUseNumber(b2, &a3)
t.Assert(err, nil)
t.Assert(a3.Contains("a"), true)
t.Assert(a3.Contains("b"), true)

View File

@ -358,7 +358,7 @@ func TestIntSet_Json(t *testing.T) {
t.Assert(err1, err2)
a2 := gset.NewIntSet()
err2 = json.Unmarshal(b2, &a2)
err2 = json.UnmarshalUseNumber(b2, &a2)
t.Assert(err2, nil)
t.Assert(a2.Contains(1), true)
t.Assert(a2.Contains(2), true)
@ -367,7 +367,7 @@ func TestIntSet_Json(t *testing.T) {
t.Assert(a2.Contains(5), false)
var a3 gset.IntSet
err := json.Unmarshal(b2, &a3)
err := json.UnmarshalUseNumber(b2, &a3)
t.Assert(err, nil)
t.Assert(a2.Contains(1), true)
t.Assert(a2.Contains(2), true)

View File

@ -404,7 +404,7 @@ func TestStrSet_Json(t *testing.T) {
t.Assert(err1, err2)
a2 := gset.NewStrSet()
err2 = json.Unmarshal(b2, &a2)
err2 = json.UnmarshalUseNumber(b2, &a2)
t.Assert(err2, nil)
t.Assert(a2.Contains("a"), true)
t.Assert(a2.Contains("b"), true)
@ -413,7 +413,7 @@ func TestStrSet_Json(t *testing.T) {
t.Assert(a2.Contains("e"), false)
var a3 gset.StrSet
err := json.Unmarshal(b2, &a3)
err := json.UnmarshalUseNumber(b2, &a3)
t.Assert(err, nil)
t.Assert(a3.Contains("a"), true)
t.Assert(a3.Contains("b"), true)

View File

@ -7,5 +7,4 @@
// Package gtree provides concurrent-safe/unsafe tree containers.
//
// Some implements are from: https://github.com/emirpasic/gods
// Thanks!
package gtree

View File

@ -937,7 +937,7 @@ func (tree *RedBlackTree) UnmarshalJSON(b []byte) error {
tree.comparator = gutil.ComparatorString
}
var data map[string]interface{}
if err := json.Unmarshal(b, &data); err != nil {
if err := json.UnmarshalUseNumber(b, &data); err != nil {
return err
}
for k, v := range data {

View File

@ -58,7 +58,7 @@ func (v *Interface) MarshalJSON() ([]byte, error) {
// UnmarshalJSON implements the interface UnmarshalJSON for json.Unmarshal.
func (v *Interface) UnmarshalJSON(b []byte) error {
var i interface{}
err := json.Unmarshal(b, &i)
err := json.UnmarshalUseNumber(b, &i)
if err != nil {
return err
}

View File

@ -55,16 +55,16 @@ func Test_Bool_JSON(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
var err error
i := gtype.NewBool()
err = json.Unmarshal([]byte("true"), &i)
err = json.UnmarshalUseNumber([]byte("true"), &i)
t.Assert(err, nil)
t.Assert(i.Val(), true)
err = json.Unmarshal([]byte("false"), &i)
err = json.UnmarshalUseNumber([]byte("false"), &i)
t.Assert(err, nil)
t.Assert(i.Val(), false)
err = json.Unmarshal([]byte("1"), &i)
err = json.UnmarshalUseNumber([]byte("1"), &i)
t.Assert(err, nil)
t.Assert(i.Val(), true)
err = json.Unmarshal([]byte("0"), &i)
err = json.UnmarshalUseNumber([]byte("0"), &i)
t.Assert(err, nil)
t.Assert(i.Val(), false)
})
@ -78,7 +78,7 @@ func Test_Bool_JSON(t *testing.T) {
t.Assert(b1, b2)
i2 := gtype.NewBool()
err := json.Unmarshal(b2, &i2)
err := json.UnmarshalUseNumber(b2, &i2)
t.Assert(err, nil)
t.Assert(i2.Val(), i.Val())
})
@ -91,7 +91,7 @@ func Test_Bool_JSON(t *testing.T) {
t.Assert(b1, b2)
i2 := gtype.NewBool()
err := json.Unmarshal(b2, &i2)
err := json.UnmarshalUseNumber(b2, &i2)
t.Assert(err, nil)
t.Assert(i2.Val(), i.Val())
})

View File

@ -53,7 +53,7 @@ func Test_Byte_JSON(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
var err error
i := gtype.NewByte()
err = json.Unmarshal([]byte("49"), &i)
err = json.UnmarshalUseNumber([]byte("49"), &i)
t.Assert(err, nil)
t.Assert(i.Val(), "49")
})

View File

@ -39,7 +39,7 @@ func Test_Bytes_JSON(t *testing.T) {
t.Assert(b1, b2)
i2 := gtype.NewBytes()
err := json.Unmarshal(b2, &i2)
err := json.UnmarshalUseNumber(b2, &i2)
t.Assert(err, nil)
t.Assert(i2.Val(), b)
})

View File

@ -40,7 +40,7 @@ func Test_Float32_JSON(t *testing.T) {
t.Assert(b1, b2)
i2 := gtype.NewFloat32()
err := json.Unmarshal(b2, &i2)
err := json.UnmarshalUseNumber(b2, &i2)
t.Assert(err, nil)
t.Assert(i2.Val(), v)
})

View File

@ -38,7 +38,7 @@ func Test_Float64_JSON(t *testing.T) {
t.Assert(b1, b2)
i2 := gtype.NewFloat64()
err := json.Unmarshal(b2, &i2)
err := json.UnmarshalUseNumber(b2, &i2)
t.Assert(err, nil)
t.Assert(i2.Val(), v)
})

View File

@ -51,7 +51,7 @@ func Test_Int32_JSON(t *testing.T) {
t.Assert(b1, b2)
i2 := gtype.NewInt32()
err := json.Unmarshal(b2, &i2)
err := json.UnmarshalUseNumber(b2, &i2)
t.Assert(err, nil)
t.Assert(i2.Val(), v)
})

View File

@ -50,7 +50,7 @@ func Test_Int64_JSON(t *testing.T) {
t.Assert(b1, b2)
i2 := gtype.NewInt64()
err := json.Unmarshal(b2, &i2)
err := json.UnmarshalUseNumber(b2, &i2)
t.Assert(err, nil)
t.Assert(i2.Val(), i)
})

View File

@ -50,7 +50,7 @@ func Test_Int_JSON(t *testing.T) {
t.Assert(b1, b2)
i2 := gtype.NewInt()
err := json.Unmarshal(b2, &i2)
err := json.UnmarshalUseNumber(b2, &i2)
t.Assert(err, nil)
t.Assert(i2.Val(), v)
})

View File

@ -40,7 +40,7 @@ func Test_Interface_JSON(t *testing.T) {
t.Assert(b1, b2)
i2 := gtype.New()
err := json.Unmarshal(b2, &i2)
err := json.UnmarshalUseNumber(b2, &i2)
t.Assert(err, nil)
t.Assert(i2.Val(), s)
})

View File

@ -38,7 +38,7 @@ func Test_String_JSON(t *testing.T) {
t.Assert(b1, b2)
i2 := gtype.NewString()
err := json.Unmarshal(b2, &i2)
err := json.UnmarshalUseNumber(b2, &i2)
t.Assert(err, nil)
t.Assert(i2.Val(), s)
})

View File

@ -50,7 +50,7 @@ func Test_Uint32_JSON(t *testing.T) {
t.Assert(b1, b2)
i2 := gtype.NewUint32()
err := json.Unmarshal(b2, &i2)
err := json.UnmarshalUseNumber(b2, &i2)
t.Assert(err, nil)
t.Assert(i2.Val(), i)
})

View File

@ -55,7 +55,7 @@ func Test_Uint64_JSON(t *testing.T) {
t.Assert(b1, b2)
i2 := gtype.NewUint64()
err := json.Unmarshal(b2, &i2)
err := json.UnmarshalUseNumber(b2, &i2)
t.Assert(err, nil)
t.Assert(i2.Val(), i)
})

View File

@ -49,7 +49,7 @@ func Test_Uint_JSON(t *testing.T) {
t.Assert(b1, b2)
i2 := gtype.NewUint()
err := json.Unmarshal(b2, &i2)
err := json.UnmarshalUseNumber(b2, &i2)
t.Assert(err, nil)
t.Assert(i2.Val(), i)
})

View File

@ -189,7 +189,7 @@ func (v *Var) MarshalJSON() ([]byte, error) {
// UnmarshalJSON implements the interface UnmarshalJSON for json.Unmarshal.
func (v *Var) UnmarshalJSON(b []byte) error {
var i interface{}
err := json.Unmarshal(b, &i)
err := json.UnmarshalUseNumber(b, &i)
if err != nil {
return err
}

View File

@ -71,13 +71,6 @@ func (v *Var) MapToMap(pointer interface{}, mapping ...map[string]string) (err e
return gconv.MapToMap(v.Val(), pointer, mapping...)
}
// MapToMapDeep converts any map type variable <params> to another map type variable
// <pointer> recursively.
// See gconv.MapToMapDeep.
func (v *Var) MapToMapDeep(pointer interface{}, mapping ...map[string]string) (err error) {
return gconv.MapToMapDeep(v.Val(), pointer, mapping...)
}
// MapToMaps converts any map type variable <params> to another map type variable <pointer>.
// See gconv.MapToMaps.
func (v *Var) MapToMaps(pointer interface{}, mapping ...map[string]string) (err error) {

View File

@ -245,12 +245,57 @@ func Test_Duration(t *testing.T) {
})
}
func Test_UnmarshalValue(t *testing.T) {
type V struct {
Name string
Var *gvar.Var
}
func Test_UnmarshalJson(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
type V struct {
Name string
Var *gvar.Var
}
var v *V
err := gconv.Struct(map[string]interface{}{
"name": "john",
"var": "v",
}, &v)
t.Assert(err, nil)
t.Assert(v.Name, "john")
t.Assert(v.Var.String(), "v")
})
gtest.C(t, func(t *gtest.T) {
type V struct {
Name string
Var gvar.Var
}
var v *V
err := gconv.Struct(map[string]interface{}{
"name": "john",
"var": "v",
}, &v)
t.Assert(err, nil)
t.Assert(v.Name, "john")
t.Assert(v.Var.String(), "v")
})
}
func Test_UnmarshalValue(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
type V struct {
Name string
Var *gvar.Var
}
var v *V
err := gconv.Struct(map[string]interface{}{
"name": "john",
"var": "v",
}, &v)
t.Assert(err, nil)
t.Assert(v.Name, "john")
t.Assert(v.Var.String(), "v")
})
gtest.C(t, func(t *gtest.T) {
type V struct {
Name string
Var gvar.Var
}
var v *V
err := gconv.Struct(map[string]interface{}{
"name": "john",

Some files were not shown because too many files have changed in this diff Show More