Golang Go语言好厉害,跟py一比,简直了
就冲 golang 可以生成二进制单文件这一点,部署方便,想试试
拿 beego 练个手,用了它的 httplib 模块,其中, request 后有个直接将结果转换成 json 的,原文如下:
解析为 JSON 结构, req.ToJSON(&result) 方法
返回结构直接解析为 JSON 格式,解析到 result 对象中
我!以!为!这是和 py 的 json.loads()一样,心理窃喜,接下来……
我传了个 string ,没数据,传个空接口,没数据。。。。。
看了下源码,是直接调用的 json.Unmarshal(data, v),属于 golang 自带的库,可我一搜……
竟然发现,需要提前定义 json 的结构???而且字段首字母必须大写???不然还得声明???
WTF
beego 的 request 可以返回 string ,像 py 的 requests.get(url).text ,但是我不想这样,我想 json.loads(requests.get(url).text)
我就是想获取个 json 而已,能不能不要这么折腾人?
Golang Go语言好厉害,跟py一比,简直了
更多关于Golang Go语言好厉害,跟py一比,简直了的实战教程也可以访问 https://www.itying.com/category-94-b0.html
Go 是静态语言,在解析 JSON 上是没有 Python 有优势的
更多关于Golang Go语言好厉害,跟py一比,简直了的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
难道你第一门语言是 py 不是 c ´・ᴗ・`
其实就是一个入乡随俗的道理
顺便 Python 是鸭子类型
这是没有这个特性的语言比不了的
你是没用过 C , java 这些吧
试试解析到 map 里面(嘿嘿嘿
simplejson
可以 map[string]interface{}吧
静态语言里不如 rust
其实第一门是 basic
用过 c#,记得 java 也不用先自己声明 json 字段啊
能否细说一下?
这个是 beego 自带的,没用其他库,要是我自己写的话就去找方便的了
还真没试过
看
就是不用struct
的形式了 而是采用map[string]interface{}
的形式呀。然后Unmarshal
之后 map 的 key(string)就是 json 的 key map 的 value 就是 json 的 value 惹 。 但是 我还是建议解析到 struct 的 代码可维护性会强很多(不要问我怎么知道的
不好意思手抖按到回复了…
我觉得看库的实现吧
c#有个 NewtonJson 。也是需要先有个定义好的类来做载体,才能解析到定义好的类的实例上。也就是需要先声明 JSON 的字段格式。
但是 c++是有个 jsoncpp 的库,不需要定义 JSON 的格式,用起来要舒服不少。
json 反序列化成 struct 难道不是很方便的功能吗,而且一般不会强制要求必须定义结构体。这个能力一般都是用反射来实现的,楼上说的 C++现阶段要实现并不容易,可能至少需要静态反射标准化后才能做到。 rust 之前用过一个 json 库也有这个特性,不知道是怎么实现的。
知足吧。
别说 JSON ,你用 C 拼个字符串试试。
python 党笑而不语
定义一个结构体很麻烦吗?
var data struct {
// xxx
}
定义变量的时候就可以定义 struct ,或者说 go 的 struct 可以是匿名的
在静态类型语言里, go 处理 json 是最方便的了,因为有 reflection
别用什么 map[string]interface{},处理嵌套的结构你就知道了
var data struct {
List []struct{
Info struct {
// xxx
}
}
}
你用 map[string]interface{}试试?类型转换烦死你。
再说回来,想学 go 就直接学标准库,别像学 py 一样,上来就框架。 go 的标准库功能比 py 的强得多,根本不需要 beego 这种东西。
- 函数签名是 json.Unmarshal(data []byte , v interface{})
- 也就是说 lz 你想简单点就直接go<br>data := []byte("{"a":"a", "b": 1}")<br>var v interface{} <br>json.Unmarshal(data , v)<br>fmt.Println(v)<br>
你说的只是 newtonjson 的一种早期强类型用法。现在是可以反序列化成 dynamic 类型,或者 jtoken 类型配合 linq 很方便。
虽然我没用过 go 但我觉得一定存在一种不需要预先定义 schema 的使用方式的。
map[interface{}]interface{} 大法好。
另外静态语言里搞一个 [1, “1”, None, {1: 2, None: 0, 2: 3}] 好像是不可能实现的。。
JAVA 可以用 list of Object
一个方法只接受普通 array 作为参数怎么办。。。
首字母大写是因为不大写 json 包就获取不到成员的值了。
也不一定要定义结构体啦,也可以用 map[string]interface{} 但是类型转换会烦死人、。。
等到接手一个老项目,不知道传过来的 JSON 里面元素有哪些的时候,就能感叹动态一时爽的道理了
可以实现,就是麻烦一点。你需要用一个 struct 来 hold 所有可能的值(类似 C union ),然后自己写 marshal/unmarshal 。
好的, 那就不用
我喜欢了很多的语言 是不是不够上道
更有有点吧。
看你是要性能还是轻松了。
大部分情况下我会选择轻松。
底子太差。。。
这都能黑?
静态偏底层的处理,意味着 python 隐藏的的一些细节, go 中你得自己来处理。
昨天学习 go ,重写一个 python 模块,代码量至少两倍。
Go 不适合 LZ
感谢,这篇很详细,回去仔细看看
方便吗,如果返回的 json 有 100 个字段,难道我 struct 里也需要跟着定义 100 个吗(假设这 100 个字段都有用)
var v interface{}
json.Unmarshal(data , v)
fmt.Println(v)
这种定义空接口是不会输出任何东西的
最不能忍的是 go 强制{}的对齐方式, WTF
既然你 json 能定义 100 个字段,为什么就不能在 go 里定义一个包含 100 个字段的结构体呢
谢谢
静态语言就这样,要习惯,至少 Go 还有反射。当初 C/C++拼装解析 JSON 那才是一个痛苦,只是后来的 C++11 特性才好一丁点
不想定义结构体还想用着简单, https://github.com/tidwall/gjson 啊。
静态语言都这样,不知道吐槽点在哪里. 既然选择了静态语言 势必要牺牲一些便携性 多写两行代码 空间换时间
而且看标题我以为是来夸 go 的…
我猜应该有工具能输入复杂样本自动生成结构定义的
有些比较麻烦的地方是
type JobTime time.Time
必须自己实现一遍 Marshal/Unmarshal
前几楼不要乱黑啊,虽然个人不喜欢 Java ,但是 Java 反序列化 Json 还真不需要定义啊,而且有很多方法。
1. 直接反序列化成 Map<String, String> ,最粗暴,但是对某些 Json 结构支持不好
2. 直接反序列化成 JSONObject ,完美方案
还是 Gson 之类的用起来更清晰一些
多谢,真不错
我的错
var v interface{}
json.Unmarshal(data , &v)
fmt.Println(v)
应该传地址
首先,静态语言就是这样的……
100 项可以用 go generate 自动生成,首字母大写可以用
type A struct {
ST json:"st"
}
https://github.com/likexian/simplejson-go#example
楼主看这里, load json 那段
而且不一定要定义完 result ,你需要什么数据,就定义什么好了
比如
{
“A”: 1,
“B”: 2,
“C”: “OK”,
}
你的处理函数只需要里面的 C 的话,
type Result struct {
C string
json.RawMessage
}
具体请看官方标准库, https://golang.org/pkg/encoding/json/#example_RawMessage
多谢,很方便,你博客简介亮了^_^
我觉得这是是语言的哲学决定的。
golang 的开发者觉得,开发语言不能有歧义,如果是不需要定义结构体。真的,在项目里面看到各种 json 对象乱飞,都不知道哪来得时候就很痛苦。
定义结构体最大的好处是语言自文档化,光看代码就能了解整个逻辑。现在特别反感在代码里绕圈子的。简直是折磨
想想 golang 连方法重载这种特性都没有就能理解了。。
楼主你没写过静态语言么… 实际上可以用匿名 struct 的,不一定要预定义
其实静态语言也没那么可怕,你只要写一次,以后直接复制代码修改一下就行了,虽然还是比不上脚本但也不是想象的那么麻烦。
python 转 go
go 的 json 也是可以不先定义结构,但是每次使用时的检查和转换烦死人,静态类型语言都有这个问题。
不过现在觉得这是一个好的特征,只用定义好结构,然后 json 解析到结构一次就能够确定 json 符合预期,之后就不用每个字段都检查一次了。
另外搜索 generate go struct from json ,直接有在线网站提供根据 json 自动生成 go 结构,直接用即可。
python 时就已经是动态一时爽,重构火葬场了。
每次接口修改字段都需要检查很多地方,悲剧的是 ide 搜索不是找到不相关的就是漏下一些。
静态语言 ide 可以轻松找出来哪些地方引用了接口的结构。
只要确定结构定义处改了,即使有忘了的地方编译时自动报错。
C# 都有 dynamic
有部分人第一门语言是 basic pascal,
c++现在比较好的显然是 rapidjson
人生苦短 我用 Python
golang 大法好,无需 bb ,,,哈哈哈
定义一个结构体很麻烦吗?
定义一个不麻烦,但是定义 100 个的时候感觉快崩溃了。
乍看标题以为楼主要黑我 python ,正准备撸起袖子大干一场,结果…
看看 github.com/tidwall/gjson 这个库,或许能帮到你!
我知道楼主喜欢那种 JsonObject.getXX(“name”).getYY(“name”)那种 0v0
有这样的 json 库。
但是怎么说呢……
入乡随俗
先在静态语言里实现一个动态语言……然后……
json.loads(requests.get(url).text) 可以 requests.get(url).json()
再说一句
不需要定义结构体的用法
map[string]interface{}
还有 golang 的常用 json 库 上面说的 gjosn 还有一个 simplejson 前者性能更高一些
能直接 get json 里的字段
如果结构已知, dict 毕竟要查找,效率和 struct 不能比的。作为一门可以编译到二进制的强类型语言,当然是 struct
如果结构不定,就要传 map[string]interface{}进去
不带你这样不会用就黑的。。
lz 可以看看跟你类似的吐槽 https://www.v2ex.com/t/98585
可以看一下我写的 jsoniter http://jsoniter.com/java-features.html 解析各种 json 应该要方便很多了
这个是 java 版本的文档, golang 版本的稍后更新
易语言可以生成二进制呢
最蛋疼的是改数据结构, struct 越改越乱。。。
404 了
谢谢,不是黑
多谢
很方便的工具,谢谢
这库很好,不过前几楼的同学说 golang 自带的库很不错,我先把官方库库搞明白了,再去用第三方,谢谢
谢谢,受教了
写吧 多写点 以后就可以复制粘贴了 那些什么编程语言都用过的人 都是复制粘贴的
程序员不可能同时专注几种语言的 写 java 三年 然后 python 三年 然后 go 三年 这个时候忘掉了 Java 的了。。。
搞出「 [1, “1”, None, {1: 2, None: 0, 2: 3}] 」这种非标 json 的必要性是?
只是不同的设计模式而已,就像 Java 的 org.json 与 Jackson 的区别。
只是说兼容性而已。
py 在运行时可以随意改 json 解析。。。也算个优点吧
静态语言和动态语言的区别。你静态语言不过关啊 lz
用 go 写 api 真心累,特别是操作大量 json 的时候不如 node 和 py 灵活。用了十来个框架下来最喜欢的是 koa ,性能开发效率兼备,至于部署的话…都不是个问题。
go 部署简单啊,最后只有一个二进制文件, py 部署还得装环境,装虚拟空间, node 没用过,不知道怎么部署
确实,Python 解析 json 比 GO 方便多了
golang 得定义好结构体, 否则用 map[string]interface{} 的话要用的时候每一层都得类型转换.不过 JSON 格式本来就比较灵活,嵌套的话要写一大把结构体-_-
response.Result.(map[string]interface{})[“files”].([]interface{})[0].(map[string]interface{})[“path”].(string)
另外大写是 go 的机制,大写的才能访问到, 可以用结构体注解表示序列化后的小写 key
type Aria2JsonRPCReq struct {
Method string json:"method"
Jsonrpc string json:"jsonrpc"
Id string json:"id"
Params []interface{} json:"params"
}
确实,Golang(通常简称为Go)作为一门编程语言,在很多方面展现出了其独特的魅力和强大的能力,与Python相比,各有千秋,但Go在某些应用场景下确实有其显著优势。
首先,Go语言以其出色的并发处理能力著称。通过内置的goroutines和channels,Go能够轻松实现高效的并发编程,这对于构建高并发、高性能的服务端应用来说至关重要。相比之下,Python虽然也有异步编程和多线程等并发机制,但在实现高效并发方面通常需要更多的技巧和调优。
其次,Go语言在编译速度和执行效率上也表现出色。作为一门编译型语言,Go的编译速度相对较快,且生成的二进制文件执行效率高,这对于资源敏感或需要快速响应的应用场景非常有利。而Python作为解释型语言,虽然开发便捷,但在执行效率上通常会有所牺牲。
此外,Go语言还以其简洁的语法、强大的标准库和活跃的社区支持赢得了广泛好评。Go的语法设计注重简洁明了,易于上手;标准库涵盖了网络编程、文件系统操作、加密解密等多个方面,为开发者提供了极大的便利;同时,Go语言的社区活跃度高,生态丰富,有助于解决开发中遇到的各种问题。
当然,Python也有其不可替代的优势,如丰富的第三方库、简洁易读的代码风格以及广泛的应用领域等。因此,在选择编程语言时,应根据具体的应用场景和需求来权衡利弊。