当前位置: 首页 > 知识库问答 >
问题:

如何检查空结构?

杜高谊
2023-03-14

我定义了一个结构…

type Session struct {
    playerId string
    beehive string
    timestamp time.Time
}

有时我给它分配一个空会话(因为不可能为零)

session = Session{};

然后我想检查一下,如果它是空的:

if session == Session{} {
     // do stuff...
}

显然这是行不通的。我怎么写?

共有3个答案

禹正阳
2023-03-14

使用reflect.deep平等也同样有效,尤其是当你在结构中有地图时

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")
  } 
}
轩辕啸
2023-03-14

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

您可以添加一个附加字段来判断结构是否已填充或为空。我故意将其命名为 ready 而不是空,因为布尔值的零值为 false,因此,如果您创建一个像 Session{} 这样的新结构,它的 ready 字段将自动false,它会告诉您真相:该结构尚未准备就绪(它是的)。

type Session struct {
    ready bool

    playerId string
    beehive string
    timestamp time.Time
}

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

var s Session

if !s.ready {
    // do stuff (populate s)
}

当结构变大或包含不可比较的字段(例如切片、映射和函数值)时,这个额外的布尔字段的重要性会增加。

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

例如,如果你的示例中你的 playerId 不能是空字符串 “”,你可以使用它来测试你的结构是否为空,如下所示:

var s Session

if s.playerId == "" {
    // do stuff (populate s, give proper value to playerId)
}

在这种情况下,值得将这种检查合并到< code>isEmpty()方法中,因为这种检查是与实现相关的:

func (s Session) isEmpty() bool {
    return s.playerId == ""
}

使用它:

if s.isEmpty() {
    // do stuff (populate s, give proper value to playerId)
}

第二个建议是使用指向结构的指针:*会话。指针可以具有 nil 值,因此您可以对其进行测试:

var s *Session

if s == nil {
    s = new(Session)
    // do stuff (populate s)
}
穆洋
2023-03-14

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

if (Session{}) == session  {
    fmt.Println("is zero value")
}

游乐场示例

由于解析的不确定性,if条件中的复合文本周围需要括号。

上述==的用法适用于所有字段都可比较的结构。如果结构包含不可比较的字段(切片、映射或函数),则必须逐个将字段与其零值进行比较。

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

if session.playerId == "" {
    fmt.Println("is zero value")
}
 类似资料:
  • 问题内容: 我定义一个结构… 有时我给它分配一个空的会话(因为nil不可能) 然后,我想检查一下是否为空: 显然这是行不通的。我该怎么写? 问题答案: 您可以使用==与零值复合文字进行比较,因为所有字段都是可比较的: 游乐场的例子 由于存在歧义,因此在if条件下,在组合文字周围需要括号。 上面的用法适用于所有字段都是可比较的结构。如果该结构包含不可比较的字段(切片,映射或函数),则必须将这些字段一

  • 下面的代码引发NullPointerException。即使有

  • 问题内容: 原谅我,我来自ac#背景! 我在Go中有以下结构。我们通过从文件中读取配置来填充此结构,效果很好。但是我试图找出一种方法来告诉结构中的某个特定属性(通过配置文件传递时是否为null)。如图所示,完全没有设置。 我为此奋斗了大约3个小时。我可以针对类型字符串等执行此操作,但无法找到针对所有类型的通用方法? 问题答案: 在执行过程中,值的默认值为其零值。您可能要使所有类型的指针成为指针(例

  • 我有如下所示的JSON 我将文件读成字符串并创建一个JSONObject,如下所示 然而,我认为我可以用try catch将语句括起来 请建议在这种情况下是否有任何合理的理由放一个长的if条件,而不是仅仅try-catch-log然后继续。 您还可以分享使用JSONException在此上下文中是否有任何“优点”吗?

  • 问题内容: 拜托,有人能告诉我我在做什么错吗?我只是从表中检索结果,然后将它们添加到数组中。一切正常,直到我检查结果为空为止。 这将获得匹配项,将其添加到我的数组中,并按预期回显结果: 当我尝试检查空结果时,我的代码返回“空”,但不再产生匹配结果: 与往常一样,我们将提供任何帮助。谢谢! 问题答案: 您这样做时会丢掉结果行。那不是您检查是否有任何结果的方法。你做 相关文档在这里:http : //

  • 我有一个非常简单的界面类型如下 在我的单元测试中,我想检查从API调用返回的对象是否属于这种类型,但我不知道该怎么做。我的API调用如下: 但是,行