对于JavaScript对象或JSON字符串,键名中是否有任何禁用字符?还是需要转义的字符?
更具体地说,我想在键名中使用"$"," - "和空格.
假设我有一个类似的结构
type A struct{
name string`json:"name"`
}
Run Code Online (Sandbox Code Playgroud)
然后在主要我有代码
var jsonString string = `{"status":false}`
var a A
error := json.Unmarshal([]byte(jsonString),&a)
Run Code Online (Sandbox Code Playgroud)
显然上面的代码产生了一个nil错误,无论json格式是不同的.什么时候json.Unmarshal()会在Go中返回错误?
我认为一个等效的问题是-是否所有运行时错误都可能致命,恐慌?因为任何恐慌都应该可以恢复。我不是在谈论从诸如os.Exit(),或log.Fatal(),Go运行时中的错误或某人通过电源线跳闸中恢复,而是从其他运行时错误中恢复,这将导致程序崩溃。
这是可以通过紧急/恢复捕获的运行时错误的示例:
package main
import (
"fmt"
)
func errorHandler() {
r := recover()
err := r.(error)
if err == nil {
return
}
fmt.Println(err.Error())
}
func foo() {
defer errorHandler()
smallSlice := []int{1, 0, 1}
smallSlice[10] = 1
}
func main() {
foo()
fmt.Println("recovery, end of main")
}
Run Code Online (Sandbox Code Playgroud)
输出:
运行时错误:索引超出范围
恢复,主程序结束
是否有一些示例,其中运行时错误将使程序崩溃而没有可恢复的恐慌?
你如何从"并发地图读取和地图写入"的运行时恐慌中恢复?恢复的通常延迟似乎不起作用.这是为什么?
我知道你不应该在并发环境中使用地图,但仍然:如何在这里恢复?
例:
package main
import "time"
var m = make(map[string]string)
func main() {
go func() {
for {
m["x"] = "foo"
}
}()
go func() {
for {
m["x"] = "foo"
}
}()
time.Sleep(1 * time.Second)
}
Run Code Online (Sandbox Code Playgroud)
请添加恢复代码.:)
go ×3
json ×2
concurrency ×1
dictionary ×1
goroutine ×1
javascript ×1
key ×1
object ×1
panic ×1
struct ×1