为什么当我们使用struct引用结构时(*structObj)
,Go似乎会返回的新副本,structObj
而不是返回原始的相同地址structObj
?这可能是我的误解,所以我要求澄清
package main
import (
"fmt"
)
type me struct {
color string
total int
}
func study() *me {
p := me{}
p.color = "tomato"
fmt.Printf("%p\n", &p.color)
return &p
}
func main() {
p := study()
fmt.Printf("&p.color = %p\n", &p.color)
obj := *p
fmt.Printf("&obj.color = %p\n", &obj.color)
fmt.Printf("obj = %+v\n", obj)
p.color = "purple"
fmt.Printf("p.color = %p\n", &p.color)
fmt.Printf("p = %+v\n", p)
fmt.Printf("obj = %+v\n", obj)
obj2 := *p
fmt.Printf("obj2 = %+v\n", obj2)
}
输出量
0x10434120
&p.color = 0x10434120
&obj.color = 0x10434140 //different than &p.color!
obj = {color:tomato total:0}
p.color = 0x10434120
p = &{color:purple total:0}
obj = {color:tomato total:0}
obj2 = {color:purple total:0} // we get purple now when dereference again
去操场
当你写
obj := *p
您正在复制p
(*
dereferences p
)指向的struct的值。它类似于:
var obj me = *p
所以obj
是一个类型的新变量me
,被初始化为的值*p
。这将导致obj
具有不同的内存地址。
请注意,obj
如果是type me
,则while p
是type
*me
。但是它们是不同的值。更改of字段obj
的值不会影响in的字段值p
(除非me
struct在其中具有引用类型作为字段,即slice,map或channel。如果要产生这种效果请使用:
obj := p
// equivalent to: var obj *me = p
现在obj
指向与相同的对象p
。它们本身仍然具有不同的地址,但是在它们内部拥有与实际me
对象相同的地址。
问题内容: 假设我有一个像 然后在主要我有代码 显然,无论json格式不同,上述代码都会产生nil错误。Go中的json.Unmarshal()什么时候返回错误? 问题答案: 如果源中的值与目标中的值不对应,则JSON解码器不会报告错误。例如,如果源包含“状态”字段,这不是错误,但目标没有。 在其他情况下,Unmarshal函数确实会返回错误: 语法错误 类型不匹配 游乐场的例子
据我所知,Java中的运算符比较对象的引用()。 此值是中方法的默认实现返回的值。 方法有一个实现说明: 为什么和 而且,一个极度厌恶风险的人如何确保上面的假阳性永远不会发生?如果类至少有一个非静态字段,则可以重写和。但是,如果不是这样(就像上面的类一样)呢? 你能解释一下我在这里漏掉了什么吗? 为添加API注释(取自Silvio的答案): 这通常是通过将对象的内部地址转换为整数来实现的,但Jav
问题内容: 我有一个看起来像这样的JSON Blob 我有一些代码将其转换回go结构 但是我在运行时看到的只是一个零位结构 我尝试先分配该结构,但那也没有用,我不确定为什么它不产生值,并且不返回错误 问题答案: 您的结构字段不会导出。这是因为它们以小写字母开头。 当我说“未导出”时,是指它们在您的包装之外不可见。您的软件包可以愉快地访问它们,因为它们在本地作用域内。 至于包装-它看不到它们。您需要
问题内容: 我正在使用Gorm构建Go Web API,作为Amazon RDS中Postgresql数据库的ORM。问题是,尽管数据库中已经填充了数据,但Gorm总是会返回一片全为零的结构。切片中的结构数量适当,具体取决于我给的。 我也尝试过使用内置包直接查询SQL ,在循环内手动插入变量,它没有问题。我用3个不同的表(具有3个不同的结构)尝试了此操作(显然),结果都是相同的。所以我想这在Gor
我有两个活动类和一个非活动类,它们从构造函数中传递的上下文调用startActivityForResult()。它看起来是这样的:FirstActivity- 不活跃 第二活动 第一活动
问题内容: 以下是gcc 4.4.4下的简单代码段错误 将最后一行更改为 工作良好。使用编译时,这两个版本均可使用。我是在简单地调用未定义的行为,还是在标准中进行了某些更改,从而使代码可以在C99下工作?为什么在C89下崩溃? 问题答案: 我相信C89 / C90和C99中的行为均未定义。 是数组类型的表达式,特别是。 C99 6.3.2.1p3说: 除非它是 sizeof 运算符或一元 & 运算