请教一个 Golang Go语言的问题

发布于 1周前 作者 ionicwang 来自 Go语言

请教一个 Golang Go语言的问题

type Person struct {
Name string json:"name"
}

var p *Person

s := {"name": "123"} fmt.Println(json.Unmarshal([]byte(s), p)) // 报错 fmt.Println(json.Unmarshal([]byte(s), &p)) // 成功

var 声明变量,p 应该是 nil,为什么取地址 json 反序列化反而成功了,不是很理解。


更多关于请教一个 Golang Go语言的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

p 是 nil,所以报错
&p 不是 nil,所以成功

更多关于请教一个 Golang Go语言的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Unmarshal 第二个参数必须是个指针,而且不能为 nil,但是 p == nil,所以第一个报错。

<br>func (d *decodeState) unmarshal(v interface{}) error {<br> rv := reflect.ValueOf(v)<br> if rv.Kind() != reflect.Ptr || rv.IsNil() {<br> return &amp;InvalidUnmarshalError{reflect.TypeOf(v)}<br> }<br>...<br><br>}<br>

至于第二个,&p 是指向 p 变量(本身是个指针)的指针,&p 既是指针,又不是 nil,所以不报错。

报错信息有的啊,因为是 nil…

问一个问题,空值一定是 nil 吗?

当然,我很乐意帮你解答关于Golang(Go语言)的问题。请具体描述你遇到的问题,或者提出你感兴趣的Go语言相关话题,比如语法特性、并发编程、标准库使用、性能优化等方面的问题。不过,由于你未给出具体细节,我将提供一个较为通用的回答,涵盖一些常见的Go语言问题和建议。


在Go语言的学习中,有几个关键点值得注意:

  1. 并发编程:Go语言原生支持goroutine和channel,非常适合并发编程。务必理解这些概念,并尝试在实际项目中应用。

  2. 接口与类型:Go语言的接口非常灵活,可以通过空接口(interface{})实现类型断言和类型转换,这在处理JSON数据或未知类型数据时特别有用。

  3. 错误处理:Go语言提倡显式错误处理,通过返回错误值(error类型)让调用者处理。务必学会编写清晰、可理解的错误消息。

  4. 标准库:Go语言的标准库非常强大,涵盖了网络编程、文件操作、加密解密等多个方面。建议深入学习并充分利用这些库。

  5. 性能优化:Go语言编译后的程序性能通常很好,但在某些情况下仍需要优化。了解Go语言的运行时机制和垃圾回收机制,有助于进行有针对性的优化。

如果你有更具体的问题或需要进一步的帮助,请随时提出。希望这些建议能对你有所帮助!

回到顶部