leodido/go-urn

GitHub: leodido/go-urn

一个遵循 RFC 8141/2141/7643 标准的高性能 Go 语言 URN 解析库,提供精确解析、标准化和等价性检查。

Stars: 93 | Forks: 11

[![Build](https://img.shields.io/circleci/build/github/leodido/go-urn?style=for-the-badge)](https://app.circleci.com/pipelines/github/leodido/go-urn) [![Coverage](https://img.shields.io/codecov/c/github/leodido/go-urn.svg?style=for-the-badge)](https://codecov.io/gh/leodido/go-urn) [![Documentation](https://img.shields.io/badge/godoc-reference-blue.svg?style=for-the-badge)](https://godoc.org/github.com/leodido/go-urn) **一个 URN 解析器**。 [API 文档](https://godoc.org/github.com/leodido/go-urn)。 从 1.3 版本开始,此库还支持 [RFC 7643 SCIM URNs](https://datatracker.ietf.org/doc/html/rfc7643#section-10)。 从 1.4 版本开始,此库还支持 [RFC 8141 URNs (2017)](https://datatracker.ietf.org/doc/html/rfc8141)。 ## 安装 ``` go get github.com/leodido/go-urn ``` ## 功能 1. RFC 2141 URNs 解析(默认) 3. RFC 8141 URNs 解析(取代 RFC 2141) 5. RFC 7643 SCIM URNs 解析 7. 根据 RFC 进行标准化 9. 根据 RFC 进行词法等价性检查 11. 精确、细粒度的错误提示 ## 性能 该实现非常快。 在我的机器上通常低于 400 纳秒[1](#mymachine)。 请注意,它在解析时还会执行: 1. 细粒度且信息丰富的错误报告 3. 特定字符串的标准化 ``` ok/00/urn:a:b______________________________________/-10 51372006 109.0 ns/op 275 B/op 3 allocs/op ok/01/URN:foo:a123,456_____________________________/-10 36024072 160.8 ns/op 296 B/op 6 allocs/op ok/02/urn:foo:a123%2C456___________________________/-10 31901007 188.4 ns/op 320 B/op 7 allocs/op ok/03/urn:ietf:params:scim:schemas:core:2.0:User___/-10 22736756 266.6 ns/op 376 B/op 6 allocs/op ok/04/urn:ietf:params:scim:schemas:extension:enterp/-10 18291859 335.2 ns/op 408 B/op 6 allocs/op ok/05/urn:ietf:params:scim:schemas:extension:enterp/-10 15283087 379.4 ns/op 440 B/op 6 allocs/op ok/06/urn:burnout:nss______________________________/-10 39407593 155.1 ns/op 288 B/op 6 allocs/op ok/07/urn:abcdefghilmnopqrstuvzabcdefghilm:x_______/-10 27832718 211.4 ns/op 307 B/op 4 allocs/op ok/08/urn:urnurnurn:urn____________________________/-10 33269596 168.1 ns/op 293 B/op 6 allocs/op ok/09/urn:ciao:!!*_________________________________/-10 41100675 148.8 ns/op 288 B/op 6 allocs/op ok/10/urn:ciao:=@__________________________________/-10 37214253 149.7 ns/op 284 B/op 6 allocs/op ok/11/urn:ciao:@!=%2C(xyz)+a,b.*@g=$_'_____________/-10 26534240 229.8 ns/op 336 B/op 7 allocs/op ok/12/URN:x:abc%1Dz%2F%3az_________________________/-10 28166396 211.8 ns/op 336 B/op 7 allocs/op no/13/URN:---xxx:x_________________________________/-10 23635159 255.6 ns/op 419 B/op 5 allocs/op no/14/urn::colon:nss_______________________________/-10 23594779 258.4 ns/op 419 B/op 5 allocs/op no/15/URN:@,:x_____________________________________/-10 23742535 261.5 ns/op 419 B/op 5 allocs/op no/16/URN:URN:NSS__________________________________/-10 27432714 223.3 ns/op 371 B/op 5 allocs/op no/17/urn:UrN:NSS__________________________________/-10 26922117 224.9 ns/op 371 B/op 5 allocs/op no/18/urn:a:%______________________________________/-10 24926733 224.6 ns/op 371 B/op 5 allocs/op no/19/urn:urn:NSS__________________________________/-10 27652641 220.7 ns/op 371 B/op 5 allocs/op ``` * [1]: Apple M1 Pro ## 示例 如需更多示例,请查看[示例文件](examples_test.go)。 ``` package main import ( "fmt" "github.com/leodido/go-urn" ) func main() { var uid = "URN:foo:a123,456" // Parse the input string as a RFC 2141 URN only u, e := urn.NewMachine().Parse(uid) if e != nil { fmt.Errorf(err) return } fmt.Println(u.ID) fmt.Println(u.SS) // Output: // foo // a123,456 } ``` ``` package main import ( "fmt" "github.com/leodido/go-urn" ) func main() { var uid = "URN:foo:a123,456" // Parse the input string as a RFC 2141 URN only u, ok := urn.Parse([]byte(uid)) if !ok { panic("error parsing urn") } fmt.Println(u.ID) fmt.Println(u.SS) // Output: // foo // a123,456 } ``` ``` package main import ( "fmt" "github.com/leodido/go-urn" ) func main() { input := "urn:ietf:params:scim:api:messages:2.0:ListResponse" // Parsing the input string as a RFC 7643 SCIM URN u, ok := urn.Parse([]byte(input), urn.WithParsingMode(urn.RFC7643Only)) if !ok { panic("error parsing urn") } fmt.Println(u.IsSCIM()) scim := u.SCIM() fmt.Println(scim.Type.String()) fmt.Println(scim.Name) fmt.Println(scim.Other) // Output: // true // api // messages // 2.0:ListResponse } ```
标签:EVTX分析, 日志审计