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 呢。
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 。 |