diff --git a/g/container/garray/garray_sorted_int.go b/g/container/garray/garray_sorted_int.go index 6506004d9..8d66f4d76 100644 --- a/g/container/garray/garray_sorted_int.go +++ b/g/container/garray/garray_sorted_int.go @@ -153,16 +153,14 @@ func (a *SortedIntArray) binSearch(value int, lock bool) (index int, result int) max := len(a.array) - 1 mid := 0 cmp := -2 - for { + for min <= max { mid = int((min + max) / 2) cmp = a.compareFunc(value, a.array[mid]) switch cmp { case -1 : max = mid - 1 - case 0 : case 1 : min = mid + 1 - } - if cmp == 0 || min >= max { - break + case 0 : + return mid, cmp } } return mid, cmp diff --git a/g/container/garray/garray_sorted_interface.go b/g/container/garray/garray_sorted_interface.go index 0211366ca..e83d1bbf0 100644 --- a/g/container/garray/garray_sorted_interface.go +++ b/g/container/garray/garray_sorted_interface.go @@ -146,16 +146,14 @@ func (a *SortedArray) binSearch(value interface{}, lock bool)(index int, result max := len(a.array) - 1 mid := 0 cmp := -2 - for { + for min <= max { mid = int((min + max) / 2) cmp = a.compareFunc(value, a.array[mid]) switch cmp { case -1 : max = mid - 1 - case 0 : case 1 : min = mid + 1 - } - if cmp == 0 || min >= max { - break + case 0 : + return mid, cmp } } return mid, cmp diff --git a/g/container/garray/garray_sorted_string.go b/g/container/garray/garray_sorted_string.go index 6f0d4889a..2d4acc116 100644 --- a/g/container/garray/garray_sorted_string.go +++ b/g/container/garray/garray_sorted_string.go @@ -147,16 +147,14 @@ func (a *SortedStringArray) binSearch(value string, lock bool) (index int, resul max := len(a.array) - 1 mid := 0 cmp := -2 - for { + for min <= max { mid = int((min + max) / 2) cmp = a.compareFunc(value, a.array[mid]) switch cmp { case -1 : max = mid - 1 - case 0 : case 1 : min = mid + 1 - } - if cmp == 0 || min >= max { - break + case 0 : + return mid, cmp } } return mid, cmp diff --git a/g/container/garray/garray_test.go b/g/container/garray/garray_test.go index dcfc0b47e..ddbed30a2 100644 --- a/g/container/garray/garray_test.go +++ b/g/container/garray/garray_test.go @@ -9,18 +9,76 @@ package garray_test import ( - "fmt" "gitee.com/johng/gf/g/container/garray" + "gitee.com/johng/gf/g/util/gconv" + "gitee.com/johng/gf/g/util/gtest" + "strings" "testing" ) -func TestArray_Unique(t *testing.T) { +func Test_IntArray_Unique(t *testing.T) { expect := []int{1, 2, 3, 4, 5, 6} array := garray.NewIntArray(0, 0) array.Append(1, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6) array.Unique() - if fmt.Sprint(array.Slice()) != fmt.Sprint(expect) { - t.Errorf("get: %v, expect: %v\n", array.Slice(), expect) - } + gtest.Assert(array.Slice(), expect) } + +func Test_SortedIntArray1(t *testing.T) { + expect := []int{0,1,2,3,4,5,6,7,8,9,10} + array := garray.NewSortedIntArray(0) + for i := 10; i > -1; i-- { + array.Add(i) + } + gtest.Assert(array.Slice(), expect) +} + +func Test_SortedIntArray2(t *testing.T) { + expect := []int{0,1,2,3,4,5,6,7,8,9,10} + array := garray.NewSortedIntArray(0) + for i := 0; i <= 10; i++ { + array.Add(i) + } + gtest.Assert(array.Slice(), expect) +} + +func Test_SortedStringArray1(t *testing.T) { + expect := []string{"0","1","10","2","3","4","5","6","7","8","9"} + array := garray.NewSortedStringArray(0) + for i := 10; i > -1; i-- { + array.Add(gconv.String(i)) + } + gtest.Assert(array.Slice(), expect) +} + +func Test_SortedStringArray2(t *testing.T) { + expect := []string{"0","1","10","2","3","4","5","6","7","8","9"} + array := garray.NewSortedStringArray(0) + for i := 0; i <= 10; i++ { + array.Add(gconv.String(i)) + } + gtest.Assert(array.Slice(), expect) +} + +func Test_SortedArray1(t *testing.T) { + expect := []string{"0","1","10","2","3","4","5","6","7","8","9"} + array := garray.NewSortedArray(0, func(v1, v2 interface{}) int { + return strings.Compare(gconv.String(v1), gconv.String(v2)) + }) + for i := 10; i > -1; i-- { + array.Add(gconv.String(i)) + } + gtest.Assert(array.Slice(), expect) +} + +func Test_SortedArray2(t *testing.T) { + expect := []string{"0","1","10","2","3","4","5","6","7","8","9"} + array := garray.NewSortedArray(0, func(v1, v2 interface{}) int { + return strings.Compare(gconv.String(v1), gconv.String(v2)) + }) + for i := 0; i <= 10; i++ { + array.Add(gconv.String(i)) + } + gtest.Assert(array.Slice(), expect) +} \ No newline at end of file diff --git a/geg/container/garray/sorted_string_array1.go b/geg/container/garray/sorted_string_array1.go new file mode 100644 index 000000000..8bb72ff2c --- /dev/null +++ b/geg/container/garray/sorted_string_array1.go @@ -0,0 +1,20 @@ +package main + +import ( + "gitee.com/johng/gf/g" + "gitee.com/johng/gf/g/container/garray" +) + +func main() { + array := garray.NewSortedStringArray(0, false) + array.Add("1") + array.Add("2") + array.Add("3") + array.Add("4") + array.Add("5") + array.Add("6") + array.Add("7") + array.Add("8") + array.Add("9") + g.Dump(array.Slice()) +} \ No newline at end of file diff --git a/geg/container/garray/sorted_string_array2.go b/geg/container/garray/sorted_string_array2.go new file mode 100644 index 000000000..53316ce5a --- /dev/null +++ b/geg/container/garray/sorted_string_array2.go @@ -0,0 +1,26 @@ +package main + +import ( + "fmt" + "gitee.com/johng/gf/g" + "gitee.com/johng/gf/g/container/garray" + "strings" +) + +func main() { + array := garray.NewSortedStringArray(0, false) + array.Add("/api/ctl/show") + array.Add("/api/ctl/post") + array.Add("/api/obj/rest") + array.Add("/api/handler") + array.Add("/api/obj/delete") + array.Add("/api/obj/show") + array.Add("/api/obj/my-show") + array.Add("/api/*") + array.Add("/api/ctl/rest") + array.Add("/api/ctl/my-show") + g.Dump(array.Slice()) + + fmt.Println(strings.Compare("/api/ctl/post", "/api/*")) + fmt.Println(strings.Compare("/api/*", "/api/ctl/my-show")) +} \ No newline at end of file diff --git a/geg/net/ghttp/server/router/group/group1.go b/geg/net/ghttp/server/router/group/group1.go index 9fb924873..8cff787fd 100644 --- a/geg/net/ghttp/server/router/group/group1.go +++ b/geg/net/ghttp/server/router/group/group1.go @@ -42,19 +42,19 @@ func main() { ctl := new(Controller) // 分组路由方法注册 - g := s.Group("/api") - g.ALL ("*", HookHandler, ghttp.HOOK_BEFORE_SERVE) - g.ALL ("/handler", Handler) - g.ALL ("/ctl", ctl) - g.GET ("/ctl/my-show", ctl, "Show") - g.REST("/ctl/rest", ctl) - g.ALL ("/obj", obj) - g.GET ("/obj/my-show", obj, "Show") - g.REST("/obj/rest", obj) + //g := s.Group("/api") + //g.ALL ("*", HookHandler, ghttp.HOOK_BEFORE_SERVE) + //g.ALL ("/handler", Handler) + //g.ALL ("/ctl", ctl) + //g.GET ("/ctl/my-show", ctl, "Show") + //g.REST("/ctl/rest", ctl) + //g.ALL ("/obj", obj) + //g.GET ("/obj/my-show", obj, "Show") + //g.REST("/obj/rest", obj) // 分组路由批量注册 s.Group("/api").Bind("/api", []ghttp.GroupItem{ - {"ALL", "*", HookHandler, ghttp.HOOK_BEFORE_SERVE}, + {"ALL", "/handler", Handler}, {"ALL", "/ctl", ctl}, {"GET", "/ctl/my-show", ctl, "Show"}, @@ -62,6 +62,7 @@ func main() { {"ALL", "/obj", obj}, {"GET", "/obj/my-show", obj, "Show"}, {"REST", "/obj/rest", obj}, + {"ALL", "*", HookHandler, ghttp.HOOK_BEFORE_SERVE}, }) s.SetPort(8199)