亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何檢查空結構?

如何檢查空結構?

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 關注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號