2017-12-27 11 views
-2

타입 어설 션은 인터페이스에서만 사용할 수 있으며 기본적으로 결정된 유형이 인터페이스를 구현하는지 확인합니다.골란 타입 어설 션 배열

func binder(value interface{}) { 
    // Does not work 
    valueInt, ok := value.(int) 

    // Works 
    valueInt, ok := value.(float64) 

    // Does not work 
    coordinates, ok := value.([]int) 

    // Does not work 
    coordinates, ok := value.([]float64) 
} 

는 기본적으로 내 value 빈 인터페이스이며 나는 json.Unmarshall에서 무엇입니까 :

좀 이상한 시나리오를있다.

시나리오 1

나는 간단한 정수를 통과 할 때 작동하지 않지만, 나는 그것이 작동하는 부동 ...

시나리오가 있는지 확인 만약 내가 합격이

int 또는 float 배열이 작동하지 않습니다! 내가 디버깅 할 때 알 수 있듯이 배열을 받고 있지만 어떤 이유로 어설 션이 작동하지 않습니다.

enter image description here

+2

당신은 무엇을 의미합니까 "작동하지 않는다"? 어떤 결과물을 받았습니까? 대신에 당신은 무엇을 기대 했습니까? – Flimzy

+0

작동하지 않는다는 것은'ok'가 거짓임을 의미합니다! 그러나 아래의 당신의 대답은 모두 나를 분명하게합니다! –

답변

5

귀하의 질문은 불분명하지만 다음 졸이다 나타납니다 : 기본적으로

, json.Unmarshal 마샬링 JSON의 모든 숫자 이후 float64로 모든 숫자는 수레입니다. 다른 유형을 원하면 목표 유형에서 특정 유형을 사용해야합니다. 예 :

var x map[string]interface{} 
json.Unmarshal([]byte(`{"foo":123}`), &x) // { "foo": float64(123) } 

대 : 회원이 혼합 유형을 포함하여 모든 유형이 될 수 있기 때문에

var x map[string]int64 
json.Unmarshal([]byte(`{"foo":123}`), &x) // { "foo": int64(123) } 

그리고 기본적으로 모든 JSON 배열은, []interface{}에 비 정렬 화. 특정 유형을 원하는 경우, 다시 특정해야 :

var x interface{} 
json.Unmarshal([]byte(`[1,2,3]`), &x) // []interface{}{float64(1), float64(2), float64(3)} 

대 :

var x []int64 
json.Unmarshal([]byte(`[1,2,3]`), &x) // []int64{1,2,3} 
+0

의미가 있습니다. 대단히 감사합니다 !! 그 시점에서 unmarshal을 할 수 없기 때문에'[] interface {}'배열을 반복하고 모든 값이 float인지 확인해야합니다! –