©
Dieses Dokument verwendet PHP-Handbuch für chinesische Websites Freigeben
import "go/types"
Overview
Index
Examples
包类型声明数据类型并实现Go包的类型检查算法。使用Config.Check来调用包的类型检查器。或者,使用NewChecker创建一个新的类型检查器,并通过调用Checker.Files来递增调用它。
类型检查由几个相互依赖的阶段组成:
名称解析将程序中的每个标识符(ast.Ident)映射到它表示的语言对象(Object)。使用Info。{Defs,Uses,Implicits}来获得名称解析的结果。
常量折叠计算每个表达式(ast.Expr)的精确常量值(constant.Value),这是一个编译时常量。使用Info.Typesexpr.Value获取常量折叠的结果。
类型推断计算每个表达式(ast.Expr)的类型(Type)并检查是否符合语言规范。使用Info.Typesexpr.Type作为类型推断的结果。
For a tutorial, see https://golang.org/s/types-tutorial.
Variables
func AssertableTo(V *Interface, T Type) bool
func AssignableTo(V, T Type) bool
func Comparable(T Type) bool
func ConvertibleTo(V, T Type) bool
func DefPredeclaredTestFuncs()
func ExprString(x ast.Expr) string
func Id(pkg *Package, name string) string
func Identical(x, y Type) bool
func IdenticalIgnoreTags(x, y Type) bool
func Implements(V Type, T *Interface) bool
func IsInterface(typ Type) bool
func ObjectString(obj Object, qf Qualifier) string
func SelectionString(s *Selection, qf Qualifier) string
func TypeString(typ Type, qf Qualifier) string
func WriteExpr(buf *bytes.Buffer, x ast.Expr)
func WriteSignature(buf *bytes.Buffer, sig *Signature, qf Qualifier)
func WriteType(buf *bytes.Buffer, typ Type, qf Qualifier)
type Array
func NewArray(elem Type, len int64) *Array
func (a *Array) Elem() Type
func (a *Array) Len() int64
func (t *Array) String() string
func (t *Array) Underlying() Type
type Basic
func (b *Basic) Info() BasicInfo
func (b *Basic) Kind() BasicKind
func (b *Basic) Name() string
func (t *Basic) String() string
func (t *Basic) Underlying() Type
type BasicInfo
type BasicKind
type Builtin
func (obj *Builtin) Exported() bool
func (obj *Builtin) Id() string
func (obj *Builtin) Name() string
func (obj *Builtin) Parent() *Scope
func (obj *Builtin) Pkg() *Package
func (obj *Builtin) Pos() token.Pos
func (obj *Builtin) String() string
func (obj *Builtin) Type() Type
type Chan
func NewChan(dir ChanDir, elem Type) *Chan
func (c *Chan) Dir() ChanDir
func (c *Chan) Elem() Type
func (t *Chan) String() string
func (t *Chan) Underlying() Type
type ChanDir
type Checker
func NewChecker(conf *Config, fset *token.FileSet, pkg *Package, info *Info) *Checker
func (check *Checker) Files(files []*ast.File) error
type Config
func (conf *Config) Check(path string, fset *token.FileSet, files []*ast.File, info *Info) (*Package, error)
type Const
func NewConst(pos token.Pos, pkg *Package, name string, typ Type, val constant.Value) *Const
func (obj *Const) Exported() bool
func (obj *Const) Id() string
func (obj *Const) Name() string
func (obj *Const) Parent() *Scope
func (obj *Const) Pkg() *Package
func (obj *Const) Pos() token.Pos
func (obj *Const) String() string
func (obj *Const) Type() Type
func (obj *Const) Val() constant.Value
type Error
func (err Error) Error() string
type Func
func MissingMethod(V Type, T *Interface, static bool) (method *Func, wrongType bool)
func NewFunc(pos token.Pos, pkg *Package, name string, sig *Signature) *Func
func (obj *Func) Exported() bool
func (obj *Func) FullName() string
func (obj *Func) Id() string
func (obj *Func) Name() string
func (obj *Func) Parent() *Scope
func (obj *Func) Pkg() *Package
func (obj *Func) Pos() token.Pos
func (obj *Func) Scope() *Scope
func (obj *Func) String() string
func (obj *Func) Type() Type
type ImportMode
type Importer
type ImporterFrom
type Info
func (info *Info) ObjectOf(id *ast.Ident) Object
func (info *Info) TypeOf(e ast.Expr) Type
type Initializer
func (init *Initializer) String() string
type Interface
func NewInterface(methods []*Func, embeddeds []*Named) *Interface
func (t *Interface) Complete() *Interface
func (t *Interface) Embedded(i int) *Named
func (t *Interface) Empty() bool
func (t *Interface) ExplicitMethod(i int) *Func
func (t *Interface) Method(i int) *Func
func (t *Interface) NumEmbeddeds() int
func (t *Interface) NumExplicitMethods() int
func (t *Interface) NumMethods() int
func (t *Interface) String() string
func (t *Interface) Underlying() Type
type Label
func NewLabel(pos token.Pos, pkg *Package, name string) *Label
func (obj *Label) Exported() bool
func (obj *Label) Id() string
func (obj *Label) Name() string
func (obj *Label) Parent() *Scope
func (obj *Label) Pkg() *Package
func (obj *Label) Pos() token.Pos
func (obj *Label) String() string
func (obj *Label) Type() Type
type Map
func NewMap(key, elem Type) *Map
func (m *Map) Elem() Type
func (m *Map) Key() Type
func (t *Map) String() string
func (t *Map) Underlying() Type
type MethodSet
func NewMethodSet(T Type) *MethodSet
func (s *MethodSet) At(i int) *Selection
func (s *MethodSet) Len() int
func (s *MethodSet) Lookup(pkg *Package, name string) *Selection
func (s *MethodSet) String() string
type Named
func NewNamed(obj *TypeName, underlying Type, methods []*Func) *Named
func (t *Named) AddMethod(m *Func)
func (t *Named) Method(i int) *Func
func (t *Named) NumMethods() int
func (t *Named) Obj() *TypeName
func (t *Named) SetUnderlying(underlying Type)
func (t *Named) String() string
func (t *Named) Underlying() Type
type Nil
func (obj *Nil) Exported() bool
func (obj *Nil) Id() string
func (obj *Nil) Name() string
func (obj *Nil) Parent() *Scope
func (obj *Nil) Pkg() *Package
func (obj *Nil) Pos() token.Pos
func (obj *Nil) String() string
func (obj *Nil) Type() Type
type Object
func LookupFieldOrMethod(T Type, addressable bool, pkg *Package, name string) (obj Object, index []int, indirect bool)
type Package
func NewPackage(path, name string) *Package
func (pkg *Package) Complete() bool
func (pkg *Package) Imports() []*Package
func (pkg *Package) MarkComplete()
func (pkg *Package) Name() string
func (pkg *Package) Path() string
func (pkg *Package) Scope() *Scope
func (pkg *Package) SetImports(list []*Package)
func (pkg *Package) SetName(name string)
func (pkg *Package) String() string
type PkgName
func NewPkgName(pos token.Pos, pkg *Package, name string, imported *Package) *PkgName
func (obj *PkgName) Exported() bool
func (obj *PkgName) Id() string
func (obj *PkgName) Imported() *Package
func (obj *PkgName) Name() string
func (obj *PkgName) Parent() *Scope
func (obj *PkgName) Pkg() *Package
func (obj *PkgName) Pos() token.Pos
func (obj *PkgName) String() string
func (obj *PkgName) Type() Type
type Pointer
func NewPointer(elem Type) *Pointer
func (p *Pointer) Elem() Type
func (t *Pointer) String() string
func (t *Pointer) Underlying() Type
type Qualifier
func RelativeTo(pkg *Package) Qualifier
type Scope
func NewScope(parent *Scope, pos, end token.Pos, comment string) *Scope
func (s *Scope) Child(i int) *Scope
func (s *Scope) Contains(pos token.Pos) bool
func (s *Scope) End() token.Pos
func (s *Scope) Innermost(pos token.Pos) *Scope
func (s *Scope) Insert(obj Object) Object
func (s *Scope) Len() int
func (s *Scope) Lookup(name string) Object
func (s *Scope) LookupParent(name string, pos token.Pos) (*Scope, Object)
func (s *Scope) Names() []string
func (s *Scope) NumChildren() int
func (s *Scope) Parent() *Scope
func (s *Scope) Pos() token.Pos
func (s *Scope) String() string
func (s *Scope) WriteTo(w io.Writer, n int, recurse bool)
type Selection
func (s *Selection) Index() []int
func (s *Selection) Indirect() bool
func (s *Selection) Kind() SelectionKind
func (s *Selection) Obj() Object
func (s *Selection) Recv() Type
func (s *Selection) String() string
func (s *Selection) Type() Type
type SelectionKind
type Signature
func NewSignature(recv *Var, params, results *Tuple, variadic bool) *Signature
func (s *Signature) Params() *Tuple
func (s *Signature) Recv() *Var
func (s *Signature) Results() *Tuple
func (t *Signature) String() string
func (t *Signature) Underlying() Type
func (s *Signature) Variadic() bool
type Sizes
func SizesFor(compiler, arch string) Sizes
type Slice
func NewSlice(elem Type) *Slice
func (s *Slice) Elem() Type
func (t *Slice) String() string
func (t *Slice) Underlying() Type
type StdSizes
func (s *StdSizes) Alignof(T Type) int64
func (s *StdSizes) Offsetsof(fields []*Var) []int64
func (s *StdSizes) Sizeof(T Type) int64
type Struct
func NewStruct(fields []*Var, tags []string) *Struct
func (s *Struct) Field(i int) *Var
func (s *Struct) NumFields() int
func (t *Struct) String() string
func (s *Struct) Tag(i int) string
func (t *Struct) Underlying() Type
type Tuple
func NewTuple(x ...*Var) *Tuple
func (t *Tuple) At(i int) *Var
func (t *Tuple) Len() int
func (t *Tuple) String() string
func (t *Tuple) Underlying() Type
type Type
func Default(typ Type) Type
type TypeAndValue
func Eval(fset *token.FileSet, pkg *Package, pos token.Pos, expr string) (TypeAndValue, error)
func (tv TypeAndValue) Addressable() bool
func (tv TypeAndValue) Assignable() bool
func (tv TypeAndValue) HasOk() bool
func (tv TypeAndValue) IsBuiltin() bool
func (tv TypeAndValue) IsNil() bool
func (tv TypeAndValue) IsType() bool
func (tv TypeAndValue) IsValue() bool
func (tv TypeAndValue) IsVoid() bool
type TypeName
func NewTypeName(pos token.Pos, pkg *Package, name string, typ Type) *TypeName
func (obj *TypeName) Exported() bool
func (obj *TypeName) Id() string
func (obj *TypeName) IsAlias() bool
func (obj *TypeName) Name() string
func (obj *TypeName) Parent() *Scope
func (obj *TypeName) Pkg() *Package
func (obj *TypeName) Pos() token.Pos
func (obj *TypeName) String() string
func (obj *TypeName) Type() Type
type Var
func NewField(pos token.Pos, pkg *Package, name string, typ Type, anonymous bool) *Var
func NewParam(pos token.Pos, pkg *Package, name string, typ Type) *Var
func NewVar(pos token.Pos, pkg *Package, name string, typ Type) *Var
func (obj *Var) Anonymous() bool
func (obj *Var) Exported() bool
func (obj *Var) Id() string
func (obj *Var) IsField() bool
func (obj *Var) Name() string
func (obj *Var) Parent() *Scope
func (obj *Var) Pkg() *Package
func (obj *Var) Pos() token.Pos
func (obj *Var) String() string
func (obj *Var) Type() Type
Info MethodSet Scope
api.go assignments.go builtins.go call.go check.go conversions.go decl.go errors.go eval.go expr.go exprstring.go initorder.go labels.go lookup.go methodset.go object.go objset.go operand.go ordering.go package.go predicates.go resolver.go return.go scope.go selection.go sizes.go stmt.go type.go typestring.go typexpr.go universe.go
var ( Universe *Scope Unsafe *Package)
var Typ = []*Basic{ Invalid: {Invalid, 0, "invalid type"}, Bool: {Bool, IsBoolean, "bool"}, Int: {Int, IsInteger, "int"}, Int8: {Int8, IsInteger, "int8"}, Int16: {Int16, IsInteger, "int16"}, Int32: {Int32, IsInteger, "int32"}, Int64: {Int64, IsInteger, "int64"}, Uint: {Uint, IsInteger | IsUnsigned, "uint"}, Uint8: {Uint8, IsInteger | IsUnsigned, "uint8"}, Uint16: {Uint16, IsInteger | IsUnsigned, "uint16"}, Uint32: {Uint32, IsInteger | IsUnsigned, "uint32"}, Uint64: {Uint64, IsInteger | IsUnsigned, "uint64"}, Uintptr: {Uintptr, IsInteger | IsUnsigned, "uintptr"}, Float32: {Float32, IsFloat, "float32"}, Float64: {Float64, IsFloat, "float64"}, Complex64: {Complex64, IsComplex, "complex64"}, Complex128: {Complex128, IsComplex, "complex128"}, String: {String, IsString, "string"}, UnsafePointer: {UnsafePointer, 0, "Pointer"}, UntypedBool: {UntypedBool, IsBoolean | IsUntyped, "untyped bool"}, UntypedInt: {UntypedInt, IsInteger | IsUntyped, "untyped int"}, UntypedRune: {UntypedRune, IsInteger | IsUntyped, "untyped rune"}, UntypedFloat: {UntypedFloat, IsFloat | IsUntyped, "untyped float"}, UntypedComplex: {UntypedComplex, IsComplex | IsUntyped, "untyped complex"}, UntypedString: {UntypedString, IsString | IsUntyped, "untyped string"}, UntypedNil: {UntypedNil, IsUntyped, "untyped nil"},}
func AssertableTo(V *Interface, T Type) bool
AssertableTo报告是否可以声明类型V的值具有类型T.
func AssignableTo(V, T Type) bool
AssignableTo报告类型V的值是否可分配给类型为T的变量。
func Comparable(T Type) bool
可比较的报告类型T的值是否可比。
func ConvertibleTo(V, T Type) bool
ConvertibleTo报告类型V的值是否可转换为类型T的值。
func DefPredeclaredTestFuncs()
DefPredeclaredTestFuncs定义了断言和跟踪内建。这些内置程序仅用于调试和测试此软件包。
func ExprString(x ast.Expr) string
ExprString返回x的(可能简化的)字符串表示。
func Id(pkg *Package, name string) string
如果导出的名称为ID,则返回名称,否则返回符合包路径的名称。
func Identical(x, y Type) bool
相同的报告,无论x和y是否相同。
func IdenticalIgnoreTags(x, y Type) bool
如果标记被忽略,IdenticalIgnoreTags报告x和y是否相同。
func Implements(V Type, T *Interface) bool
实现报告类型V是否实现接口T.
func IsInterface(typ Type) bool
IsInterface报告typ是否是接口类型。
func ObjectString(obj Object, qf Qualifier) string
ObjectString返回obj的字符串形式。限定符控制包级别对象的打印,可能为零。
func SelectionString(s *Selection, qf Qualifier) string
SelectionString返回s的字符串形式。限定符控制包级别对象的打印,可能为零。
例子:
"field (T) f int""method (T) f(X) Y""method expr (T) f(X) Y"
func TypeString(typ Type, qf Qualifier) string
TypeString返回typ的字符串表示形式。限定符控制包级别对象的打印,可能为零。
func WriteExpr(buf *bytes.Buffer, x ast.Expr)
WriteExpr将(可能简化的)x的字符串表示写入buf。
func WriteSignature(buf *bytes.Buffer, sig *Signature, qf Qualifier)
WriteSignature将签名sig的表示形式写入buf,而没有前导的“func”关键字。限定符控制包级别对象的打印,可能为零。
func WriteType(buf *bytes.Buffer, typ Type, qf Qualifier)
WriteType将typ的字符串表示形式写入buf。限定符控制包级别对象的打印,可能为零。
一个Array表示一个数组类型。
type Array struct { // contains filtered or unexported fields}
func NewArray(elem Type, len int64) *Array
NewArray为给定的元素类型和长度返回一个新的数组类型。
func (a *Array) Elem() Type
Elem返回元素类型的数组a。
func (a *Array) Len() int64
Len返回数组a的长度。
func (t *Array) String() string
func (t *Array) Underlying() Type
Basic代表基本类型。
type Basic struct { // contains filtered or unexported fields}
func (b *Basic) Info() BasicInfo
Info返回有关基本类型b属性的信息。
func (b *Basic) Kind() BasicKind
Kind返回那种基本类型b。
func (b *Basic) Name() string
Name返回基本类型的名称b。
func (t *Basic) String() string
func (t *Basic) Underlying() Type
BasicInfo是一组描述基本类型属性的标志。
type BasicInfo int
基本类型的属性。
const ( IsBoolean BasicInfo = 1 << iota IsInteger IsUnsigned IsFloat IsComplex IsString IsUntyped IsOrdered = IsInteger | IsFloat | IsString IsNumeric = IsInteger | IsFloat | IsComplex IsConstType = IsBoolean | IsNumeric | IsString)
BasicKind描述了这种基本类型。
type BasicKind int
const ( Invalid BasicKind = iota // type is invalid // predeclared types Bool Int Int8 Int16 Int32 Int64 Uint Uint8 Uint16 Uint32 Uint64 Uintptr Float32 Float64 Complex64 Complex128 String UnsafePointer // types for untyped values UntypedBool UntypedInt UntypedRune UntypedFloat UntypedComplex UntypedString UntypedNil // aliases Byte = Uint8 Rune = Int32)
Builtin代表内置函数。Builtins没有有效的类型。
type Builtin struct { // contains filtered or unexported fields}
func (obj *Builtin) Exported() bool
func (obj *Builtin) Id() string
func (obj *Builtin) Name() string
func (obj *Builtin) Parent() *Scope
func (obj *Builtin) Pkg() *Package
func (obj *Builtin) Pos() token.Pos
func (obj *Builtin) String() string
func (obj *Builtin) Type() Type
Chan代表频道类型。
type Chan struct { // contains filtered or unexported fields}
func NewChan(dir ChanDir, elem Type) *Chan
NewChan为给定的方向和元素类型返回一个新的通道类型。
func (c *Chan) Dir() ChanDir
Dir返回通道c的方向。
func (c *Chan) Elem() Type
Elem返回通道c的元素类型。
func (t *Chan) String() string
func (t *Chan) Underlying() Type
ChanDir值表示通道方向。
type ChanDir int
通道的方向由这些常数中的一个表示。
const ( SendRecv ChanDir = iota SendOnly RecvOnly)
Checke维护类型检查器的状态。它必须使用NewChecker创建。
type Checker struct { *Info // contains filtered or unexported fields}
func NewChecker(conf *Config, fset *token.FileSet, pkg *Package, info *Info) *Checker
NewChecker为给定的包返回一个新的Checker实例。包文件可以通过checker.Files增量添加。
func (check *Checker) Files(files []*ast.File) error
Files将检查提供的文件作为检查程序包的一部分。
Config指定类型检查的配置。Config的零值是一个随时可用的默认配置。
type Config struct { // If IgnoreFuncBodies is set, function bodies are not // type-checked. IgnoreFuncBodies bool // If FakeImportC is set, `import "C"` (for packages requiring Cgo) // declares an empty "C" package and errors are omitted for qualified // identifiers referring to package C (which won't find an object). // This feature is intended for the standard library cmd/api tool. // // Caution: Effects may be unpredictable due to follow-on errors. // Do not use casually! FakeImportC bool // If Error != nil, it is called with each error found // during type checking; err has dynamic type Error. // Secondary errors (for instance, to enumerate all types // involved in an invalid recursive type declaration) have // error strings that start with a '\t' character. // If Error == nil, type-checking stops with the first // error found. Error func(err error) // An importer is used to import packages referred to from // import declarations. // If the installed importer implements ImporterFrom, the type // checker calls ImportFrom instead of Import. // The type checker reports an error if an importer is needed // but none was installed. Importer Importer // If Sizes != nil, it provides the sizing functions for package unsafe. // Otherwise SizesFor("gc", "amd64") is used instead. Sizes Sizes // If DisableUnusedImportCheck is set, packages are not checked // for unused imports. DisableUnusedImportCheck bool}
func (conf *Config) Check(path string, fset *token.FileSet, files []*ast.File, info *Info) (*Package, error)
检查类型 - 检查包并返回结果包对象和第一个错误(如果有的话)。此外,如果info!= nil,则检查信息结构中的每个非零映射。
如果没有错误发生,软件包被标记为完成,否则它是不完整的。请参阅Config.Error以在出现错误时控制行为。
该软件包由* ast.Files和相应的文件集列表以及软件包标识的软件包路径指定。干净的路径不能为空或点(“。”)。
Const表示一个声明的常量。
type Const struct { // contains filtered or unexported fields}
func NewConst(pos token.Pos, pkg *Package, name string, typ Type, val constant.Value) *Const
func (obj *Const) Exported() bool
func (obj *Const) Id() string
func (obj *Const) Name() string
func (obj *Const) Parent() *Scope
func (obj *Const) Pkg() *Package
func (obj *Const) Pos() token.Pos
func (obj *Const) String() string
func (obj *Const) Type() Type
func (obj *Const) Val() constant.Value
Error 描述了类型检查错误; 它实现了错误接口。“软”错误是仍然允许对包进行有效解释的错误(例如“未使用的变量”); 如果忽略,“硬”错误可能会导致不可预知的行为。
type Error struct { Fset *token.FileSet // file set for interpretation of Pos Pos token.Pos // error position Msg string // error message Soft bool // if set, error is "soft"}
func (err Error) Error() string
Error返回格式如下的错误字符串:filename:line:column:message
Func表示声明的函数,具体方法或抽象(接口)方法。它的Type()总是一个* Signature。由于嵌入,抽象方法可能属于许多接口。
type Func struct { // contains filtered or unexported fields}
func MissingMethod(V Type, T *Interface, static bool) (method *Func, wrongType bool)
如果V实现了T,则MissingMethod返回(nil,false),否则返回T所需的缺失方法以及它是否丢失或仅具有错误类型。
对于非接口类型V,或者如果设置了静态,V如果T中的所有方法都存在于V中,则实现T.否则(V是接口并且未设置静态),MissingMethod仅检查同时存在的T的方法在V中具有匹配类型(例如,对于类型声明x(T),其中x是接口类型V)。
func NewFunc(pos token.Pos, pkg *Package, name string, sig *Signature) *Func
func (obj *Func) Exported() bool
func (obj *Func) FullName() string
FullName返回函数或方法obj的包或接收器类型限定名称。
func (obj *Func) Id() string
func (obj *Func) Name() string
func (obj *Func) Parent() *Scope
func (obj *Func) Pkg() *Package
func (obj *Func) Pos() token.Pos
func (obj *Func) Scope() *Scope
func (obj *Func) String() string
func (obj *Func) Type() Type
ImportMode保留供将来使用。
type ImportMode int
Importer程序解析导入到程序包的路径。
小心:此界面不支持导入本地出售的软件包。见https://golang.org/s/go15vendor。如果可能的话,外部实现应该实现ImporterFrom。
type Importer interface { // Import returns the imported package for the given import path. // The semantics is like for ImporterFrom.ImportFrom except that // dir and mode are ignored (since they are not present). Import(path string) (*Package, error)}
一个ImporterFrom解析导入路径到包; 它支持根据https://golang.org/s/go15vendor进行销售。使用go / importer获取一个ImporterFrom实现。
type ImporterFrom interface { // Importer is present for backward-compatibility. Calling // Import(path) is the same as calling ImportFrom(path, "", 0); // i.e., locally vendored packages may not be found. // The types package does not call Import if an ImporterFrom // is present. Importer // ImportFrom returns the imported package for the given import // path when imported by a package file located in dir. // If the import failed, besides returning an error, ImportFrom // is encouraged to cache and return a package anyway, if one // was created. This will reduce package inconsistencies and // follow-on type checker errors due to the missing package. // The mode value must be 0; it is reserved for future use. // Two calls to ImportFrom with the same path and dir must // return the same package. ImportFrom(path, dir string, mode ImportMode) (*Package, error)}
Info包含类型检查包的结果类型信息。只收集提供地图的信息。如果软件包有类型错误,则收集的信息可能不完整。
type Info struct { // Types maps expressions to their types, and for constant // expressions, also their values. Invalid expressions are // omitted. // // For (possibly parenthesized) identifiers denoting built-in // functions, the recorded signatures are call-site specific: // if the call result is not a constant, the recorded type is // an argument-specific signature. Otherwise, the recorded type // is invalid. // // The Types map does not record the type of every identifier, // only those that appear where an arbitrary expression is // permitted. For instance, the identifier f in a selector // expression x.f is found only in the Selections map, the // identifier z in a variable declaration 'var z int' is found // only in the Defs map, and identifiers denoting packages in // qualified identifiers are collected in the Uses map. Types map[ast.Expr]TypeAndValue // Defs maps identifiers to the objects they define (including // package names, dots "." of dot-imports, and blank "_" identifiers). // For identifiers that do not denote objects (e.g., the package name // in package clauses, or symbolic variables t in t := x.(type) of // type switch headers), the corresponding objects are nil. // // For an anonymous field, Defs returns the field *Var it defines. // // Invariant: Defs[id] == nil || Defs[id].Pos() == id.Pos() Defs map[*ast.Ident]Object // Uses maps identifiers to the objects they denote. // // For an anonymous field, Uses returns the *TypeName it denotes. // // Invariant: Uses[id].Pos() != id.Pos() Uses map[*ast.Ident]Object // Implicits maps nodes to their implicitly declared objects, if any. // The following node and object types may appear: // // node declared object // // *ast.ImportSpec *PkgName for dot-imports and imports without renames // *ast.CaseClause type-specific *Var for each type switch case clause (incl. default) // *ast.Field anonymous parameter *Var // Implicits map[ast.Node]Object // Selections maps selector expressions (excluding qualified identifiers) // to their corresponding selections. Selections map[*ast.SelectorExpr]*Selection // Scopes maps ast.Nodes to the scopes they define. Package scopes are not // associated with a specific node but with all files belonging to a package. // Thus, the package scope can be found in the type-checked Package object. // Scopes nest, with the Universe scope being the outermost scope, enclosing // the package scope, which contains (one or more) files scopes, which enclose // function scopes which in turn enclose statement and function literal scopes. // Note that even though package-level functions are declared in the package // scope, the function scopes are embedded in the file scope of the file // containing the function declaration. // // The following node types may appear in Scopes: // // *ast.File // *ast.FuncType // *ast.BlockStmt // *ast.IfStmt // *ast.SwitchStmt // *ast.TypeSwitchStmt // *ast.CaseClause // *ast.CommClause // *ast.ForStmt // *ast.RangeStmt // Scopes map[ast.Node]*Scope // InitOrder is the list of package-level initializers in the order in which // they must be executed. Initializers referring to variables related by an // initialization dependency appear in topological order, the others appear // in source order. Variables without an initialization expression do not // appear in this list. InitOrder []*Initializer}
ExampleInfo在type.Info结构中显示类型检查器记录的各种事实:每个命名对象的定义和引用,以及包中每个表达式的类型,值和模式。
代码:
// Parse a single source file.const input = ` package fib type S string var a, b, c = len(b), S(c), "hello" func fib(x int) int { if x < 2 { return x } return fib(x-1) - fib(x-2) }`fset := token.NewFileSet()f, err := parser.ParseFile(fset, "fib.go", input, 0)if err != nil { log.Fatal(err)}// Type-check the package.// We create an empty map for each kind of input// we're interested in, and Check populates them.info := types.Info{ Types: make(map[ast.Expr]types.TypeAndValue), Defs: make(map[*ast.Ident]types.Object), Uses: make(map[*ast.Ident]types.Object),}var conf types.Config pkg, err := conf.Check("fib", fset, []*ast.File{f}, &info)if err != nil { log.Fatal(err)}// Print package-level variables in initialization order.fmt.Printf("InitOrder: %v\n\n", info.InitOrder)// For each named object, print the line and// column of its definition and each of its uses.fmt.Println("Defs and Uses of each named object:")usesByObj := make(map[types.Object][]string)for id, obj := range info.Uses { posn := fset.Position(id.Pos()) lineCol := fmt.Sprintf("%d:%d", posn.Line, posn.Column) usesByObj[obj] = append(usesByObj[obj], lineCol)}var items []stringfor obj, uses := range usesByObj { sort.Strings(uses) item := fmt.Sprintf("%s:\n defined at %s\n used at %s", types.ObjectString(obj, types.RelativeTo(pkg)), fset.Position(obj.Pos()), strings.Join(uses, ", ")) items = append(items, item)}sort.Strings(items) // sort by line:col, in effectfmt.Println(strings.Join(items, "\n"))fmt.Println()fmt.Println("Types and Values of each expression:")items = nilfor expr, tv := range info.Types { var buf bytes.Buffer posn := fset.Position(expr.Pos()) tvstr := tv.Type.String() if tv.Value != nil { tvstr += " = " + tv.Value.String() } // line:col | expr | mode : type = value fmt.Fprintf(&buf, "%2d:%2d | %-19s | %-7s : %s", posn.Line, posn.Column, exprString(fset, expr), mode(tv), tvstr) items = append(items, buf.String())}sort.Strings(items)fmt.Println(strings.Join(items, "\n"))
输出:
InitOrder: [c = "hello" b = S(c) a = len(b)]Defs and Uses of each named object:builtin len: defined at - used at 6:15func fib(x int) int: defined at fib.go:8:6 used at 12:20, 12:9type S string: defined at fib.go:4:6 used at 6:23type int: defined at - used at 8:12, 8:17type string: defined at - used at 4:8var b S: defined at fib.go:6:8 used at 6:19var c string: defined at fib.go:6:11 used at 6:25var x int: defined at fib.go:8:10 used at 10:10, 12:13, 12:24, 9:5Types and Values of each expression: 4: 8 | string | type : string 6:15 | len | builtin : func(string) int 6:15 | len(b) | value : int 6:19 | b | var : fib.S 6:23 | S | type : fib.S 6:23 | S(c) | value : fib.S 6:25 | c | var : string 6:29 | "hello" | value : string = "hello" 8:12 | int | type : int 8:17 | int | type : int 9: 5 | x | var : int 9: 5 | x < 2 | value : untyped bool 9: 9 | 2 | value : int = 210:10 | x | var : int12: 9 | fib | value : func(x int) int12: 9 | fib(x - 1) | value : int12: 9 | fib(x-1) - fib(x-2) | value : int12:13 | x | var : int12:13 | x - 1 | value : int12:15 | 1 | value : int = 112:20 | fib | value : func(x int) int12:20 | fib(x - 2) | value : int12:24 | x | var : int12:24 | x - 2 | value : int12:26 | 2 | value : int = 2
func (info *Info) ObjectOf(id *ast.Ident) Object
ObjectOf返回由指定的id表示的对象,如果没有找到,则返回nil。
如果id是一个匿名结构字段,则ObjectOf返回它使用的字段(* Var),而不是它定义的类型(* TypeName)。
先决条件:使用和Defs地图被填充。
func (info *Info) TypeOf(e ast.Expr) Type
TypeOf返回表达式e的类型,如果未找到,则返回nil。先决条件:填充类型,使用和定义地图。
Initializer描述一个程序包级别的变量或多值初始化表达式中的变量列表,以及相应的初始化表达式。
type Initializer struct { Lhs []*Var // var Lhs = Rhs Rhs ast.Expr}
func (init *Initializer) String() string
Interfac表示接口类型。
type Interface struct { // contains filtered or unexported fields}
func NewInterface(methods []*Func, embeddeds []*Named) *Interface
NewInterface为给定的方法和嵌入式类型返回一个新的接口。
func (t *Interface) Complete() *Interface
Complete计算接口的方法集。必须在接口的嵌入类型完全定义之后,以及除了形成其他类型之外的任何其他方式使用接口类型之前,由NewInterface的用户调用它。Complete返回接收器。
func (t *Interface) Embedded(i int) *Named
嵌入返回0 <= i <t.NumEmbeddeds()的第i个嵌入类型的接口t。这些类型由相应的TypeName的唯一ID排序。
func (t *Interface) Empty() bool
如果t是空的界面,则空值返回true。
func (t *Interface) ExplicitMethod(i int) *Func
ExplicitMethod为0 <= i <t.NumExplicitMethods()返回接口t显式声明的方法。这些方法按其唯一标识进行排序。
func (t *Interface) Method(i int) *Func
方法返回0 <= i <t.NumMethods()的接口t的第i个方法。这些方法按其唯一标识进行排序。
func (t *Interface) NumEmbeddeds() int
NumEmbeddeds返回接口t中嵌入类型的数量。
func (t *Interface) NumExplicitMethods() int
NumExplicitMethods返回接口t的显式声明方法的数量。
func (t *Interface) NumMethods() int
NumMethods返回接口t的方法总数。
func (t *Interface) String() string
func (t *Interface) Underlying() Type
Label 代表一个声明的标签。
type Label struct { // contains filtered or unexported fields}
func NewLabel(pos token.Pos, pkg *Package, name string) *Label
func (obj *Label) Exported() bool
func (obj *Label) Id() string
func (obj *Label) Name() string
func (obj *Label) Parent() *Scope
func (obj *Label) Pkg() *Package
func (obj *Label) Pos() token.Pos
func (obj *Label) String() string
func (obj *Label) Type() Type
Map代表地图类型。
type Map struct { // contains filtered or unexported fields}
func NewMap(key, elem Type) *Map
NewMap为给定的键和元素类型返回一个新的映射。
func (m *Map) Elem() Type
Elem返回地图m的元素类型。
func (m *Map) Key() Type
Key返回地图m的键类型。
func (t *Map) String() string
func (t *Map) Underlying() Type
MethodSet是一组有序的或抽象(接口)方法的有序集合; 一个方法是一个MethodVal选择,它们按照m.Obj()。Id()的顺序排序。MethodSet的零值是一个随时可用的空方法集。
type MethodSet struct { // contains filtered or unexported fields}
ExampleMethodSet打印各种类型的方法集。
package mainimport ("fmt""go/ast""go/importer""go/parser""go/token""go/types""log")func main() {// Parse a single source file.const input = ` package temperature import "fmt" type Celsius float64 func (c Celsius) String() string { return fmt.Sprintf("%g°C", c) } func (c *Celsius) SetF(f float64) { *c = Celsius(f - 32 / 9 * 5) } ` fset := token.NewFileSet() f, err := parser.ParseFile(fset, "celsius.go", input, 0)if err != nil { log.Fatal(err)}// Type-check a package consisting of this file.// Type information for the imported packages// comes from $GOROOT/pkg/$GOOS_$GOOARCH/fmt.a. conf := types.Config{Importer: importer.Default()} pkg, err := conf.Check("temperature", fset, []*ast.File{f}, nil)if err != nil { log.Fatal(err)}// Print the method sets of Celsius and *Celsius. celsius := pkg.Scope().Lookup("Celsius").Type()for _, t := range []types.Type{celsius, types.NewPointer(celsius)} { fmt.Printf("Method set of %s:\n", t) mset := types.NewMethodSet(t)for i := 0; i < mset.Len(); i++ { fmt.Println(mset.At(i))} fmt.Println()}}
func NewMethodSet(T Type) *MethodSet
NewMethodSet返回为给定类型T设置的方法。它总是返回一个非零方法集,即使它是空的。
func (s *MethodSet) At(i int) *Selection
在返回s中的第i个方法为0 <= i <s.Len()。
func (s *MethodSet) Len() int
Len返回s中方法的数量。
func (s *MethodSet) Lookup(pkg *Package, name string) *Selection
查找将返回匹配包和名称的方法,如果未找到,则返回nil。
func (s *MethodSet) String() string
名称代表一个指定类型。
type Named struct { // contains filtered or unexported fields}
func NewNamed(obj *TypeName, underlying Type, methods []*Func) *Named
NewNamed为给定的类型名称,基础类型和关联的方法返回一个新的命名类型。基础类型不能是*命名。
func (t *Named) AddMethod(m *Func)
AddMethod添加方法m,除非它已经在方法列表中。TODO(gri)找到一个更好的解决方案,而不是提供这个功能
func (t *Named) Method(i int) *Func
方法返回0 <= i <t.NumMethods()的命名类型t的第i个方法。
func (t *Named) NumMethods() int
NumMethods返回接收者被命名为类型t的显式方法的数量。
func (t *Named) Obj() *TypeName
Obj返回指定类型t的类型名称。
func (t *Named) SetUnderlying(underlying Type)
SetUnderlying设置底层类型并将t标记为完整。TODO(gri)确定是否有更好的解决方案,而不是提供此功能
func (t *Named) String() string
func (t *Named) Underlying() Type
无表示预先声明的值nil。
type Nil struct { // contains filtered or unexported fields}
func (obj *Nil) Exported() bool
func (obj *Nil) Id() string
func (obj *Nil) Name() string
func (obj *Nil) Parent() *Scope
func (obj *Nil) Pkg() *Package
func (obj *Nil) Pos() token.Pos
func (obj *Nil) String() string
func (obj *Nil) Type() Type
一个对象描述了一个命名的语言实体,如包,常量,类型,变量,函数(包括方法)或标签。所有对象都实现了Object接口。
type Object interface { Parent() *Scope // scope in which this object is declared; nil for methods and struct fields Pos() token.Pos // position of object identifier in declaration Pkg() *Package // nil for objects in the Universe scope and labels Name() string // package local object name Type() Type // object type Exported() bool // reports whether the name starts with a capital letter Id() string // object name if exported, qualified name if not exported (see func Id) // String returns a human-readable string of the object. String() string // contains filtered or unexported methods}
func LookupFieldOrMethod(T Type, addressable bool, pkg *Package, name string) (obj Object, index []int, indirect bool)
LookupFieldOrMethod在T中查找具有给定包和名称的字段或方法,并返回相应的* Var或* Func,一个索引序列和一个bool,指示在字段或方法的路径上是否存在任何指针间接。如果设置了可寻址,则T是可寻址变量的类型(仅用于方法查找)。
最后一个索引条目是找到该条目的(可能是嵌入的)类型中的字段或方法索引,可以是:
1) the list of declared methods of a named type; or2) the list of all methods (method set) of an interface type; or3) the list of fields of a struct type.
较早的索引条目是从深度0开始,遍历到找到的条目的匿名结构字段的索引。
如果没有找到条目,则返回一个零对象。在这种情况下,返回的索引和间接值具有以下含义:
- If index != nil, the index sequence points to an ambiguous entry(the same name appeared more than once at the same embedding level).- If indirect is set, a method with a pointer receiver type was found but there was no pointer on the path from the actual receiver type to the method's formal receiver base type, nor was the receiver addressable.
一个包描述了一个Go包。
type Package struct { // contains filtered or unexported fields}
func NewPackage(path, name string) *Package
NewPackage为给定的包路径和名称返回一个新的包。该软件包不完整,不包含明确的导入。
func (pkg *Package) Complete() bool
如果其范围包含(至少)所有导出的对象,则该包是完整的; 否则它是不完整的。
func (pkg *Package) Imports() []*Package
Imports返回由pkg直接导入的包列表; 该列表按来源顺序排列。
如果pkg是从导出数据加载的,Imports包含提供pkg引用的软件包级对象的软件包。这可能比pkg的源代码直接导入的包集多或少。
func (pkg *Package) MarkComplete()
MarkComplete将包标记为完整。
func (pkg *Package) Name() string
名称返回包名称。
func (pkg *Package) Path() string
Path返回包路径。
func (pkg *Package) Scope() *Scope
Scope返回包含在包级别声明的对象(TypeNames,Consts,Vars和Funcs)的(完整或不完整)包范围。
func (pkg *Package) SetImports(list []*Package)
SetImports将显式导入的软件包列表设置为列表。确保列表元素是唯一的是调用者的责任。
func (pkg *Package) SetName(name string)
SetName设置包名称。
func (pkg *Package) String() string
PkgName代表一个导入的Go包。
type PkgName struct { // contains filtered or unexported fields}
func NewPkgName(pos token.Pos, pkg *Package, name string, imported *Package) *PkgName
func (obj *PkgName) Exported() bool
func (obj *PkgName) Id() string
func (obj *PkgName) Imported() *Package
Imported 返回已导入的包。它与Pkg()不同,后者是包含import语句的包。
func (obj *PkgName) Name() string
func (obj *PkgName) Parent() *Scope
func (obj *PkgName) Pkg() *Package
func (obj *PkgName) Pos() token.Pos
func (obj *PkgName) String() string
func (obj *PkgName) Type() Type
Pointer 表示指针类型。
type Pointer struct { // contains filtered or unexported fields}
func NewPointer(elem Type) *Pointer
NewPointer为给定的元素(基)类型返回一个新的指针类型。
func (p *Pointer) Elem() Type
Elem返回给定指针p的元素类型。
func (t *Pointer) String() string
func (t *Pointer) Underlying() Type
Qualifier控制如何在对TypeString,ObjectString和SelectionString的调用中打印指定的包级对象。
这三个格式化例程为每个包级别对象O调用限定符,如果限定符返回非空字符串p,则该对象将以pO形式打印。如果它返回空字符串,则仅打印对象名称O.
使用无限定符相当于使用(* Package).Path:该对象由导入路径限定,例如“encoding / json.Marshal”。
type Qualifier func(*Package) string
func RelativeTo(pkg *Package) Qualifier
RelativeTo(pkg)返回一个限定符,它可以完全限定除pkg以外的所有包的成员。
范围维护一组对象和指向其包含(父)和包含(子)范围的链接。对象可以插入并按名称查找。范围的零值是一个随时可用的空范围。
type Scope struct { // contains filtered or unexported fields}
ExampleScope打印从一组解析文件创建的包的范围树。
package mainimport ("bytes""fmt""go/ast""go/importer""go/parser""go/token""go/types""log""regexp")func main() {// Parse the source files for a package. fset := token.NewFileSet()var files []*ast.Filefor _, file := range []struct{ name, input string }{{"main.go", ` package main import "fmt" func main() { freezing := FToC(-18) fmt.Println(freezing, Boiling) } `},{"celsius.go", ` package main import "fmt" type Celsius float64 func (c Celsius) String() string { return fmt.Sprintf("%g°C", c) } func FToC(f float64) Celsius { return Celsius(f - 32 / 9 * 5) } const Boiling Celsius = 100 `},} { f, err := parser.ParseFile(fset, file.name, file.input, 0)if err != nil { log.Fatal(err)} files = append(files, f)}// Type-check a package consisting of these files.// Type information for the imported "fmt" package// comes from $GOROOT/pkg/$GOOS_$GOOARCH/fmt.a. conf := types.Config{Importer: importer.Default()} pkg, err := conf.Check("temperature", fset, files, nil)if err != nil { log.Fatal(err)}// Print the tree of scopes.// For determinism, we redact addresses.var buf bytes.Buffer pkg.Scope().WriteTo(&buf, 0, true) rx := regexp.MustCompile(` 0x[a-fA-F0-9]*`) fmt.Println(rx.ReplaceAllString(buf.String(), ""))}
func NewScope(parent *Scope, pos, end token.Pos, comment string) *Scope
如果有的话,NewScope返回给定父范围中包含的新的空范围。该评论仅用于调试。
func (s *Scope) Child(i int) *Scope
Child返回第i个子范围为0 <= i <NumChildren()。
func (s *Scope) Contains(pos token.Pos) bool
如果pos在范围的范围内,则Contains返回true。只有类型检查的AST具有完整的位置信息,结果才能保证有效。
func (s *Scope) End() token.Pos
func (s *Scope) Innermost(pos token.Pos) *Scope
Innermost返回包含pos的最内层(子)范围。如果pos不在任何范围内,结果为零。宇宙范围的结果也是零。只有类型检查的AST具有完整的位置信息,结果才能保证有效。
func (s *Scope) Insert(obj Object) Object
插入尝试将对象obj插入到作用域s中。如果s已经包含一个具有相同名称的替代对象alt,则Insert将保持不变并返回alt。否则,它插入obj,设置对象的父级作用域(如果尚未设置),并返回nil。
func (s *Scope) Len() int
Len()返回范围元素的数量。
func (s *Scope) Lookup(name string) Object
如果这样的对象存在,Lookup将返回给定名称的范围s中的对象; 否则结果为零。
func (s *Scope) LookupParent(name string, pos token.Pos) (*Scope, Object)
LookupParent遵循以s开头的作用域的父链,直到找到一个作用域,其中Lookup(name)返回一个非零对象,然后返回该作用域和对象。如果提供有效位置pos,则只考虑在pos或之前声明的对象。如果不存在这样的范围和对象,则结果是(无,无)。
请注意,如果对象被插入到作用域中并且此时已经有父对象(请参阅下面的插入),则obj.Parent()可能与返回的作用域不同。这仅适用于点导入的对象,其范围是导出它们的包的范围。
func (s *Scope) Names() []string
Names 按排序顺序返回作用域的元素名称。
func (s *Scope) NumChildren() int
NumChildren()返回嵌套在s中的范围数。
func (s *Scope) Parent() *Scope
Parent返回范围的包含(父)范围。
func (s *Scope) Pos() token.Pos
Pos和End描述范围的源代码范围[pos,end)。只有类型检查的AST具有完整的位置信息,结果才能保证有效。Universe和程序包作用域的范围未定义。
func (s *Scope) String() string
字符串返回范围的字符串表示形式,用于调试。
func (s *Scope) WriteTo(w io.Writer, n int, recurse bool)
WriteTo将范围的字符串表示形式写入w,范围元素按名称排序。缩进级别由n> = 0控制,n == 0表示无缩进。如果设置了递归,它还会写入嵌套(子)范围。
Selection述了一个选择器表达式xf对于声明:
type T struct{ x int; E }type E struct{}func (e E) m() {}var p *T
存在以下关系:
Selector Kind Recv Obj Type Index Indirect p.x FieldVal T x int {0} truep.m MethodVal *T m func (e *T) m() {1, 0} trueT.m MethodExpr T m func m(_ T) {1, 0} false
type Selection struct { // contains filtered or unexported fields}
func (s *Selection) Index() []int
索引描述xf中从x到f的路径最后一个索引条目是声明f的类型的字段或方法索引; 之一:
1) the list of declared methods of a named type; or2) the list of methods of an interface type; or3) the list of fields of a struct type.
较早的索引条目是从嵌入深度0开始隐式遍历以从(类型)x到f得到的嵌入字段的索引。
func (s *Selection) Indirect() bool
Indirect报告是否需要在xf中从x到f得到任何指针间接
func (s *Selection) Kind() SelectionKind
Kind返回选择类。
func (s *Selection) Obj() Object
Obj返回由xf表示的对象; 在所有其他情况下,用于字段选择的a * Var以及* Func。
func (s *Selection) Recv() Type
Recv返回xf中x的类型
func (s *Selection) String() string
func (s *Selection) Type() Type
Type返回xf的类型,这可能与f的类型不同。请参阅选择了解更多信息。
SelectionKind描述了选择器表达式xf的类型(不包括限定标识符)。
type SelectionKind int
const ( FieldVal SelectionKind = iota // x.f is a struct field selector MethodVal // x.f is a method selector MethodExpr // x.f is a method expression)
Signature代表(非内建)函数或方法类型。
type Signature struct { // contains filtered or unexported fields}
func NewSignature(recv *Var, params, results *Tuple, variadic bool) *Signature
NewSignature为给定的接收器,参数和结果返回一个新的函数类型,其中任何一个都可以为零。如果设置了可变参数,则该函数是可变参数,它必须至少有一个参数,最后一个参数必须是未命名的片类型。
func (s *Signature) Params() *Tuple
Params返回签名s的参数,或者nil。
func (s *Signature) Recv() *Var
Recv返回签名s的接收者(如果是方法),否则返回nil。
对于抽象方法,Recv将封闭接口作为* Named或* Interface返回。由于嵌入,接口可能包含其接收器类型是不同接口的方法。
func (s *Signature) Results() *Tuple
Results返回签名的结果,或零。
func (t *Signature) String() string
func (t *Signature) Underlying() Type
func (s *Signature) Variadic() bool
Variadic报告签名是否是可变的。
Sizes定义了封装不安全的尺寸函数。
type Sizes interface { // Alignof returns the alignment of a variable of type T. // Alignof must implement the alignment guarantees required by the spec. Alignof(T Type) int64 // Offsetsof returns the offsets of the given struct fields, in bytes. // Offsetsof must implement the offset guarantees required by the spec. Offsetsof(fields []*Var) []int64 // Sizeof returns the size of a variable of type T. // Sizeof must implement the size guarantees required by the spec. Sizeof(T Type) int64}
func SizesFor(compiler, arch string) Sizes
SizesFor返回编译器用于体系结构的大小。如果编译器/体系结构对未知,结果为零。
编译器“gc”支持的体系结构:“386”,“arm”,“arm64”,“amd64”,“amd64p32”,“mips”,“mipsle”,“mips64”,“mips64le”,“ppc64”,“ppc64le “,”s390x“。
切片表示切片类型。
type Slice struct { // contains filtered or unexported fields}
func NewSlice(elem Type) *Slice
NewSlice为给定的元素类型返回一个新的切片类型。
func (s *Slice) Elem() Type
Elem返回切片的元素类型。
func (t *Slice) String() string
func (t *Slice) Underlying() Type
StdSizes是创建常用大小的便利类型。它做出以下简化假设:
- The size of explicitly sized basic types (int16, etc.) is the specified size.- The size of strings and interfaces is 2*WordSize.- The size of slices is 3*WordSize.- The size of an array of n elements corresponds to the size of a struct of n consecutive fields of the array's element type. - The size of a struct is the offset of the last field plus that field's size. As with all element types, if the struct is used in an array its size must first be aligned to a multiple of the struct's alignment.- All other types have size WordSize.- Arrays and structs are aligned per spec definition; all other types are naturally aligned with a maximum alignment MaxAlign.
* StdSizes实现大小。
type StdSizes struct { WordSize int64 // word size in bytes - must be >= 4 (32bits) MaxAlign int64 // maximum alignment in bytes - must be >= 1}
func (s *StdSizes) Alignof(T Type) int64
func (s *StdSizes) Offsetsof(fields []*Var) []int64
func (s *StdSizes) Sizeof(T Type) int64
一个Struct表示一个结构类型。
type Struct struct { // contains filtered or unexported fields}
func NewStruct(fields []*Var, tags []string) *Struct
NewStruct返回一个带有给定字段和相应字段标签的新结构。如果索引为i的字段有一个标签,则tagsi必须是该标签,但len(标签)可能只有在索引i最大时才需要。因此,如果没有字段有标签,标签可能为零。
func (s *Struct) Field(i int) *Var
Field返回第i个字段0 <= i <NumFields()。
func (s *Struct) NumFields() int
NumFields返回结构中字段的数量(包括空白字段和匿名字段)。
func (t *Struct) String() string
func (s *Struct) Tag(i int) string
标记为0 <= i <NumFields()返回第i个字段标记。
func (t *Struct) Underlying() Type
一个Tuple表示一个有序的变量列表; 一个零*元组是一个有效的(空)元组。元组被用作签名的组成部分并表示多个赋值的类型; 他们不是Go的头等类型。
type Tuple struct { // contains filtered or unexported fields}
func NewTuple(x ...*Var) *Tuple
NewTuple为给定的变量返回一个新的元组。
func (t *Tuple) At(i int) *Var
At返回元组t的第i个变量。
func (t *Tuple) Len() int
Len返回元组t的数字变量。
func (t *Tuple) String() string
func (t *Tuple) Underlying() Type
Type代表一种Go。所有类型都实现了Type接口。
type Type interface { // Underlying returns the underlying type of a type. Underlying() Type // String returns a string representation of a type. String() string}
func Default(typ Type) Type
Default返回“无类型”类型的默认“类型”类型; 它返回所有其他类型的传入类型。untyped nil的默认类型是无类型nil。
TypeAndValue报告相应表达式的类型和值(对于常量)。
type TypeAndValue struct { Type Type Value constant.Value // contains filtered or unexported fields}
func Eval(fset *token.FileSet, pkg *Package, pos token.Pos, expr string) (TypeAndValue, error)
Eval返回类型,如果常量,则返回表达式expr的值,在包pkg的位置pos处计算,该值必须是从类型检查AST检查AST并提供相对于提供的文件集的完整位置信息。
如果表达式包含函数文字,则忽略它们的正文(即,未对文体进行类型检查)。
如果pkg == nil,则使用Universe范围,并忽略所提供的位置pos。如果pkg!= nil且pos无效,则使用软件包范围。否则,pos必须属于包。
如果pos不在包内或者无法评估节点,则会返回错误。
注意:不应该使用Eval来代替运行Check来计算类型和值,但除了Check之外。Eval每次都会重新评估它的参数,它也不知道使用表达式的上下文(例如,赋值)。因此,顶层的无类型常量将返回一个无类型的类型,而不是相应的特定于上下文的类型。
func (tv TypeAndValue) Addressable() bool
Addressable报告相应的表达式是否可寻址(https://golang.org/ref/spec#Address_operators)。
func (tv TypeAndValue) Assignable() bool
Assignable报告相应的表达式是否可分配给(提供正确类型的值)。
func (tv TypeAndValue) HasOk() bool
HasOk报告相应的表达式是否可用于逗号分配的lhs。
func (tv TypeAndValue) IsBuiltin() bool
IsBuiltin报告相应的表达式是否表示一个(可能括号内的)内置函数。
func (tv TypeAndValue) IsNil() bool
IsNil报告相应的表达式是否表示预先声明的值nil。
func (tv TypeAndValue) IsType() bool
IsType报告相应的表达式是否指定一个类型。
func (tv TypeAndValue) IsValue() bool
IsValue报告相应的表达式是否为值。建筑物不被视为价值。常量值具有非零值。
func (tv TypeAndValue) IsVoid() bool
IsVoid报告相应的表达式是否是没有结果的函数调用。
TypeName表示(named或alias)类型的名称。
type TypeName struct { // contains filtered or unexported fields}
func NewTypeName(pos token.Pos, pkg *Package, name string, typ Type) *TypeName
func (obj *TypeName) Exported() bool
func (obj *TypeName) Id() string
func (obj *TypeName) IsAlias() bool
IsAlias报告obj是否是某个类型的别名。
func (obj *TypeName) Name() string
func (obj *TypeName) Parent() *Scope
func (obj *TypeName) Pkg() *Package
func (obj *TypeName) Pos() token.Pos
func (obj *TypeName) String() string
func (obj *TypeName) Type() Type
Variable表示声明的变量(包括函数参数和结果以及结构体字段)。
type Var struct { // contains filtered or unexported fields}
func NewField(pos token.Pos, pkg *Package, name string, typ Type, anonymous bool) *Var
func NewParam(pos token.Pos, pkg *Package, name string, typ Type) *Var
func NewVar(pos token.Pos, pkg *Package, name string, typ Type) *Var
func (obj *Var) Anonymous() bool
func (obj *Var) Exported() bool
func (obj *Var) Id() string
func (obj *Var) IsField() bool
func (obj *Var) Name() string
func (obj *Var) Parent() *Scope
func (obj *Var) Pkg() *Package
func (obj *Var) Pos() token.Pos
func (obj *Var) String() string
func (obj *Var) Type() Type