Golang ---json解析
golang官方为我们提供了标准的json解析库– 现在我们需要引进一个高性能的json解析库,这里以 解决上面问题的办法就是条件编译。Go语言为我们提供了基于tags的编译约束来解决这个问题。 统一JSON库我们先举个例子看看结果。现在我们需要两个库并存,所以我们先得统一这两个库的用法(参考适配器模式),这里我们使用一个自定义的 json/json.go // +build !jsoniter package json import ( "encoding/json" "fmt" ) func MarshalIndent(v interface{},prefix,indent string) ([]byte,error) { fmt.Println("Use [encoding/json] package") return json.MarshalIndent(v,indent) }
json/jsoniter.go // +build jsoniter package json import ( "fmt" "github.com/json-iterator/go" ) var ( json = jsoniter.ConfigCompatibleWithStandardLibrary ) func MarshalIndent(v interface{},error) { fmt.Println("Use [jsoniter] package") return json.MarshalIndent(v,indent) }
目录结构如下: json ├── json.go └── jsoniter.go 例子中以 Demo演示为了区分调用的是哪个json库的具体实现,打印日志,以便区分。现在我们使用 package main import ( "fmt" "json" ) func main() { u := user{"Mike",30} b,err := json.MarshalIndent(u,""," ") if err != nil { fmt.Println(err) } else { fmt.Println(string(b)) } } type user struct { Name string Age int } 使用很简单,把一个 Use [encoding/json] package { "Name": "Mike","Age": 30 } 保持我们默认使用 go run -tags=jsoniter main.go 这次运行和上次不同的地方在于我们加了
条件编译我们发现,条件编译的关键在于 好了,回过头来看我们刚开始时 // +build !jsoniter // +build jsoniter
这两行是Go语言条件编译的关键。
也就是说,这两种条件是互斥的,只有当 小结利用条件编译,我们实现了灵活选择json解析库的目的,且tags只是其中的一部分,Go语言还可以根据Go文件后缀进行条件编译。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |