V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
wandehul
V2EX  ›  问与答

golang 下面这一段不是很懂

  •  
  •   wandehul · 292 天前 · 431 次点击
    这是一个创建于 292 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 呢。

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

    对于 otherUser := &data.User{},你创建了一个新的 User 结构体实例,并给 otherUser 赋予了一个指向这个新实例的指针。即使这个新实例的所有字段值都是零值(对于结构体字段的零值,如 int64 为 0 ,string 为 "",bool 为 false 等),这个实例的内存地址与 AnonymousUser 指向的地址是不同的。因此,当调用 otherUser.IsAnonymous() 时,它在检查 otherUser 的内存地址是否与 AnonymousUser 相同时会发现不相同,所以返回 false 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2769 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:26 · PVG 22:26 · LAX 06:26 · JFK 09:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.