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

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


    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",

        },

    }

model 中的 role_id 是 int 类型。


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?


一只萌萌小番薯
浏览 77回答 1
1回答

收到一只叮咚

User.RoleID是一个整数,它将被编码成一个 JSON Number。由于您解组为类型值map[string]interface{}(值类型是接口),因此float64在解组为接口值时会选择类型。引用自json.Unmarshal():要将 JSON 解组为接口值,Unmarshal 将以下内容之一存储在接口值中:bool, for JSON booleansfloat64, for JSON numbersstring, for JSON strings[]interface{}, for JSON arraysmap[string]interface{}, for JSON objectsnil for JSON null如果您知道响应包含一个User对象,则将其解组为 类型的值User。
打开App,查看更多内容
随时随地看视频慕课网APP