【发布时间】:2018-03-06 08:54:15
【问题描述】:
我是 Go 新手。我读过 Go 中的封装是在包级别上的。我有一个简单的网络控制器用例。我有一个 struct,它以 JSON 对象的形式出现,并被解组到结构类型中。
type User struct{
Name String `json:"name"`
//Other Variables
}
现在可以通过 json.Unmarshal([]byte) 将 json 解组为 User Struct 类型。但是,此 User 结构也可用于其他包。如何确保只有与 User 相关的方法才能被其他包访问。
我能想到的一个解决方案:
type User struct{
name String
}
type UserJSON struct{
Name String `json:"name"`
}
func DecodeJSONToUser(rawJSON []byte) (User,error) {
var userJSON UserJSON
err := json.Unmarshal(rawJSON,&userJSON)
//Do error handling
return User{name:userJSON.Name},nil
}
有没有一种可行的方法来实现这一点?
【问题讨论】:
-
是的,有一种方法是你不想被其他包使用的结构字段不导出它们。
-
@GrzegorzŻur 我希望其他包可以在 User Struct 上工作,例如调用 User.GetName() 而不是直接调用 User.Name。
-
@Himanshu 是的,但是想想这个用例,其中 struct User 的每个成员都来自 JSON,因此 json.Unmarshal 将要求导出所有 struct 字段。现在,谁来阻止像 User.Name = "some_other_name" 之类的东西?
-
创建一个包在解组数据时分配结构,并且不要在主目录中导入该包,这样除了包之外没有其他用户可以修改结构。将你的结构封装在一个包中