写过PHP的同学都知道 PHP的数组Array非常好用,特别灵活。
网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、小程序设计、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了北塔免费建站欢迎大家使用!
我在写PHP之前使用Java做安卓开发,在接触PHP的数组Array之后,直呼太香了!
而在学习Go基础知识的时候了解到Go的数组和PHP的数组并不一样;从一定程度上讲,Go的slice切片类型和PHP的数组array比较像(不固定长度、引用类型、动态扩容等),但是在开发使用中远远不像PHP的array灵活。
最近在使用基于Go语言的GoFrame框架撸项目,发现GoFrame封装的garray竟然比PHP的array还要好用。
gf框架有个特点,提供的组件基本都支持设置并发安全开关。显然PHP是不支持并发安全开关的,PHP的数组是并发安全的。PHP-FPM是阻塞的单线程模型,PHP-FPM每个进程里只有一个线程,一个进程同时只能服务一个客户端。
package main
import (
"fmt"
"github.com/gogf/gf/container/garray"
)
func main() {
//创建并发安全的int型数组
a := garray.NewIntArray(true)
//添加数组项
for i := 0; i < 10; i++ {
a.Append(i)
}
// 打印结果:
fmt.Println(a) //"[0,1,2,3,4,5,6,7,8,9]"
fmt.Println("数组长度:", a.Len())
fmt.Println("数组的值:", a.Slice())
fmt.Println((a.Get(5))) //根据索引取值 返回值和是否取到了值 5 true
// 在指定索引前后插入值
_ = a.InsertAfter(9, 10)
_ = a.InsertBefore(0, -1)
fmt.Println(a.Slice())
// 搜索数据项,返回对应的索引
fmt.Println("搜索值,返回对应索引:", a.Search(5))
// 删除
a.Remove(0)
fmt.Println(a.Slice())
// 并发安全 写锁操作
a.LockFunc(func(array []int) {
//将最后一项的值改为100
array[len(array)-1] = 100
})
fmt.Println(a) //"[0,1,2,3,4,5,6,7,8,9,100]"
// 并发安全 读锁操作
a.RLockFunc(func(array []int) {
fmt.Println(array[len(array)-1]) //100
})
// 清空数组
a.Clear()
fmt.Println("清空数组之后:", a.Slice())
}
package main
import (
"fmt"
"github.com/gogf/gf/container/garray"
"github.com/gogf/gf/frame/g"
)
//数组出栈 pop 数组可以按顺序出栈 map的pop是随机出栈
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) //全部出栈后 数组为空
/**
打印结果:
1 true
[2 3]
6 true
[4 5]
[]
*/
// 有什么办法能像map一样随机出栈呢? 在garray中我们使用rand()或者popRand()
a1 := garray.NewFrom(g.Slice{1, 2, 3, 4, 5, 6, 7})
fmt.Println("----------")
fmt.Println(a1.Rand()) //随机取值
fmt.Println(a1.PopRands(2)) //随机出栈
fmt.Println(a1)
}
package main
import (
"github.com/gogf/gf/container/garray"
"github.com/gogf/gf/frame/g"
)
//包含 contains 区分大小写
func main() {
var a garray.Array
a.Append("a")
g.Dump(a.Contains("a")) //true
g.Dump(a.Contains("A")) //false
// 空值过滤
a1 := garray.NewFrom([]interface{}{0, 1, "2", nil, false, g.Slice{}, "王中阳"})
a2 := garray.NewFrom([]interface{}{0, 1, "2", nil, false, g.Slice{}, "王中阳"})
g.Dump("empty过滤:", a1.FilterEmpty()) //empty过滤:"[1,2,"王中阳"]"
g.Dump("nil过滤:", a2.FilterNil()) //nil过滤:"[0,1,2,"false","[]","王中阳"]"
a3 := garray.NewFrom([]interface{}{1, 2, 3, 4, 5, 6, 7})
g.Dump("数组翻转:", a3.Reverse())
g.Dump("数组随机排序:", a3.Shuffle())
}
package main
import (
"github.com/gogf/gf/container/garray"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/util/gutil"
)
//我们可以自定义NewSortedArray的排序规则,以实现是升序数组还是降序数组;排序数组还有唯一性校验的功能
func main() {
//自定义排序数组:降序排列
a := garray.NewSortedArray(func(a, b interface{}) int {
if a.(int) < b.(int) {
return 1
}
if a.(int) > b.(int) {
return -1
}
return 0
})
// 排序规格可以使用gutil中定义好的
a.Add(2) //数组的赋值用add map的赋值用set
a.Add(1)
a.Add(3)
g.Dump("a:", a) //打印结果:"[3,2,1]"
//升序数组
a2 := garray.NewSortedArray(gutil.ComparatorInt)
a2.Add(2)
a2.Add(1)
a2.Add(3)
g.Dump("a2:", a2)
// 添加重复元素
a2.Add(2)
g.Dump("a2添加重复元素后:", a2)
a2.SetUnique(true) //设置不允许重复元素
g.Dump("a2设置不允许重复元素之后:", a2)
}
package main
import (
"fmt"
"github.com/gogf/gf/container/garray"
"github.com/gogf/gf/frame/g"
)
func main() {
//join 串联 常用于逗号分割
a := garray.NewFrom(g.Slice{1, 2, 3, 4, 5})
fmt.Println("串联结果:", a.Join("_")) //1_2_3_4_5
//数组拆分 chunk
fmt.Println("数组拆分:", a.Chunk(2)) //[[1 2] [3 4] [5]]
// 数组合并 可以合并数组 也可以合并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("合并结果:", a1) // [1,2,3,4,5,6,7,8,9,0]
}
package main
import (
"fmt"
"github.com/gogf/gf/container/garray"
"github.com/gogf/gf/frame/g"
)
//数组遍历 iterate
func main() {
a := garray.NewFrom(g.Slice{"a", "b", "c"})
fmt.Println("升序遍历结果")
a.Iterator(func(k int, v interface{}) bool {
fmt.Printf("%v,%v \n", k, v)
return true
})
// 数组倒序遍历
fmt.Println("倒序遍历结果:")
a.IteratorDesc(func(k int, v interface{}) bool {
fmt.Printf("%v,%v \n", k, v)
return true
})
}
非常好用!!!
看到这个方法,更坚信了我一个观点:GF的作者一定写了几年PHP。
package main
import (
"github.com/gogf/gf/container/garray"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/util/gconv"
)
//walk遍历修改 修改数组的值
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)
}
package main
import (
"encoding/json"
"fmt"
"github.com/gogf/gf/container/garray"
"github.com/gogf/gf/frame/g"
)
//gf container容器包下的对象都实现对原生json包的支持,即都支持序列化和反序列化
func main() {
//序列化
type student struct {
Name string
Age int
Scores *garray.IntArray
}
s := student{
Name: "王中阳",
Age: 28,
Scores: garray.NewIntArrayFrom([]int{100, 98}),
}
bytes, _ := json.Marshal(s)
g.Dump(bytes) //{"Name":"王中阳","Age":28,"Scores":[100,98]}
//反序列化
data := []byte(`{"Name":"王中阳","Age":28,"Scores":[100,98]}`)
s2 := student{}
_ = json.Unmarshal(data, &s2)
fmt.Println(s2) //{王中阳 28 [100,98]}
}
综上我们了解到:
大家是不是明显感觉到GoFrame的garray比PHP的array还要好用。
更加坚信GoFrame的作者是写过PHP的.
[1]Go语言学习专栏: https://juejin.cn/column/7064777730532835336
[2]Go学习专栏: https://juejin.cn/column/7064777730532835336
[3]Go语言学习路线图: http://github.com/wangzhongyang007/Go
本文转载自微信公众号「 程序员升级打怪之旅」,作者「王中阳Go」,可以通过以下二维码关注。
转载本文请联系「 程序员升级打怪之旅」公众号。
文章题目:为什么我觉得GoFrame的Garray比PHP的Array还好用?
当前URL:http://www.mswzjz.com/qtweb/news26/187176.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联