{"id":19856818,"url":"https://github.com/yomorun/y3-codec-golang","last_synced_at":"2025-05-02T02:30:24.028Z","repository":{"id":38334752,"uuid":"278802011","full_name":"yomorun/y3-codec-golang","owner":"yomorun","description":"Golang implementation of Y3 Codec, a fast than real-time TLV based binary codec with low CPU usage","archived":false,"fork":false,"pushed_at":"2023-05-22T19:56:53.000Z","size":421,"stargazers_count":47,"open_issues_count":4,"forks_count":3,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-19T10:24:26.550Z","etag":null,"topics":["codec","encode-decode","golang","realtime","y3","yomo"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yomorun.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2020-07-11T06:21:29.000Z","updated_at":"2025-01-18T17:57:57.000Z","dependencies_parsed_at":"2022-07-12T17:24:57.527Z","dependency_job_id":null,"html_url":"https://github.com/yomorun/y3-codec-golang","commit_stats":{"total_commits":102,"total_committers":7,"mean_commits":"14.571428571428571","dds":0.5098039215686274,"last_synced_commit":"b00cfea4a226d3177a1a69ac7fa0927e6711c43f"},"previous_names":["yomorun/yomo-codec-golang"],"tags_count":25,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yomorun%2Fy3-codec-golang","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yomorun%2Fy3-codec-golang/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yomorun%2Fy3-codec-golang/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yomorun%2Fy3-codec-golang/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yomorun","download_url":"https://codeload.github.com/yomorun/y3-codec-golang/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251139628,"owners_count":21542055,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["codec","encode-decode","golang","realtime","y3","yomo"],"created_at":"2024-11-12T14:16:39.207Z","updated_at":"2025-05-02T02:30:23.684Z","avatar_url":"https://github.com/yomorun.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003e 📚 VERSION: draft-02\n\u003e\n\u003e ⛳️ STATE: WIP\n\u003e\n\u003e 🇨🇳 [简体中文](https://gitee.com/yomorun/y3-codec-golang/blob/master/README_CN.md)  🇬🇧 [English](https://github.com/yomorun/y3-codec-golang/blob/master/README.md)\n\n# Y3\n[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fyomorun%2Fy3-codec-golang.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fyomorun%2Fy3-codec-golang?ref=badge_shield)\n\nY3 is the golang implementation of [Y3 Codec](https://github.com/yomorun/y3-codec), which describe a fast and low CPU binding data encoder/decoder focus on edge computing and streaming processing.\n\nSee the [explainer](https://github.com/yomorun/y3-codec-golang/blob/master/explainer.md) for more info, more about the ways to combine with [YoMo](https://github.com/yomorun/yomo).\n\n## Y3 Codec\n\nSee [Y3 Codec SPEC](https://github.com/yomorun/y3-codec)\n\n## Test\n\n`go test ./...`\n\n## Use \n\n`go get -u github.com/yomorun/y3-codec-golang`\n\n## Examples\n\n### Encode examples\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\ty3 \"github.com/yomorun/y3-codec-golang\"\n)\n\nfunc main() {\n\t// if we want to repesent `var obj = \u0026foo{ID: -1, bar: \u0026bar{Name: \"C\"}}` \n\t// in Y3-Codec:\n\n\t// 0x81 -\u003e node\n\tvar foo = y3.NewNodePacketEncoder(0x01)\n\n\t// 0x02 -\u003e foo.ID=-11\n\tvar yp1 = y3.NewPrimitivePacketEncoder(0x02)\n\typ1.SetInt32Value(-1)\n\tfoo.AddPrimitivePacket(yp1)\n\n\t// 0x83 -\u003e \u0026bar{}\n\tvar bar = y3.NewNodePacketEncoder(0x03)\n\n\t// 0x04 -\u003e bar.Name=\"C\"\n\tvar yp2 = y3.NewPrimitivePacketEncoder(0x04)\n\typ2.SetStringValue(\"C\")\n\tbar.AddPrimitivePacket(yp2)\n\t\n\t// -\u003e foo.bar=\u0026bar\n\tfoo.AddNodePacket(bar)\n\n\tfmt.Printf(\"res=%#v\", foo.Encode()) // res=[]byte{0x81, 0x08, 0x02, 0x01, 0x7F, 0x83, 0x03, 0x04, 0x01, 0x43}\n}\n```\n\n### Decode examples 1: decode a primitive packet\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\ty3 \"github.com/yomorun/y3-codec-golang\"\n)\n\nfunc main() {\n\tfmt.Println(\"\u003e\u003e Parsing [0x0A, 0x01, 0x7F], which like Key-Value format = 0x0A: 127\")\n\tbuf := []byte{0x0A, 0x01, 0x7F}\n\tres, _, err := y3.DecodePrimitivePacket(buf)\n\tv1, err := res.ToUInt32()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfmt.Printf(\"Tag Key=[%#X], Value=%v\\n\", res.SeqID(), v1)\n}\n```\n\n### Decode examples 2: decode a node packet\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\ty3 \"github.com/yomorun/y3-codec-golang\"\n)\n\nfunc main() {\n\tfmt.Println(\"\u003e\u003e Parsing [0x84, 0x06, 0x0A, 0x01, 0x7F, 0x0B, 0x01, 0x43] EQUALS JSON= 0x84: { 0x0A: -1, 0x0B: 'C' }\")\n\tbuf := []byte{0x84, 0x06, 0x0A, 0x01, 0x7F, 0x0B, 0x01, 0x43}\n\tres, _, err := y3.DecodeNodePacket(buf)\n\tv1 := res.PrimitivePackets[0]\n\n\tp1, err := v1.ToInt32()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Printf(\"Tag Key=[%#X.%#X], Value=%v\\n\", res.SeqID(), v1.SeqID(), p1)\n\n\tv2 := res.PrimitivePackets[1]\n\n\tp2, err := v2.ToUTF8String()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfmt.Printf(\"Tag Key=[%#X.%#X], Value=%v\\n\", res.SeqID(), v2.SeqID(), p2)\n}\n```\n\nMore examples in `/examples/`\n\n## Types\n\nY3 implements the [YoMo Codec](https://github.com/yomorun/yomo-codec) protocol and supports the following Golang data types and provides [Hight-Level]( https://github.com/yomorun/y3-codec-golang/blob/master/explainer.md#types) wrappers.\n\n\u003cdetails\u003e\n  \u003csummary\u003eint32\u003c/summary\u003e\n\t\t\n```golang\n// encode\nvar data int32 = 123\nvar prim = y3.NewPrimitivePacketEncoder(0x01)\nprim.SetInt32Value(data)\nbuf := prim.Encode()\n// decode\nres, _, _, _ := y3.DecodePrimitivePacket(buf)\nval, _ := res.ToInt32()\nfmt.Printf(\"val=%d\", val)\n```\n\t\n\u003c/details\u003e\n\u003cdetails\u003e\n  \u003csummary\u003euint32\u003c/summary\u003e\n\t\n```golang\nvar data uint32 = 123\nvar prim = y3.NewPrimitivePacketEncoder(0x01)\nprim.SetUInt32Value(data)\nbuf := prim.Encode()\n// decode\nres, _, _, _ := y3.DecodePrimitivePacket(buf)\nval, _ := res.ToUInt32()\nfmt.Printf(\"val=%d\", val)  \n```\n\n\u003c/details\u003e\n\u003cdetails\u003e\n  \u003csummary\u003eint64\u003c/summary\u003e\n\t\n```golang\n// encode\nvar data int64 = 123\nvar prim = y3.NewPrimitivePacketEncoder(0x01)\nprim.SetInt64Value(data)\nbuf := prim.Encode()\n// decode\nres, _, _, _ := y3.DecodePrimitivePacket(buf)\nval, _ := res.ToInt64()\nfmt.Printf(\"val=%d\", val)  \n```\n\n\u003c/details\u003e\n\u003cdetails\u003e\n  \u003csummary\u003euint64\u003c/summary\u003e\n\t\n```golang\n// encode\nvar data uint64 = 123\nvar prim = y3.NewPrimitivePacketEncoder(0x01)\nprim.SetUInt64Value(data)\nbuf := prim.Encode()\n// decode\nres, _, _, _ := y3.DecodePrimitivePacket(buf)\nval, _ := res.ToUInt64()\nfmt.Printf(\"val=%d\", val) \n```\n\n\u003c/details\u003e\n\u003cdetails\u003e\n  \u003csummary\u003efloat32\u003c/summary\u003e\n\t\n```golang\n// encode\nvar data float32 = 1.23\nvar prim = y3.NewPrimitivePacketEncoder(0x01)\nprim.SetFloat32Value(data)\nbuf := prim.Encode()\n// decode\nres, _, _, _ := y3.DecodePrimitivePacket(buf)\nval, _ := res.ToFloat32()\nfmt.Printf(\"val=%f\", val) \n```\n\n\u003c/details\u003e\n\u003cdetails\u003e\n  \u003csummary\u003efloat64\u003c/summary\u003e\n\t\n```golang\n// encode\nvar data float64 = 1.23\nvar prim = y3.NewPrimitivePacketEncoder(0x01)\nprim.SetFloat64Value(data)\nbuf := prim.Encode()\n// decode\nres, _, _, _ := y3.DecodePrimitivePacket(buf)\nval, _ := res.ToFloat64()\nfmt.Printf(\"val=%f\", val)  \n```\n\n\u003c/details\u003e\n\u003cdetails\u003e\n  \u003csummary\u003ebool\u003c/summary\u003e\n\t\n```golang\n// encode\nvar data bool = true\nvar prim = y3.NewPrimitivePacketEncoder(0x01)\nprim.SetBoolValue(data)\nbuf := prim.Encode()\n// decode\nres, _, _, _ := y3.DecodePrimitivePacket(buf)\nval, _ := res.ToBool()\nfmt.Printf(\"val=%v\", val)  \n```\n\n\u003c/details\u003e\n\u003cdetails\u003e\n  \u003csummary\u003estring\u003c/summary\u003e\n\t\n```golang\n// encode\nvar data string = \"abc\"\nvar prim = y3.NewPrimitivePacketEncoder(0x01)\nprim.SetStringValue(data)\nbuf := prim.Encode()\n// decode\nres, _, _, _ := y3.DecodePrimitivePacket(buf)\nval, _ := res.ToUTF8String()\nfmt.Printf(\"val=%s\", val) \n```\n\n\u003c/details\u003e\n\u003cdetails\u003e\n  \u003csummary\u003eint32 slice\u003c/summary\u003e\n\t\n```golang\n// encode\ndata := []int32{123, 456}\nvar node = y3.NewNodeSlicePacketEncoder(0x10)\nif out, ok := utils.ToInt64Slice(data); ok {\n\tfor _, v := range out {\n\t\tvar item = y3.NewPrimitivePacketEncoder(0x00)\n\t\titem.SetInt32Value(int32(v.(int64)))\n\t\tnode.AddPrimitivePacket(item)\n\t}\n}\nbuf := node.Encode()\n// decode\npacket, _, _ := y3.DecodeNodePacket(buf)\nresult := make([]int32, 0)\nfor _, p := range packet.PrimitivePackets {\n\tv, _ := p.ToInt32()\n\tresult = append(result, v)\n}\nfmt.Printf(\"result=%v\", result) \n```\n\n\u003c/details\u003e\n\u003cdetails\u003e\n  \u003csummary\u003euint32 slice\u003c/summary\u003e\n\t\n```golang\n// encode\ndata := []uint32{123, 456}\nvar node = y3.NewNodeSlicePacketEncoder(0x10)\nif out, ok := utils.ToUInt64Slice(data); ok {\n\tfor _, v := range out {\n\t\tvar item = y3.NewPrimitivePacketEncoder(0x00)\n\t\titem.SetUInt32Value(uint32(v.(uint64)))\n\t\tnode.AddPrimitivePacket(item)\n\t}\n}\nbuf := node.Encode()\n// decode\npacket, _, _ := y3.DecodeNodePacket(buf)\nresult := make([]uint32, 0)\nfor _, p := range packet.PrimitivePackets {\n\tv, _ := p.ToUInt32()\n\tresult = append(result, v)\n}\nfmt.Printf(\"result=%v\", result) \n```\n\n\u003c/details\u003e\n\u003cdetails\u003e\n  \u003csummary\u003eint64 slice\u003c/summary\u003e\n\t\n```golang\n// encode\ndata := []int64{123, 456}\nvar node = y3.NewNodeSlicePacketEncoder(0x10)\nif out, ok := utils.ToInt64Slice(data); ok {\n\tfor _, v := range out {\n\t\tvar item = y3.NewPrimitivePacketEncoder(0x00)\n\t\titem.SetInt64Value(v.(int64))\n\t\tnode.AddPrimitivePacket(item)\n\t}\n}\nbuf := node.Encode()\n// decode\npacket, _, _ := y3.DecodeNodePacket(buf)\nresult := make([]int64, 0)\nfor _, p := range packet.PrimitivePackets {\n\tv, _ := p.ToInt64()\n\tresult = append(result, v)\n}\nfmt.Printf(\"result=%v\", result) \n```\n\n\u003c/details\u003e\n\u003cdetails\u003e\n  \u003csummary\u003euint64 slice\u003c/summary\u003e\n\t\n```golang\ndata := []uint64{123, 456}\nvar node = y3.NewNodeSlicePacketEncoder(0x10)\nif out, ok := utils.ToUInt64Slice(data); ok {\n\tfor _, v := range out {\n\t\tvar item = y3.NewPrimitivePacketEncoder(0x00)\n\t\titem.SetUInt64Value(v.(uint64))\n\t\tnode.AddPrimitivePacket(item)\n\t}\n}\nbuf := node.Encode()\n// decode\npacket, _, _ := y3.DecodeNodePacket(buf)\nresult := make([]uint64, 0)\nfor _, p := range packet.PrimitivePackets {\n\tv, _ := p.ToUInt64()\n\tresult = append(result, v)\n}\nfmt.Printf(\"result=%v\", result)  \n```\n\n\u003c/details\u003e\n\u003cdetails\u003e\n  \u003csummary\u003efloat32 slice\u003c/summary\u003e\n\t\n```golang\n// encode\ndata := []float32{1.23, 4.56}\nvar node = y3.NewNodeSlicePacketEncoder(0x10)\nif out, ok := utils.ToUFloat64Slice(data); ok {\n\tfor _, v := range out {\n\t\tvar item = y3.NewPrimitivePacketEncoder(0x00)\n\t\titem.SetFloat32Value(float32(v.(float64)))\n\t\tnode.AddPrimitivePacket(item)\n\t}\n}\nbuf := node.Encode()\n// decode\npacket, _, _ := y3.DecodeNodePacket(buf)\nresult := make([]float32, 0)\nfor _, p := range packet.PrimitivePackets {\n\tv, _ := p.ToFloat32()\n\tresult = append(result, v)\n}\nfmt.Printf(\"result=%v\", result) \n```\n\n\u003c/details\u003e\n\u003cdetails\u003e\n  \u003csummary\u003efloat64 slice\u003c/summary\u003e\n\t\n```golang\n// encode\ndata := []float64{1.23, 4.56}\nvar node = y3.NewNodeSlicePacketEncoder(0x10)\nif out, ok := utils.ToUFloat64Slice(data); ok {\n\tfor _, v := range out {\n\t\tvar item = y3.NewPrimitivePacketEncoder(0x00)\n\t\titem.SetFloat64Value(v.(float64))\n\t\tnode.AddPrimitivePacket(item)\n\t}\n}\nbuf := node.Encode()\n// decode\npacket, _, _ := y3.DecodeNodePacket(buf)\nresult := make([]float64, 0)\nfor _, p := range packet.PrimitivePackets {\n\tv, _ := p.ToFloat64()\n\tresult = append(result, v)\n}\nfmt.Printf(\"result=%v\", result)  \n```\n\n\u003c/details\u003e\n\u003cdetails\u003e\n  \u003csummary\u003ebool slice\u003c/summary\u003e\n\t\n```golang\n// encode\ndata := []bool{true, false}\nvar node = y3.NewNodeSlicePacketEncoder(0x10)\nif out, ok := utils.ToBoolSlice(data); ok {\n\tfor _, v := range out {\n\t\tvar item = y3.NewPrimitivePacketEncoder(0x00)\n\t\titem.SetBoolValue(v.(bool))\n\t\tnode.AddPrimitivePacket(item)\n\t}\n}\nbuf := node.Encode()\n// decode\npacket, _, _ := y3.DecodeNodePacket(buf)\nresult := make([]bool, 0)\nfor _, p := range packet.PrimitivePackets {\n\tv, _ := p.ToBool()\n\tresult = append(result, v)\n}\nfmt.Printf(\"result=%v\", result)  \n```\n\n\u003c/details\u003e\n\u003cdetails\u003e\n  \u003csummary\u003estring slice\u003c/summary\u003e\n\t\n```golang\n// encode\ndata := []string{\"abc\", \"def\"}\nvar node = y3.NewNodeSlicePacketEncoder(0x10)\nif out, ok := utils.ToStringSlice(data); ok {\n\tfor _, v := range out {\n\t\tvar item = y3.NewPrimitivePacketEncoder(0x00)\n\t\titem.SetStringValue(fmt.Sprintf(\"%v\", v))\n\t\tnode.AddPrimitivePacket(item)\n\t}\n}\nbuf := node.Encode()\n// decode\npacket, _, _ := y3.DecodeNodePacket(buf)\nresult := make([]string, 0)\nfor _, p := range packet.PrimitivePackets {\n\tv, _ := p.ToUTF8String()\n\tresult = append(result, v)\n}\nfmt.Printf(\"result=%v\", result) \n```\n\n\u003c/details\u003e\n\u003cdetails\u003e\n  \u003csummary\u003ecomplex types\u003c/summary\u003e\n\t\n```golang\n// encode\nvar node = y3.NewNodePacketEncoder(0x01)\nnode.AddPrimitivePacket(func() *y3.PrimitivePacketEncoder {\n\tvar prim1 = y3.NewPrimitivePacketEncoder(0x10)\n\tprim1.SetFloat32Value(40.5)\n\treturn prim1\n}())\nnode.AddPrimitivePacket(func() *y3.PrimitivePacketEncoder {\n\tvar prim1 = y3.NewPrimitivePacketEncoder(0x11)\n\tprim1.SetInt64Value(time.Now().Unix())\n\treturn prim1\n}())\nbuf := node.Encode()\n// decode\nres, _, _ := y3.DecodeNodePacket(buf)\nfor _, v := range res.PrimitivePackets {\n\tif v.SeqID() == 0x10 {\n\t\tfmt.Printf(\"0x10=%f\\n\", func() float32 {\n\t\t\tval, _ := v.ToFloat32()\n\t\t\treturn val\n\t\t}())\n\t}\n\tif v.SeqID() == 0x11 {\n\t\tfmt.Printf(\"0x11=%d\\n\", func() int64 {\n\t\t\tval, _ := v.ToInt64()\n\t\t\treturn val\n\t\t}())\n\t}\n}  \n```\n\n\u003c/details\u003e\n\u003cdetails\u003e\n  \u003csummary\u003ecomplex slice types\u003c/summary\u003e\n\t\n```golang\n// encode\nvar node = y3.NewNodeSlicePacketEncoder(0x01)\nfor i := 0; i \u003c 2; i++ {\n\titem := y3.NewNodePacketEncoder(0x00)\n\titem.AddPrimitivePacket(func() *y3.PrimitivePacketEncoder {\n\t\tvar prim1 = y3.NewPrimitivePacketEncoder(0x10)\n\t\tprim1.SetFloat32Value(40.5)\n\t\treturn prim1\n\t}())\n\titem.AddPrimitivePacket(func() *y3.PrimitivePacketEncoder {\n\t\tvar prim1 = y3.NewPrimitivePacketEncoder(0x11)\n\t\tprim1.SetInt64Value(time.Now().Unix())\n\t\treturn prim1\n\t}())\n\tnode.AddNodePacket(item)\n}\nbuf := node.Encode()\n// decode\nres, _, _ := y3.DecodeNodePacket(buf)\nfor _, v := range res.NodePackets {\n\tif res.SeqID() != 0x01 {\n\t\tcontinue\n\t}\n\tfor _, vv := range v.PrimitivePackets {\n\t\tif vv.SeqID() == 0x10 {\n\t\t\tfmt.Printf(\"0x10=%f\\n\", func() float32 {\n\t\t\t\tval, _ := vv.ToFloat32()\n\t\t\t\treturn val\n\t\t\t}())\n\t\t}\n\t\tif vv.SeqID() == 0x11 {\n\t\t\tfmt.Printf(\"0x11=%d\\n\", func() int64 {\n\t\t\t\tval, _ := vv.ToInt64()\n\t\t\t\treturn val\n\t\t\t}())\n\t\t}\n\t}\n} \n```\n\n\u003c/details\u003e\n\n\n## Contributors\n\n[//]: contributor-faces\n\n\u003ca href=\"https://github.com/figroc\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/2026460?v=3\" title=\"figroc\" width=\"80\" height=\"80\"\u003e\u003c/a\u003e\n\n[//]: contributor-faces\n\n## License\n[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fyomorun%2Fy3-codec-golang.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fyomorun%2Fy3-codec-golang?ref=badge_large)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyomorun%2Fy3-codec-golang","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyomorun%2Fy3-codec-golang","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyomorun%2Fy3-codec-golang/lists"}