2016-04-24 9 views
0

いくつかのフィールドが不足して定義された構造体ならば、私はMySQLの書かれたシンプルなORMしようとした、私は、問題しまっ:ユーザーのGoで安全にstructのゼロの値を検出する方法は?

type User struct { 
    ID  int64 
    Username string 
    Password string 
    Email  string 
    Comment string 
} 

var u = User{Username: "user_0001", Password: "password"} 

一部のフィールドに値が与えられていなかった、それは価値がゼロ化されたことになるのです値は、文字列""、ブールfalse、整数0などです。

フィールド名と値を取得するのにreflectを使用しています.SQLを生成して行を挿入します。

INSERT INTO User (Id, Username, Password, Email, Comment) Values (0, "user_0001", "password", , ,)

あなたは私が空の文字列""を検出し、それらをスキップした場合、私は正常値を飛ばして、文字列の一部のゼロ化された値が存在している見ることができます。

答えて

2

。ヌル・バリアントを使用するには

、構造体は、あなたが、その後値をNullString.Validをチェックすることにより、設定されているのを検出することができます

type User struct { 
    ID  int64 
    Username string 
    Password string 
    Email  sql.NullString 
    Comment sql.NullString 
} 

だろう。 NullStringを使用することの欠点は、Stringerインターフェイスを実装していないため、特殊なケースを追加または印刷する必要があることです。またはUnmarshalJSONも実装されていません。文字列の値を設定するときは、手動でNullString.Validを設定することを忘れないでください。例えば

、あなたの代わりにしなければならないNullStringを印刷するには

func TestNullString(t *testing.T) { 
    s := sql.NullString{} 
    t.Log(s) 

    s.String = "Test" 
    s.Valid = true 
    t.Log(s) 
} 

プリント

null_string_test.go:21: { false} 
null_string_test.go:25: {Test true} 

のようなテストプリントし

func TestNullString(t *testing.T) { 
    s := sql.NullString{} 
    t.Log(s.String) 

    s.String = "Test" 
    s.Value = true 
    t.Log(s.String) 
} 

null_string_test.go:21: 
null_string_test.go:25: Test 
1

テーブルの列に空の文字列を挿入するだけでいつでもかまいません。ゼロ値と完全に値が存在しないことの違いを知ることが本当に重要な場合は、ポインタを使う必要があります。

type User struct { 
    ID  int64 
    Username *string 
} 

これには、あなたが""からそれを区別することができますnilなるようにゼロ値を変更します。 欠点は、このタイプの使い方が簡単ではないことです(実際にはnilのチェックはしばしば忘れられます)。実際の文字列を取得するには、そのフィールドを逆参照する必要があります。

具体的な例では、なぜ空の値を心配する必要があるのか​​わかりません。 ""をデータベースに挿入して、データベースの制約を使用する代わりに、コードに検証(非空白)を強制できませんか?フリードリヒ・グロースが示唆、またはインスタンスsql.NullStringため、dbパッケージで見つかったNull... -variantsを使用するようNULL、することができますいずれかを使用ポインタかもしれデータベース列を処理するために

関連する問題