
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 2024-03-04 22:17:05 +08:00 data.AnonymousUser.IsAnonymous() 返回 true ,因为 AnonymousUser 指针被直接用于调用 IsAnonymous(),并且在这个方法内部,它与自身进行了比较( u == AnonymousUser ),自然是相等的。 对于 otherUser := &data.User{},你创建了一个新的 User 结构体实例,并给 otherUser 赋予了一个指向这个新实例的指针。即使这个新实例的所有字段值都是零值(对于结构体字段的零值,如 int64 为 0 ,string 为 "",bool 为 false 等),这个实例的内存地址与 AnonymousUser 指向的地址是不同的。因此,当调用 otherUser.IsAnonymous() 时,它在检查 otherUser 的内存地址是否与 AnonymousUser 相同时会发现不相同,所以返回 false 。 |