golang 下面这一段不是很懂

298 天前
 wandehul
package data

...


var (
    AnonymousUser = &User{}  //声明一个匿名用户变量
)

type User struct {
    ID        int64     `json:"id"`
    CreateAt  time.Time `json:"create_at"`
    Name      string    `json:"name"`
    Email     string    `json:"email"`
    Password  password  `json:"-"`
    Activated bool      `json:"activated"`
    Version   int       `json:"-"`
}

//检查用户是否为匿名用户
func (u *User)IsAnonymous() bool {
    return u == AnonymousUser
}

这里我们创建一个新的 AnonymousUser 变量,存放指向一个 User 结构体指针表示用户没有 ID 、name 、email 或 password 且未激活。我们还为 User 结构体实现了一个 IsAnonymous()方法,因此只要是 User 实例就可以判断是否为 AnonymousUser 实例,例如:

data.AnonymousUser.IsAnonymous() // → 返回 true

otherUser := &data.User{}
otherUser.IsAnonymous() // → 返回 false

第一个判断是 true 我能理解, 为什么第二个就是 false 呢。

437 次点击
所在节点    问与答
1 条回复
distance7509
297 天前
data.AnonymousUser.IsAnonymous() 返回 true ,因为 AnonymousUser 指针被直接用于调用 IsAnonymous(),并且在这个方法内部,它与自身进行了比较( u == AnonymousUser ),自然是相等的。

对于 otherUser := &data.User{},你创建了一个新的 User 结构体实例,并给 otherUser 赋予了一个指向这个新实例的指针。即使这个新实例的所有字段值都是零值(对于结构体字段的零值,如 int64 为 0 ,string 为 "",bool 为 false 等),这个实例的内存地址与 AnonymousUser 指向的地址是不同的。因此,当调用 otherUser.IsAnonymous() 时,它在检查 otherUser 的内存地址是否与 AnonymousUser 相同时会发现不相同,所以返回 false 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1020290

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX