为了账号安全,请及时绑定邮箱和手机立即绑定

如何检查空结构?

如何检查空结构?

Go
至尊宝的传说 2021-09-13 16:16:45
我定义了一个结构...type Session struct {    playerId string    beehive string    timestamp time.Time}有时我为它分配一个空会话(因为 nil 是不可能的)session = Session{};然后我想检查它是否为空:if session == Session{} {     // do stuff...}显然这是行不通的。我该怎么写?
查看完整描述

3 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

您可以使用 == 与零值复合文字进行比较,因为所有字段都是可比较的:


if (Session{}) == session  {

    fmt.Println("is zero value")

}


由于解析歧义,if 条件中的复合文字周围需要括号。


上述用法==适用于所有字段都具有可比性的结构。如果结构体包含不可比较的字段(切片、映射或函数),则必须将这些字段与它们的零值一一比较。


比较整个值的另一种方法是比较在有效会话中必须设置为非零值的字段。例如,如果玩家 ID 在有效会话中必须是 != "",请使用


if session.playerId == "" {

    fmt.Println("is zero value")

}


查看完整回答
反对 回复 2021-09-13
?
潇湘沐

TA贡献1816条经验 获得超6个赞

这里还有 3 个建议或技巧:


带有附加字段

您可以添加一个额外的字段来判断结构是否已填充或为空。我故意命名它ready而不是empty因为 a 的零值bool是false,所以如果你创建一个像Session{}它的ready字段一样的新结构false,它会自动告诉你真相:结构还没有准备好(它是空的)。


type Session struct {

    ready bool


    playerId string

    beehive string

    timestamp time.Time

}

初始化结构体时,必须设置ready为true. isEmpty()不再需要您的方法(尽管您可以根据需要创建一个),因为您可以只测试ready字段本身。


var s Session


if !s.ready {

    // do stuff (populate s)

}

bool随着结构变大或包含不可比较的字段(例如切片map和函数值),这一附加字段的重要性会增加。


使用现有字段的零值

这与之前的建议类似,但它使用现有字段的零值,当结构体不为空时,该字段被视为无效。它的可用性取决于实现。


例如,如果在您的示例中您playerId不能是 empty string "",您可以使用它来测试您的结构是否为空,如下所示:


var s Session


if s.playerId == "" {

    // do stuff (populate s, give proper value to playerId)

}

在这种情况下,值得将此检查合并到一个isEmpty()方法中,因为此检查取决于实现:


func (s Session) isEmpty() bool {

    return s.playerId == ""

}

并使用它:


if s.isEmpty() {

    // do stuff (populate s, give proper value to playerId)

}

使用指针指向您的结构

第二个建议是使用指向您的结构的指针:*Session。指针可以有nil值,所以你可以测试它:


var s *Session


if s == nil {

    s = new(Session)

    // do stuff (populate s)

}


查看完整回答
反对 回复 2021-09-13
?
隔江千里

TA贡献1906条经验 获得超10个赞

使用reflect.deepEqual也有效,尤其是当您在结构中有 map 时


package main


import "fmt"

import "time"

import "reflect"


type Session struct {

    playerId string

    beehive string

    timestamp time.Time

}


func (s Session) IsEmpty() bool {

  return reflect.DeepEqual(s,Session{})

}


func main() {

  x := Session{}

  if x.IsEmpty() {

    fmt.Print("is empty")

  } 

}


查看完整回答
反对 回复 2021-09-13
  • 3 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信