日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
GoFrame的數(shù)組比PHP的數(shù)組還好用???

前言

寫(xiě)過(guò)PHP的同學(xué)都知道 PHP的數(shù)組Array非常好用,特別靈活。

10年積累的做網(wǎng)站、成都網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有洛隆免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

我在寫(xiě)PHP之前使用Java做安卓開(kāi)發(fā),在接觸PHP的數(shù)組Array之后,直呼太香了!

而在學(xué)習(xí)Go基礎(chǔ)知識(shí)的時(shí)候了解到Go的數(shù)組和PHP的數(shù)組并不一樣;從一定程度上講,Go的slice切片類(lèi)型和PHP的數(shù)組array比較像(不固定長(zhǎng)度、引用類(lèi)型、動(dòng)態(tài)擴(kuò)容等),但是在開(kāi)發(fā)使用中遠(yuǎn)遠(yuǎn)不像PHP的array靈活。

初識(shí)GoFrame

最近在使用基于Go語(yǔ)言的GoFrame框架擼項(xiàng)目,發(fā)現(xiàn)GoFrame封裝的garray竟然比PHP的array還要好用。

近期已經(jīng)更新了一系列GoFrame的文章,下文將GoFrame簡(jiǎn)稱為gf。感興趣的同學(xué)可以關(guān)注我的專(zhuān)欄:Go語(yǔ)言學(xué)習(xí)專(zhuān)欄 ,目前已經(jīng)更新了120多篇原創(chuàng)文章,獲得了700多位同學(xué)的關(guān)注。

gf框架有個(gè)特點(diǎn),提供的組件基本都支持設(shè)置并發(fā)安全開(kāi)關(guān)。顯然PHP是不支持并發(fā)安全開(kāi)關(guān)的,PHP的數(shù)組是并發(fā)安全的。PHP-FPM是阻塞的單線程模型,PHP-FPM每個(gè)進(jìn)程里只有一個(gè)線程,一個(gè)進(jìn)程同時(shí)只能服務(wù)一個(gè)客戶端。

garray特點(diǎn)簡(jiǎn)介

  • garray支持int/string/interface{}三種常用的數(shù)據(jù)類(lèi)型。
  • garray支持普通數(shù)組和排序數(shù)組,普通數(shù)組的結(jié)構(gòu)體名稱定義為Array格式,排序數(shù)組的結(jié)構(gòu)體名稱定義為SortedArray格式,如下:Array, intArray, StrArray,SortedArray, SortedIntArray, SortedStrArray
  • 其中排序數(shù)組SortedArray,需要給定排序比較方法,在工具包gutil中也定義了很多ComparatorXXX的比較方法,用起來(lái)很方便。當(dāng)然也支持自定義排序方式。

基本使用

package main

import (
"fmt"
"github.com/gogf/gf/container/garray"
)

func main() {
//創(chuàng)建并發(fā)安全的int型數(shù)組
a := garray.NewIntArray(true)
//添加數(shù)組項(xiàng)
for i := 0; i < 10; i++ {
a.Append(i)
}
// 打印結(jié)果:
fmt.Println(a) //"[0,1,2,3,4,5,6,7,8,9]"

fmt.Println("數(shù)組長(zhǎng)度:", a.Len())
fmt.Println("數(shù)組的值:", a.Slice())
fmt.Println((a.Get(5))) //根據(jù)索引取值 返回值和是否取到了值 5 true

// 在指定索引前后插入值
_ = a.InsertAfter(9, 10)
_ = a.InsertBefore(0, -1)
fmt.Println(a.Slice())

// 搜索數(shù)據(jù)項(xiàng),返回對(duì)應(yīng)的索引
fmt.Println("搜索值,返回對(duì)應(yīng)索引:", a.Search(5))

// 刪除
a.Remove(0)
fmt.Println(a.Slice())

// 并發(fā)安全 寫(xiě)鎖操作
a.LockFunc(func(array []int) {
//將最后一項(xiàng)的值改為100
array[len(array)-1] = 100
})
fmt.Println(a) //"[0,1,2,3,4,5,6,7,8,9,100]"

// 并發(fā)安全 讀鎖操作
a.RLockFunc(func(array []int) {
fmt.Println(array[len(array)-1]) //100
})

// 清空數(shù)組
a.Clear()
fmt.Println("清空數(shù)組之后:", a.Slice())
}

打印結(jié)果

數(shù)組出棧

  • 數(shù)組出棧使用Pop*關(guān)鍵字
  • 數(shù)組可以按順序出棧,而gf提供的另外一個(gè)數(shù)據(jù)類(lèi)型gmap的pop*方法是隨機(jī)出棧 (關(guān)注我,會(huì)在后續(xù)的文章中更新說(shuō)明)
  • garray中隨機(jī)出棧,我們可以使用rand()或者popRand()
package main

import (
"fmt"
"github.com/gogf/gf/container/garray"
"github.com/gogf/gf/frame/g"
)

//數(shù)組出棧 pop 數(shù)組可以按順序出棧 map的pop是隨機(jī)出棧
func main() {
a := garray.NewFrom([]interface{}{1, 2, 3, 4, 5, 6})
fmt.Println(a.PopLeft())
fmt.Println(a.PopLefts(2))
fmt.Println(a.PopRight())
fmt.Println(a.PopRights(2))
fmt.Println(a) //全部出棧后 數(shù)組為空
/**
打印結(jié)果:
1 true
[2 3]
6 true
[4 5]
[]
*/

// 有什么辦法能像map一樣隨機(jī)出棧呢? 在garray中我們使用rand()或者popRand()
a1 := garray.NewFrom(g.Slice{1, 2, 3, 4, 5, 6, 7})
fmt.Println("----------")
fmt.Println(a1.Rand()) //隨機(jī)取值
fmt.Println(a1.PopRands(2)) //隨機(jī)出棧
fmt.Println(a1)

}

包含判斷

  • 注意:Contains()是區(qū)分大小寫(xiě)
  • 空值過(guò)濾使用:FilterEmpty
  • nil過(guò)濾使用:FilterNil
package main

import (
"github.com/gogf/gf/container/garray"
"github.com/gogf/gf/frame/g"
)

//包含 contains 區(qū)分大小寫(xiě)
func main() {
var a garray.Array
a.Append("a")
g.Dump(a.Contains("a")) //true
g.Dump(a.Contains("A")) //false

// 空值過(guò)濾
a1 := garray.NewFrom([]interface{}{0, 1, "2", nil, false, g.Slice{}, "王中陽(yáng)"})
a2 := garray.NewFrom([]interface{}{0, 1, "2", nil, false, g.Slice{}, "王中陽(yáng)"})
g.Dump("empty過(guò)濾:", a1.FilterEmpty()) //empty過(guò)濾:"[1,2,"王中陽(yáng)"]"
g.Dump("nil過(guò)濾:", a2.FilterNil()) //nil過(guò)濾:"[0,1,2,"false","[]","王中陽(yáng)"]"

a3 := garray.NewFrom([]interface{}{1, 2, 3, 4, 5, 6, 7})

g.Dump("數(shù)組翻轉(zhuǎn):", a3.Reverse())

g.Dump("數(shù)組隨機(jī)排序:", a3.Shuffle())
}

打印結(jié)果

排序數(shù)組

我們可以自定義NewSortedArray的排序規(guī)則,以實(shí)現(xiàn)是升序數(shù)組還是降序數(shù)組;

排序數(shù)組還有唯一性校驗(yàn)的功能:garray.SetUnique(true)

gf框架的gutil工具包定義好了常用的排序規(guī)則

package main

import (
"github.com/gogf/gf/container/garray"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/util/gutil"
)

//我們可以自定義NewSortedArray的排序規(guī)則,以實(shí)現(xiàn)是升序數(shù)組還是降序數(shù)組;排序數(shù)組還有唯一性校驗(yàn)的功能
func main() {
//自定義排序數(shù)組:降序排列
a := garray.NewSortedArray(func(a, b interface{}) int {
if a.(int) < b.(int) {
return 1
}
if a.(int) > b.(int) {
return -1
}
return 0
})
// 排序規(guī)格可以使用gutil中定義好的
a.Add(2) //數(shù)組的賦值用add map的賦值用set
a.Add(1)
a.Add(3)
g.Dump("a:", a) //打印結(jié)果:"[3,2,1]"

//升序數(shù)組
a2 := garray.NewSortedArray(gutil.ComparatorInt)
a2.Add(2)
a2.Add(1)
a2.Add(3)
g.Dump("a2:", a2)
// 添加重復(fù)元素
a2.Add(2)
g.Dump("a2添加重復(fù)元素后:", a2)
a2.SetUnique(true) //設(shè)置不允許重復(fù)元素
g.Dump("a2設(shè)置不允許重復(fù)元素之后:", a2)
}

打印結(jié)果

join、chunk、merge

  • 數(shù)據(jù)項(xiàng)串聯(lián)是相當(dāng)常用的場(chǎng)景,比如多個(gè)id以逗號(hào)分隔入庫(kù)存儲(chǔ),我們使用join關(guān)鍵字即可
  • garray支持將一個(gè)數(shù)組拆分成指定數(shù)量的二維數(shù)組,使用chunk關(guān)鍵字
  • garray支持使用merge關(guān)鍵字合并數(shù)組
package main

import (
"fmt"
"github.com/gogf/gf/container/garray"
"github.com/gogf/gf/frame/g"
)

func main() {
//join 串聯(lián) 常用于逗號(hào)分割
a := garray.NewFrom(g.Slice{1, 2, 3, 4, 5})
fmt.Println("串聯(lián)結(jié)果:", a.Join("_")) //1_2_3_4_5

//數(shù)組拆分 chunk
fmt.Println("數(shù)組拆分:", a.Chunk(2)) //[[1 2] [3 4] [5]]

// 數(shù)組合并 可以合并數(shù)組 也可以合并slice(原生切片和g.Slice都支持)
a1 := garray.NewFrom(g.Slice{1, 2})
a2 := garray.NewFrom(g.Slice{3, 4})
s1 := g.Slice{5, 6}
s2 := []string{"7", "8"}
s3 := []int{9, 0}
a1.Merge(a2)
a1.Merge(s1)
a1.Merge(s2)
a1.Merge(s3)
fmt.Println("合并結(jié)果:", a1) // [1,2,3,4,5,6,7,8,9,0]
}

打印結(jié)果:

遍歷

  • garray天然支持升序遍歷和降序遍歷
  • 函數(shù)Iterator()是IteratorAsc()的別名
package main

import (
"fmt"
"github.com/gogf/gf/container/garray"
"github.com/gogf/gf/frame/g"
)

//數(shù)組遍歷 iterate
func main() {
a := garray.NewFrom(g.Slice{"a", "b", "c"})
fmt.Println("升序遍歷結(jié)果")
a.Iterator(func(k int, v interface{}) bool {
fmt.Printf("%v,%v \n", k, v)
return true
})

// 數(shù)組倒序遍歷
fmt.Println("倒序遍歷結(jié)果:")
a.IteratorDesc(func(k int, v interface{}) bool {
fmt.Printf("%v,%v \n", k, v)
return true
})
}

打印結(jié)果

遍歷修改 walk函數(shù)

非常好用!??!

看到這個(gè)方法,更堅(jiān)信了我一個(gè)觀點(diǎn):GF的作者一定寫(xiě)了幾年P(guān)HP。

package main

import (
"github.com/gogf/gf/container/garray"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/util/gconv"
)

//walk遍歷修改 修改數(shù)組的值
func main() {
var a garray.Array
tables := g.Slice{"user", "user_detail"}
a.Append(tables...)
prefix := "gf_"
a.Walk(func(value interface{}) interface{} {
return prefix + gconv.String(value)
})
g.Dump(a)
}

打印結(jié)果

序列化和反序列化

這里重點(diǎn)提一下:gf container容器包下的對(duì)象都實(shí)現(xiàn)對(duì)原生json包的支持,都支持序列化和反序列化。

gf非常重視對(duì)序列化的支持,Go學(xué)習(xí)專(zhuān)欄 文章中介紹了gmap、glist、gqueue、gset、gtree...等gf組件,都是支持序列化和反序列化的。

package main

import (
"encoding/json"
"fmt"
"github.com/gogf/gf/container/garray"
"github.com/gogf/gf/frame/g"
)

//gf container容器包下的對(duì)象都實(shí)現(xiàn)對(duì)原生json包的支持,即都支持序列化和反序列化
func main() {
//序列化
type student struct {
Name string
Age int
Scores *garray.IntArray
}
s := student{
Name: "王中陽(yáng)",
Age: 28,
Scores: garray.NewIntArrayFrom([]int{100, 98}),
}

bytes, _ := json.Marshal(s)
g.Dump(bytes) //{"Name":"王中陽(yáng)","Age":28,"Scores":[100,98]}

//反序列化
data := []byte(`{"Name":"王中陽(yáng)","Age":28,"Scores":[100,98]}`)
s2 := student{}
_ = json.Unmarshal(data, &s2)
fmt.Println(s2) //{王中陽(yáng) 28 [100,98]}
}

打印結(jié)果

總結(jié)

綜上我們了解到:

  • garray支持設(shè)置并發(fā)安全開(kāi)關(guān)
  • 支持排序數(shù)組
  • 支持?jǐn)?shù)組出棧、包含判斷、join、chunk、merge等常用的工具方法
  • 天然支持升序遍歷、遍歷修改
  • 天然支持序列化和反序列化
  • 大家是不是明顯感覺(jué)到GoFrame的garray比PHP的array還要好用。

本文轉(zhuǎn)載自微信公眾號(hào)「 程序員升級(jí)打怪之旅」,作者「王中陽(yáng)Go」,可以通過(guò)以下二維碼關(guān)注。

轉(zhuǎn)載本文請(qǐng)聯(lián)系「 程序員升級(jí)打怪之旅」公眾號(hào)。


文章標(biāo)題:GoFrame的數(shù)組比PHP的數(shù)組還好用!?
標(biāo)題網(wǎng)址:http://www.dlmjj.cn/article/dhsighj.html