从输入流读取时的属性类型不同



用于测试列出用户的代码。

req := httptest.NewRequest("GET", "/v1/users", nil)
resp := httptest.NewRecorder()
u.app.ServeHTTP(resp, req)
if resp.Code != http.StatusOK {
t.Fatalf("getting users: expected status code %v, got %v", http.StatusOK, resp.Code)
}
var list []map[string]interface{}
if err := json.NewDecoder(resp.Body).Decode(&list); err != nil {
t.Fatalf("decoding users: %s", err)
}
want := []map[string]interface{}{
{
"id":           "a2b0639f-2cc6-44b8-b97b-15d69dbb511e",
"name":         "dcc",
"role_id":      float64(101),
"date_created": "2019-01-01T00:00:01Z",
"date_updated": "2019-01-01T00:00:01Z",
},
}

role_id是模型中的整数类型。

type User struct {
ID          string    `db:"user_id" json:"id"`
UserName    string    `db:"user_name" json:"user_name"`
RoleID      int       `db:"role_id" json:"role_id"`
DateCreated time.Time `db:"date_created" json:"date_created"`
DateUpdated time.Time `db:"date_updated" json:"date_updated"`
}

为什么在输入流时将其更改为 float64?

User.RoleID

是一个整数,它将被编码为JSON编号。和 由于取消封送为类型map[string]interface{}的值(值类型为接口(,因此在取消封送为接口值时会选择float64类型。

引用json.Unmarshal()

若要将 JSON 取消封送为接口值,请在接口值中存储以下值之一:

bool, for JSON booleans
float64, for JSON numbers
string, for JSON strings
[]interface{}, for JSON arrays
map[string]interface{}, for JSON objects
nil for JSON null

如果您知道响应包含User对象,请取消编组为类型User的值。

最新更新