3 回答

TA貢獻2036條經驗 獲得超8個贊
您可以使用 == 與零值復合文字進行比較,因為所有字段都是可比較的:
if (Session{}) == session {
fmt.Println("is zero value")
}
由于解析歧義,if 條件中的復合文字周圍需要括號。
上述用法==適用于所有字段都具有可比性的結構。如果結構體包含不可比較的字段(切片、映射或函數),則必須將這些字段與它們的零值一一比較。
比較整個值的另一種方法是比較在有效會話中必須設置為非零值的字段。例如,如果玩家 ID 在有效會話中必須是 != "",請使用
if session.playerId == "" {
fmt.Println("is zero value")
}

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)
}

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")
}
}
- 3 回答
- 0 關注
- 169 瀏覽
添加回答
舉報