2 回答
TA贡献1871条经验 获得超13个赞
您可以执行以下操作:
log := &Log{}
log.Facility, _ = parts["facility"].(int)
log.Severity, _ = parts["severity"].(int)
...这将使用类型断言的双值形式,其中第二个值指示类型断言是否有效,然后忽略该值,因此,如果映射不包含键,或者键不是必需的类型,则使用零值初始化结构成员。
TA贡献1848条经验 获得超6个赞
如果您愿意,可以为这些类型编写包装器:
func toInt(x interface{}) int {
if i, ok := x.(int); ok {
return i
}
return 0 // Or what you would like to have as a default.
}
如果要对类型使用默认值,则可以缩短:
func toInt(x interface{}) int {
i, _ := x.(int)
return i
}
这将使它看起来像这样:
log := &Log{
Facility: toInt(parts["facility"]),
Severity: toInt(parts["severity"]),
Timestamp: toTime(parts["timestamp"]),
Hostname: toString(parts["hostname"]),
AppName: toString(parts["appName"]),
Client: toString(parts["client"]),
Priority: toInt(parts["priority"]),
Message: toString(parts["message"]),
}
您可以更进一步,在本地编写转换函数:
var parts map[string]interface{}
// ...
i := func(name string) int {
i, _ := parts[name].(int)
return i
}
s := func(name string) string {
s, _ := parts[name].(string)
return s
}
t := func(name string) time.Time {
t, _ := parts[name].(time.Time)
return t
}
log := &Log{
Facility: i("facility"),
Severity: i("severity"),
Timestamp: t("timestamp"),
Hostname: s("hostname"),
AppName: s("appName"),
Client: s("client"),
Priority: i("priority"),
Message: s("message"),
}
- 2 回答
- 0 关注
- 168 浏览
添加回答
举报
