2017-03-22 1 views
0

더 좋은 방법이 있나요? 나는 v의 타입이 내장 된 "에러"타입인지 알아야한다.이동 AST/유형 - 오류를 나타내는 방법?

import (
    "go/ast" 
    "go/types" 
) 

func IsError(v ast.Expr, info types.Info) bool { 
    t := info.Types[v] 
    return t.Type.String() == "error" && 
     t.Type.Underlying().String() == "interface{Error() string}" 
} 
+0

실행 가능한 링크를 추가하십시오. 예를 들면 다음과 같습니다 https://github.com/plutov/playgo – pltvs

+0

다음은 실행 가능한 예입니다 : https://play.golang.org/p/MrhlFdBN3w –

+0

이것으로 충분하다고 생각합니다 : 돌아 가기 정보 유형 [v] .Type.String() == "error" – pltvs

답변

0

Type assertion 변수의 유형을 확인하는 관용적 방법 :이 일을 깔끔한 방법이 있어야합니다 같은 느낌.

Error() 방법이 구현되는 경우, 나는 기본 유형이 인터페이스가 있는지 확인하려고 할 것 대서양 표준시 표현을 처리하고있어 감안할 때 :

isError := func(v ast.Expr, info *types.Info) bool { 
    if intf, ok := info.TypeOf(v).Underlying().(*types.Interface); ok { 
     return intf.NumMethods() == 1 && intf.Method(0).FullName() == "(error).Error" 
    } 
    return false 
} 
+0

일반 코드에서는 yes입니다. 하지만 원본 파일의 대서양 표준시를 스캔하고 있으므로 ast.Expr을 입력으로 사용합니다. –

+0

코드 예제로 업데이트했습니다. –

0

은 내가이 솔루션을 선호 생각 :

https://play.golang.org/p/MA7F4Zpwqt

isError := func(v ast.Expr, info *types.Info) bool { 
    if n, ok := info.TypeOf(v).(*types.Named); ok { 
     o := n.Obj() 
     return o != nil && o.Pkg() == nil && o.Name() == "error" 
    } 
    return false 
} 
관련 문제