컴파일되지 않는 다음 코드 조각을 발견했을 때 큰 놀라움을 금치 못했습니다.
aTime := time.Time{}
if defaultTime := time.Time{} ; aTime != defaultTime {}
컴파일러는 다음을 반환합니다.
type time. 시간은 표현식이 아닙니다.
defaultTime : = time. 시간 사용
정의되지 않은 값 : defaultTime
여기서 의도는 aTime 변수가 기본값으로 설정된 경우 테스트하는 것 입니다.
또한 구조체의 포인터를 가져 오면 컴파일되지 않습니다 ( defaultTime : = & time.Time {} ).
그러나 if 구문 외부에서 defaultTime을 초기화하거나 new () 내장을 사용하여 초기화하면 컴파일됩니다.
aTime := time.Time{}
if defaultTime := new(time.Time) ; aTime != *defaultTime {}
내가 모든 곳에서 읽은 내용에서 new (myStruct) & myStruct {} 와 완전히 동일해야합니다 .
인터페 레이션 할 때 defaultValue : = time.Time {} 은 If 문 사양에 자세히 설명 된대로 SimpleStmt (특히 Assignment )로 한정됩니다 .
최선의 인터넷 검색 노력에도 불구하고이 행동에 대한 설명이 없습니다. 누군가가 내 머리를 멈출 수 있다면 감사 할 것입니다.
는 {
(A)의 시작으로 인식 Block
의 구문 분석을 종료한다 SimpleStmt
. 그 결정에 투입 한 후, 컴파일러는 같은 것을 결심 SimpleStmt
, aTime := time.Time
유효 때문이 아닌 time.Time
할당 할 수있는 값되지 않습니다. 그러나 파서가 {
.
이 버전 new
은 {
문자를 포함하지 않기 때문에 작동하므로 이러한 방식으로 구문 분석기를 혼동 하지 않습니다 .
블록은 표현식 중간에서 합법적으로 시작할 수 없으므로 괄호로 묶어 리터럴 형식을 사용할 수도 있습니다.
if defaultTime := (time.Time{}); aTime != defaultTime {
// ...
}
gofmt
"예상 된 부울 표현식, 간단한 문을 찾았습니다 (복합 리터럴 주위에 괄호가 누락 되었습니까?)"라는 유용한 메시지가 표시되지만 이상하게도 go 컴파일러 자체는 그렇지 않습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다