我正在尝试使用以下命令取消编组Web服务响应,它工作正常。
bodyBytes, _ := ioutil.ReadAll(response.Body)
bodyString := string(bodyBytes)
err = json.Unmarshal([]byte(bodyString), &output)
fmt.Println(&output)
当我使用指针变量"&output"时,它工作正常,即;输出显示正确。
但是当我尝试在没有 &(& 符号(的情况下直接使用该变量时,输出看起来并不好。
bodyBytes, _ := ioutil.ReadAll(response.Body)
bodyString := string(bodyBytes)
err = json.Unmarshal([]byte(bodyString), output)
fmt.Println(output)
解组时这 2 个变量 - 指针与普通变量有什么区别?
var output core.ApiData
输出是与 apidata 输出匹配的类型结构。
这是因为Unmarshal
函数采用output
结构并用数据填充它。如果您不传递指针,它将获取您的结构的副本并填充它,之后您将不再访问它。如果传递指针,指针后面的output
结构将被填充并保持可用。
如您所见,json.Unmarshal
不返回值,因此如果您传递值而不是指针,它将无法正常工作,因为它会填充它作为参数的接口副本。
它的工作方式是将指针传递给要填充的结构,json.Unmarshal
将使用指针直接填充它。
有关更多详细信息,请参阅文档。
Unmarshal 解析 JSON 编码的数据,并将结果存储在v 指向的值中。如果 v 为 nil 或不是指针,则 Unmarshal 返回 InvalidUnmarshalError。