2017-03-09 2 views
1

패키지를 반영 golang에 reflect.Value의 영점이 무엇인지, reflect.value.IsValid 그 의견이 있습니다는 golang에서

IsValid는 V가 값을 나타내는 지 여부를보고합니다. v가 제로의 경우는 false를 돌려줍니다. IsValid가 false를 반환하면 String 패닉을 제외한 다른 모든 메서드가 반환됩니다. 대부분의 함수와 메소드는 결코 잘못된 값을 반환하지 않습니다. 그렇다면 문서에 조건이 명시 적으로 명시되어 있습니다.

위의 내용을 읽으면 매우 혼란 스럽습니다. 나는 무엇이 0의 값을 가지고 있는지 모른다. 값과 그것을 사용하는 isValid는 false를 얻는다.

나는 테스트 코드를 작성 :

var haha *int 
fmt.Println(reflect.ValueOf(haha).IsValid()) //true 
var hehe interface{} 
fmt.Println(reflect.ValueOf(hehe).IsValid() //false 
+1

방금 ​​빈 인터페이스를 ValueOf로 취하는 것이 0 값을 반환한다는 예제를 제시했습니다. 너 혼란스러워? – JimB

+3

Go의 값은 "0 값"입니다. 이것은 숫자의 경우 0, 문자열의 경우 "", 포인터의 경우 nil 등입니다. 어떤 유형. 따라서 'reflect.Value'유형은 0 값을 갖습니다 (그 값이 무엇이든). 이것이 바로 문서가 말하는 것입니다. Go에 익숙해질 때까지 패키지에서 벗어나십시오. – Volker

+0

@Volker 제 작품에서, 저는 프로젝트를 구현하기 위해 reflection을 사용해야합니다. 반사 팩을 사용하는 것은 매우 위험하지만, 나는 배우려고합니다. 나는 golang에 익숙하지만, 공통된 개발에서 pkg을 반영하지 않는다. – LittleDriver

답변

0

값이 0 명시 적으로 초기화가 제공되지 않은 경우 메모리 주소에 기록되는 기본 초기화 값입니다. v가 0 인 경우 테스팅은 사실, v.

var haha *int이 true를 반환하는 것은 haha가 포인터이고 합리적인 "기본값 0 값"으로 생성 될 수 없기 때문에 테스트하는 것입니다. 메모리에 임의의 주소가 있으며 위험한 부작용이있을 수 있습니다. 포인터는 생성 될 때, 다른 데이터 유형이 실제 값을 가질 때 nil입니다.

반면에 var hehe interface{}의 0 값은 실제 엔터티 인 nil * int입니다.

+2

설명은 약간 오도 할 수있다. Go는 "방금 선언 된"과 "초기화 된"을 구별하지 않는다. 선언 된 Go 값은 0으로 초기화됩니다. 포인터와 빈 인터페이스 예제는 완전히 동일하게 동작하며 컴파일러에 의해 둘 다 nil로 설정됩니다. hehe 예제가 다르게 동작하는 진정한 이유는 reflect.ValueOf의 문서에 설명되어 있습니다. ValueOf는 전달하는 항목을 찾습니다. 하하의 경우 ValueOf의 'i'는 nil * int를 포함하는 비 nil 인터페이스 {}를 포함합니다. . 하하 사건은 마지막 문장에 의해 설명됩니다 : i == nil. – Volker

+0

@Volker anwser는 매우 분명합니다. 나는 reflect.ValueOf의 문서를 읽고, 그 다음엔 0 값이 reflect.ValueOf (nil)에 의해 생성된다는 것을 알고있다. 하하는 포인터입니다. 그것은 nil 값을 가리 킵니다. hehe는 0이 아니며 컨테이너 값은 0입니다. 그래서, 내가 reflect.ValueOf 하하에 전화 할 때, 그것은 반사를 반환합니다 .Ptr 유형 데이터. 그러나 hehe를 위해, 그것은 반향을 반영합니다. 잘못된 유형의 데이터입니다. 감사 – LittleDriver

관련 문제