有没有一种好的方法可以不公开JSON有效负载中的某些struct属性?

I was really hoping the below code would work, but it doesn't so currently I have to manually set values from one struct to another.

https://play.golang.org/p/yfcsaNJm9M

package main

import "fmt"
import "encoding/json"

type A struct {
    Name     string `json:"name"`
    Password string `json:"password"`
}

type B struct {
    A
    Password string `json:"-"`
    Locale   string `json:"locale"`
}

func main() {

    a := A{"Jim", "some_secret_password"}
    b := B{A: a, Locale: "en"}

    data, _ := json.Marshal(&b)
    fmt.Printf("%v", string(data))
}

Output...I don't want to show the secret field

{"name":"Jim","password":"some_secret_password","locale":"en"}

Struct values encode as JSON objects. Each exported struct field becomes a member of the object unless

- the field's tag is "-", or
- the field is empty and its tag specifies the "omitempty" option.

The empty values are false, 0, any nil pointer or interface value, and any array, slice, map, or string of length zero. The object's default key string is the struct field name but can be specified in the struct field's tag value. The "json" key in the struct field's tag value is the key name, followed by an optional comma and options. Examples:

// Field is ignored by this package.
Field int `json:"-"`

// Field appears in JSON as key "myName".
Field int `json:"myName"`

// Field appears in JSON as key "myName" and
// the field is omitted from the object if its value is     empty,
// as defined above.
Field int `json:"myName,omitempty"`

// Field appears in JSON as key "Field" (the default), but
// the field is skipped if empty.
// Note the leading comma.
Field int `json:",omitempty"`

So your code should be:

package main

import "fmt"
import "encoding/json"

type A struct {
    Name     string `json:"name"`
    Password string `json:"password"`
}

type B struct {
    A
    Password string `json:"password,omitempty"`
    Locale   string `json:"locale"`
}

func main() {

    a := A{"Jim", "some_secret_password"}
    b := B{A: a, Locale: "en"}

    data, _ := json.Marshal(&b)
    fmt.Printf("%v", string(data))
}

https://play.golang.org/p/HdwIssr-oC