2016-08-19 16 views
0

jsonリクエストボディを送信する残りのAPIを実装しています。Postgresデータベース用golangのenum型値のJsonバインディング

type Service struct { 
    id int64 `db:"id" json:"id"` 
    Name string `form:"name" db:"name" json:"name" binding:"required"` 
    Servicetype string `form:"type" db:"type" json:"type" binding:"required"` 
} 

func myHandler(c *gin.Context) { 
    if c.BindJSON(&json) == nil { 
     fmt.Println(json.Servicetype) 
    } else { 
     fmt.Println("json binding error") 
    } 
} 

Servicetypeは、データベースの型がenumです。どうすれば私のサービス構造体にバインドできますか? NameフィールドをデータベースのVARCHAR型と同じようにバインドできます。しかし、構造体にServicetypeを追加するとバインドに失敗します。私はデータベースとしてpostgresを使用しています。

答えて

1

サービスタイプは、ScannerValuerインターフェイスを実装する必要があります。

方法std package does it for NullString

// NullString represents a string that may be null. 
// NullString implements the Scanner interface so 
// it can be used as a scan destination: 


type NullString struct { 
    String string 
    Valid bool // Valid is true if String is not NULL 
} 

// Scan implements the Scanner interface. 
func (ns *NullString) Scan(value interface{}) error { 
    if value == nil { 
     ns.String, ns.Valid = "", false 
     return nil 
    } 
    ns.Valid = true 
    return convertAssign(&ns.String, value) 
} 

// Value implements the driver Valuer interface. 
func (ns NullString) Value() (driver.Value, error) { 
    if !ns.Valid { 
     return nil, nil 
    } 
    return ns.String, nil 
} 
上を見てみましょう
関連する問題