pgo alternatives and similar packages
Based on the "Utilities" category.
Alternatively, view pgo alternatives based on common mentions on social networks and blogs.
-
项目文档
🚀Vite+Vue3+Gin拥有AI辅助的基础开发平台,支持TS和JS混用。它集成了JWT鉴权、权限管理、动态路由、显隐可控组件、分页封装、多点登录拦截、资源权限、上传下载、代码生成器、表单生成器和可配置的导入导出等开发必备功能。 -
excelize
Go language library for reading and writing Microsoft Excel™ (XLAM / XLSM / XLSX / XLTM / XLTX) spreadsheets -
Kopia
Cross-platform backup tool for Windows, macOS & Linux with fast, incremental backups, client-side end-to-end encryption, compression and data deduplication. CLI and GUI included. -
goreporter
A Golang tool that does static analysis, unit testing, code review and generate code quality report. -
create-go-app
✨ A complete and self-contained solution for developers of any qualification to create a production-ready project with backend (Go), frontend (JavaScript, TypeScript) and deploy automation (Ansible, Docker) by running only one CLI command. -
EaseProbe
A simple, standalone, and lightweight tool that can do health/status checking, written in Go. -
filetype
Fast, dependency-free Go package to infer binary file types based on the magic numbers header signature -
boilr
:zap: boilerplate template manager that generates files or directories from template repositories -
beaver
💨 A real time messaging system to build a scalable in-app notifications, multiplayer games, chat apps in web and mobile apps. -
go-underscore
Helpfully Functional Go - A useful collection of Go utilities. Designed for programmer happiness.
CodeRabbit: AI Code Reviews for Developers

Do you think we are missing an alternative of pgo or a related project?
Popular Comparisons
README
pgo
Go library for PHP community with convenient functions
Installation
Via go get command:
go get github.com/arthurkushman/pgo
Imagine that you need to write Go code every day and also have a convenient functions in memory from PHP experience
Core
Serialize/Unserialize
For instance, to store Go code data in storage engines like rdbms, no-sql, key-value etc, you can use serialization functions to serialize Go code to string and unserialize it back from string to Go code:
m := make(map[int]string, 0)
m[0] = "abc"
str, err := pgo.Serialize(m) // str -> "Dv+BBAEC/4IAAQQBDAAACf+CAAEAA2FiYw=="
unserMap := make(map[int]string, 0)
err = pgo.Unserialize(str, &unserMap) // unserMap -> map[int]string{0: "abc"}
Date
You can use date function with similar formatting for PHP e.g.:
dateStr := pgo.Date("Y-m-d H:i:s") // 2019-03-28 12:23:03
pgo.Date("j D, M") // 27 Wed, Mar
pgo.Date("Q") // 3 (of 1,2,3,4 quarters)
Milli/Micro
nowMicro := pgo.UnixMicro() // get current unix microseconds
nowMilli := pgo.UnixMilli() // get current unix milliseconds
// get current millis + 3ms
nowMillisPlusThree := pgo.Time(time.Now().Add(time.Millisecond * 3)).Milliseconds()
// get current microseconds + 7μs
nowMicroPlusSeven := pgo.Time(now.Add(time.Microsecond * 7)).Microseconds()
Strings
StrReplace
replace sub-strings with StrReplace:
subject := "The quick brown fox jumped over the lazy dog"
str, err := pgo.StrReplace([]string{"fox", "dog"}, []string{"cat", "elephant"}, subject)
// and if case-insensitive replace needed - pgo.StrIReplace([]string{"DOG", "QuiCK"}, []string{"fox", "slow"}, subject)
HTTPBuildQuery
Bulding a http query string:
queryStr := pgo.HTTPBuildQuery(map[string]string{
"foo": "bar",
"bar": "baz",
}) // bar=baz&foo=bar
StripTags
Strip tags with exclusion rules:
html := "<div>Lorem <span>ipsum dolor sit amet</span>, consectetur adipiscing elit, sed do eiusmod <a href=\"http://example.com\">tempor incididunt</a> ut labore <strong>et dolore</strong> magna aliqua.</div>"
str := html.StripTags(html, []string{"a", "span"}) // results in: "Lorem <span>ipsum dolor sit amet</span>, consectetur adipiscing elit, sed do eiusmod <a href=\"http://example.com\">tempor incididunt</a> ut labore et dolore magna aliqua."
UPD: As had been stated here - https://github.com/golang/go/issues/22639
There is a very handy "stripTags" function in html/template, then guys from official team as fast as they got dislike on their negative comment, closed the thread.
That is why libs like pgo
is appearing and will be move forward/evelove, bypassing strict rules that sometimes looking nonsence.
Files
FileGetContents
Read files with offset/limit:
content, err := pgo.FileGetContents("somefile.txt", 0, 1024)
FilePutContents
reflexively write to files with:
n, err := pgo.FilePutContents("somefile.txt", strToWrite, pgo.FileAppend)
Read from context (via http(s)):
content, err := pgo.FileGetContents("http://google.com", pgo.NewContext())
MoveUploadedFile
Uploading files from web-forms to your server:
ctx := pgo.NewContext()
ctx.Req = YourReq
ctx.UploadMaxFileSize = 10 << 25
uploaded := ctx.MoveUploadedFile("foo", "/srv/images/pic123.png")
FileExists
Checking for file existence
if pgo.FileExists("file1.txt") == true {
// do something with existent file
}
IsFile/IsDir/IsLink
Check if it is file/dir/symlink
if pgo.IsFile("someFile.txt") {
// do something with file
}
if pgo.IsDir("someDir/") {
// do something with dir
}
if pgo.IsLink("someLink") {
// do somthing with symlink
}
Arrays
InArray
Check if an array contains an element
pgo.InArray(3, []int{1, 2, 3}) // true
pgo.InArray("bar33", []string{"foo", "bar", "baz"}) // false
pgo.InArray(3.14159, []float64{33.12, 12.333, 3.14159, 78.4429}) // true
ArrayChunk
Split an array by chunks (with auto-tailing)
pgo.ArrayChunk([]int{1, 2, 3, 4, 5, 6, 7, 8}, 2) // [][]int{[]int{1, 2}, []int{3, 4}, []int{5, 6}, []int{7, 8}}
pgo.ArrayChunk([]string{"foo", "bar", "baz", "fizz", "buzz"}, 3) // [][]string{[]string{"foo", "bar", "baz"}, []string{"fizz", "buzz"}}
ArrayCombine
Create an array by using one array for keys and another for its values
pgo.ArrayCombine([]int{11, 32, 13, 14, 51, 46, 17, 88}, []string{"foo", "bar", "baz", "fizz", "buzz", "mazz", "freez", "lorum"})
/*
map[int]string{
11: "foo",
32: "bar",
13: "baz",
14: "fizz",
51: "buzz",
46: "mazz",
17: "freez",
88: "lorum",
}
*/
pgo.ArrayCombine([]string{"foo", "bar", "baz", "fizz", "buzz"}, []float64{11.32, 32.42, 13.246, 14.41, 51.98})
/*
map[string]float64{
"foo": 11.32,
"bar": 32.42,
"baz": 13.246,
"fizz": 14.41,
"buzz": 51.98,
}
*/
ArrayCountValues
Count all the values of an array/slice
pgo.ArrayCountValues([]string{"foo", "bar", "foo", "baz", "bar", "bar"}) // map[string]int{"foo": 2, "bar": 3, "baz": 1}
pgo.ArrayCountValues([]float64{3.14159, 43.03, 8, 3.14159, 43.02, 8}) // map[float64]int{3.14159: 2, 8: 2, 43.03: 1, 43.02: 1}
ArrayMap
Apply the callback to the elements of the given arrays
pgo.ArrayMap([]string{"foo", "bar", "baz"}, func(v string) string {
return strings.ToUpper(v)
}) // []string{"FOO", "BAR", "BAZ"}
pgo.ArrayMap([]float64{1, 2, 3, 4, 5}, func(v float64) float64 {
return math.Pow(v, 2)
}) // []float64{1, 4, 9, 16, 25}
ArrayFilter
filters elements of an array using a callback function
pgo.ArrayFilter([]float64{1, 2, 3, 4, 5}, func(v float64) bool {
return v > 2.718
}) // []float64{3, 4, 5}
ArrayDiff
returns the values in array1 that are not present in any of the other arrays
pgo.ArrayDiff([]string{"foo", "bar", "fizz", "baz"}, []string{"foo", "bar"}) // []string{"fizz", "baz"}
pgo.ArrayDiff([]int{3, 43, 8, 4, 9}, []int{3, 8, 9, 4}) // []int{43}
ArrayUdiff
computes the difference of arrays by using a callback function for data comparison
pgo.ArrayUdiff(func(a interface{}, b interface{}) int {
if a.(string) > b.(string) {
return 1
} else if a.(string) < b.(string) {
return -1
}
return 0
}, []string{"foo", "bar", "fizz", "baz"}, []string{"foo", "bar"}) // []string{"fizz", "baz"}
pgo.ArrayUdiff(func(a interface{}, b interface{}) int {
if a.(int) > b.(int) {
return 1
} else if a.(int) < b.(int) {
return -1
}
return 0
}, []int{3, 43, 8, 4, 9}, []int{3, 8, 9, 4}) // []int{43}
type TestUdiffComparing interface {ComparingValue() string}
type A struct {valueA string}
func (a A) ComparingValue() string {return a.valueA}
type B struct {valueB string}
func (b B) ComparingValue() string {return b.valueB}
type C struct {valueC string}
func (c C) ComparingValue() string {return c.valueC}
func main() {
a := []A {{valueA: "q"}, {valueA: "e"}, {valueA: "t"}, {valueA: "k"}, {valueA: "g"}, {valueA: "o"}, {valueA: "j"}}
b := []B {{valueB: "q"}, {valueB: "g"}, {valueB: "b"}, {valueB: "h"}, {valueB: "j"}, {valueB: "k"}, {valueB: "l"}}
c := []C {{valueC: "o"}, {valueC: "q"}, {valueC: "e"}, {valueC: "x"}, {valueC: "c"}, {valueC: "v"}, {valueC: "b"}}
s1 := pgo.ArrayUdiff(func (arr1 interface{}, arr2 interface{}) int {
if arr1.(TestUdiffComparing).ComparingValue() > arr2.(TestUdiffComparing).ComparingValue() {
return 1
} else if arr1.(TestUdiffComparing).ComparingValue() < arr2.(TestUdiffComparing).ComparingValue() {
return -1
}
return 0
}, a, b, c)
fmt.Print(s1) // [{t}]
a2 := []string {"a", "b", "c"}
b2 := []string {"a", "d", "g"}
c2 := []string {"b", "x", "y"}
s2 := pgo.ArrayUdiff(func (arr1 interface{}, arr2 interface{}) int {
if arr1.(string) > arr2.(string) {
return 1
} else if arr1.(string) < arr2.(string) {
return -1
}
return 0
}, a2, b2, c2)
fmt.Print(s2) // [c]
}
ArraySum
calculate the sum of values in an array
pgo.ArraySum([]int{12, 54, 32, 12, 33}) // int: 143
ArrayIntersect
computes the intersection of arrays
pgo.ArrayIntersect([]int{12, 54, 32, 12, 33}, []int{3, 12, 54, 9}, []int{12, 33, 9}) // []int{12, 54, 33}
pgo.ArrayIntersect([]string{"foo", "bar", "baz", "fizz", "bazz", "fizz", "fizz"}, []string{"bar", "fizz"}, []string{"foo", "bar", "hey"}) // []string{"foo", "bar", "fizz"}
Range
creates an int slice of min to max range
pgo.Range(3, 9) // []int{3, 4, 5, 6, 7, 8, 9}
// If a step value is given, it will be used as the increment between elements in the sequence.
pgo.Range(-3, 7, 5) // []int{-3, 2, 7}
See more examples in *_test.go files.
Collections
Priority Queue
// Some items and their priorities.
items := map[string]int{
"banana": 3, "apple": 2, "pear": 4, "peach": 1, "plum": 6,
}
// Create a Priority queue, put the items in it, and
// establish the Priority queue (heap) invariants.
pq := make(pgo.PriorityQueue, len(items))
i := 0
for value, priority := range items {
pq[i] = &pgo.Item{
Value: value,
Priority: priority,
Index: i,
}
i++
}
pq.Init()
// Insert a new item and then modify its Priority.
item := &pgo.Item{
Value: "orange",
Priority: 1,
}
pq.Push(item)
pq.Update(item, item.Value, 5)
item := pq.Pop().(*pgo.Item) // 06:plum
item := pq.Pop().(*pgo.Item) // 05:orange
item := pq.Pop().(*pgo.Item) // 04:pear
item := pq.Pop().(*pgo.Item) // 03:banana
// ...
Network
IP2Long/Long2Ip
long, _ := pgo.IP2long("176.59.34.117") // 2956665461
ip := pgo.Long2ip(2956665461) // "176.59.34.117"
GetMxrr
isMx, mxs, _ := pgo.GetMxrr("google.com") // e.g.: true, n
Math
Rand
rand := pgo.Rand(1, 100)
Crypto
Md5
pgo.Md5("abc123") // e99a18c428cb38d5f260853678922e03
Sha1
pgo.Sha1("abc123") // 6367c48dd193d56ea7b0baad25b19455e529f5ee
Sha2
pgo.Sha2("abc123") // 6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090
HashFile
hex, err := pgo.HashFile("sha1", "example.txt") // 6367c48dd193d56ea7b0baad25b19455e529f5ee
HashHmac
hmac := HashHmac("foo bar baz", "secret", sha256.New) // 9efc4f86917b454deae37c869521f88dee79305303fa2283df0b480e3cc8104c
IsValidMac
IsValidMac("foo bar baz", hmac, "secret", sha256.New) // true/false
Supporters gratitude:
*Note that all licence references and agreements mentioned in the pgo README section above
are relevant to that project's source code only.