2017-06-02 1 views
1

私がnilインターフェースを省略しようとしているが、ここで omitemptyは

package main 

import (
    "fmt" 
    "encoding/json" 
) 

type MyStruct struct{ 
Val interface{} `json:"val,omitempty"` 
} 

func main() { 
    var s []string 
    s = nil 
    m := MyStruct{ 
    Val : s, 
    } 

    b, _:= json.Marshal(m) 
    fmt.Println(string(b)) 
} 

は、なぜそれが治療されていない

{"val":null} 

これは、出力遊び場リンクhttps://play.golang.org/p/cAE1IrSPgm ある値JSONの値はnilインターフェースを省略していませんそれは空の値としてですか?これらのゼロ値をjsonから省略する方法はありますか? documentationから

+0


を行うことができます 'この例ではm.Val'はゼロではありません。 –

+1

'nil' *を指す変数は、' nil'値*を持つ変数を指す*変数と同じではありません。 Cerise Limonが指摘しているように、後者は 'nil 'ではなく、' m.Val'が変数 's'を指しています。 'm'を' m:= MyStruct {Val:nil} 'と定義すると、省略されます。 – putu

+0

@putu私は理解しています。しかし、私の場合、変数sへの値はデータベースクエリから来て、ValをValに割り当てる必要があります。だから、それが直接の割り当てになることはできません。 – Anuruddha

答えて

2

構造体の値は、JSONオブジェクトとして符号化します。 「 - 」、または

  • フィールドが空で、そのタグが「omitempty」オプションを指定する

    • フィールドのタグがある場合を除き、各エクスポート構造体のフィールドは、オブジェクトのメンバーになります。

    空の値は、0、任意のnilポインタまたはインターフェイス値、および長さ0の配列、スライス、マップ、または文字列です。

  • それが省略されていない理由が記載されているhere

    インタフェース値は、内側値とタイプの両方 未設定である場合にのみ、ゼロである(ゼロ、ゼロ)。特に、nilインタフェースは常に のnil型を保持します。私たちがtype * int型のポインタをインタフェース の値の中に格納すると、内部型は ポインタの値に関係なく* intになります:(* int、nil)したがって、ポインタの内部がnilであっても、このようなインタフェースの値は になります。

    eg

    var s []string 
    s = nil 
    var temp interface{} 
    fmt.Println(temp==nil) // true 
    temp = s 
    fmt.Println(temp==nil) // false 
    

    あなたのケースでは、あなたが

    https://play.golang.org/p/ZZ_Vzwq4QF
    または https://play.golang.org/p/S5lMgqVXuB

    +0

    これは私が話しているまったく同じケースではありません。あなたは直接Valにゼロを割り当てました – Anuruddha

    +0

    ああ、私はあなたの質問を参照してください、私は答えを変更させてください。 –

    関連する問題