Go的布尔类型的零值为false。Postgres支持未定义的BOOL类型,表示为NULL。尝试从Go中的Postgres获取BOOL值时,这会导致问题:
false
rows,err := db.Query("SELECT UNNEST('{TRUE,FALSE,NULL}'::BOOL[])"); if err != nil { log.Fatal(err) } for rows.Next() { var value bool if err := rows.Scan(&value); err != nil { log.Fatal(err) } fmt.Printf("Value: %t\n",value); }
输出:
Value: true Value: false 2014/11/17 09:34:26 sql: Scan error on column index 0: sql/driver: couldn't convert <nil> (<nil>) into type bool
解决这个问题的最惯用的方法是什么?我想象的两种解决方案都不是很吸引人:
bool
nil
COALESCE()
我的偏好是使用指针:
for rows.Next() { var value *bool if err := rows.Scan(&value); err != nil { log.Fatal(err) } if value == nil { // Handle nil } fmt.Printf("Value: %t\n", *value); }