这里还有 3 条建议或技巧:
带有附加字段
您可以添加一个附加字段来判断结构是否已填充或为空。我故意将它命名为ready 而不是empty,因为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 不能是空的 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)
}