非常教程

Go参考手册

go

go/build

  • import "go/build"
  • 概述
  • 索引

概述

Package build 收集有关 Go 包的信息。

Go Path

Go path 是包含 Go 源代码的目录树列表。它被咨询解决在标准 Go 树中找不到的导入。默认路径是 GOPATH 环境变量的值,被解释为适合于操作系统的路径列表(在 Unix 上,变量是冒号分隔的字符串;在 Windows 上是分号分隔的字符串;在 Plan 9上,是一个列表)。

Go path 中列出的每个目录必须具有规定的结构:

src/ 目录保存源代码。'src' 下面的路径决定了导入路径或可执行文件的名称。

pkg/directory 保存已安装的软件包对象。与 Go 树一样,每个目标操作系统和体系结构对都有自己的 pkg 子目录(pkg/GOOS_GOARCH)。

如果 DIR 是 Go 路径中列出的目录,那么在 DIR/src/foo/bar 中包含源文件的包可以作为“foo/bar”导入,并将其编译形式安装到“DIR/pkg/GOOS_GOARCH/foo/bar.a“(或者,对于gccgo,”DIR/pkg/gccgo/foo/libbar.a“)。

bin/directory 保存编译的命令。每个命令都是为其源目录命名的,但仅使用最后一个元素,而不是整个路径。也就是说,DIR/src/foo/quux 中源代码的命令安装在DIR/bin/quux中,而不是 DIR/bin/foo/quux 中。foo/ 被剥离,以便您可以将 DIR/bin 添加到 PATH 以获取已安装的命令。

以下是一个目录布局示例:

GOPATH=/home/user/gocode

/home/user/gocode/
    src/
        foo/
            bar/               (go code in package bar)
                x.go
            quux/              (go code in package main)
                y.go
    bin/
        quux                   (installed command)
    pkg/
        linux_amd64/
            foo/
                bar.a          (installed package object)

建立约束(条件)

构建约束(条件),也称为构建标记,是一个开始的行注释

// +build

其中列出了文件应该包含在软件包中的条件。约束可能出现在任何类型的源文件中(而不仅仅是 Go),但它们必须出现在文件的顶部附近,仅由空行和其他行注释开头。这些规则意味着在 Go 文件中,构建约束必须出现在 package 子句之前。

为了将构建约束与包文档区分开来,必须在一系列构建约束之后加上空行。

构建约束被评估为空间分隔选项的OR;每个选项评估为逗号分隔术语的 AND;并且每个术语都是一个字母数字字,或者以!开头,否定。即构建约束:

// +build linux,386 darwin,!cgo

对应于布尔公式:

(linux AND 386) OR (darwin AND (NOT cgo))

一个文件可能有多个构建约束。总体约束是个体约束的“AND”。也就是说,构建约束:

// +build linux darwin
// +build 386

对应于布尔公式:

(linux OR darwin) AND 386

在特定版本中,以下词语得到满足:

 - 目标操作系统,由runtime.GOOS拼写
- 目标体系结构,由runtime.GOARCH拼写
- 正在使用的编译器,“gc”或“gccgo”
- “cgo”,如果ctxt.CgoEnabled为true
- “go1.1”,从Go 1.1版开始
- “go1.2”,从Go 1.2版开始
- 从Go 1.3版开始,“go1.3”
- 从Go版本1.4开始的“go1.4”
- 从Go 1.5版开始的“go1.5”
- “go1.6”,从Go 1.6版开始
- 从Go版本1.7开始的“go1.7”
- 从Go版本1.8开始的“go1.8”
- 从Go版本1.9开始的“go1.9”
-  ctxt.BuildTags中列出的任何其他单词

如果在剥离扩展名和可能的 _test 后缀后文件的名称与下列任何一种模式匹配:

*_GOOS
*_GOARCH
*_GOOS_GOARCH

(例如:source_windows_amd64.go)其中 GOOS 和 GOARCH 分别代表任何已知的操作系统和体系结构值,则该文件被认为具有隐含的构建约束,要求这些项(除了文件中的任何显式约束)。

为了防止构建文件被考虑:

// +build ignore

(任何其他不满意的词也会起作用,但“ignore”是常规的。)

仅在使用 cgo 时构建文件,并且仅在 Linux 和 OS X 上构建文件:

// +build linux,cgo darwin,cgo

这样的文件通常与其他文件实现默认功能的其他文件配对,在这种情况下,该文件会带来约束:

// +build !linux,!darwin !cgo

命名文件 dns_windows.go 将导致它仅在为 Windows 构建软件包时才被包含;同样,只有在为32位x86构建软件包时才会包含 math_386.s。

除了 android 标签和文件,使用 GOOS=android 与GOOS = linux 匹配构建标签和文件。

Binary-Only(仅二进制) Packages

可以以二进制形式分发包,而不包括用于编译包的源代码。要做到这一点,软件包必须与源代码文件一起分发,而不是通过构建约束排除并包含“//go:binary-only-package ”注释。与构建约束一样,此注释必须出现在文件的顶部附近,仅以空行和其他行注释开头,并且在注释后面有空行,以便将其与包文档分开。与构建约束不同,此评论仅在非测试 Go 源文件中才能识别。

因此只有二进制包的最小源代码是:

//go:binary-only-package

package mypkg

源代码可能包含额外的 Go 代码。该代码从未编译过,但会被诸如 godoc 之类的工具处理,并可能作为最终用户文档很有用。

索引

  • Variables
  • func ArchChar(goarch string) (string, error)
  • func IsLocalImport(path string) bool
  • type Context
  • func (ctxt *Context) Import(path string, srcDir string, mode ImportMode) (*Package, error)
  • func (ctxt *Context) ImportDir(dir string, mode ImportMode) (*Package, error)
  • func (ctxt *Context) MatchFile(dir, name string) (match bool, err error)
  • func (ctxt *Context) SrcDirs() []string
  • type ImportMode
  • type MultiplePackageError
  • func (e *MultiplePackageError) Error() string
  • type NoGoError
  • func (e *NoGoError) Error() string
  • type Package
  • func Import(path, srcDir string, mode ImportMode) (*Package, error)
  • func ImportDir(dir string, mode ImportMode) (*Package, error)
  • func (p *Package) IsCommand() bool

包文件

build.go doc.go read.go syslist.go

变量

ToolDir 是包含构建工具的目录。

var ToolDir = filepath.Join(runtime.GOROOT(), "pkg/tool/"+runtime.GOOS+"_"+runtime.GOARCH)

func ArchChar(显示源代码)

func ArchChar(goarch string) (string, error)

ArchChar 返回“?” 和一个错误。在早期版本的 Go 中,返回的字符串用于派生编译器和链接器工具名称,缺省对象文件后缀和默认链接器输出名称。从 Go 1.5 开始,这些字符串不再因架构而异; 它们分别是compile,link,.o 和 a.out。

func IsLocalImport(显示源代码)

func IsLocalImport(path string) bool

IsLocalImport 报告导入路径是否为本地导入路径,如“。”,“..”,“./foo”或“../foo”。

type Context(显示源代码)

上下文指定了构建的支持上下文。

type Context struct {
        GOARCH      string // 目标架构
        GOOS        string // 目标操作系统
        GOROOT      string // Go root
        GOPATH      string // Go path
        CgoEnabled  bool   // 是否可以使用cgo
        UseAllFiles bool   // 使用文件而不管+build行,文件名
        Compiler    string // 编译器在计算目标路径时假设

        // 构建和发布标记指定构建约束
        // 在处理+build线时应该被认为是满意的。
        // 创建新上下文的客户端可以自定义BuildTags
        // 默认为空,但自定义ReleaseTags通常是错误的,
        // 默认为当前版本兼容的Go版本列表。
        // 除了BuildTags和ReleaseTags之外,还要构建约束
        // 将GOARCH和GOOS的值视为满意标记。
        BuildTags   []string
        ReleaseTags []string

        // 安装后缀指定要在安装名称中使用的后缀
        // 目录。 默认情况下它是空的,但需要保留自定义构建
        // 它们的输出分开可以设置InstallSuffix这样做。 例如,当
        // 使用竞争检测器,go命令使用InstallSuffix =“race”,所以
        // 在Linux/386系统上,软件包被写入一个名为的目录
        // “linux_386_race”而不是通常的“linux_386”。
        InstallSuffix string

        // JoinPath将路径片段序列连接到单个路径中。
        // 如果JoinPath为nil,则Import使用filepath.Join。
        JoinPath func(elem ...string) string

        // SplitPathList将路径列表拆分为单个路径的切片。
        // 如果SplitPathList为nil,则Import使用filepath.SplitList。
        SplitPathList func(list string) []string

        // IsAbsPath报告路径是否为绝对路径。
        // 如果IsAbsPath为nil,则Import使用filepath.IsAbs。
        IsAbsPath func(path string) bool

        // IsDir报告路径是否命名目录。
        // 如果IsDir为nil,则Import调用os.Stat并使用结果的IsDir方法。
        IsDir func(path string) bool

        // HasSubdir报告dir是否是词汇的子目录
        // root,也许是下面的多个级别。 它不试图检查
        // 是否存在目录。
        // 如果是这样,HasSubdir将rel设置为斜杠分隔的路径
        // 可以连接到root以生成相当于dir的路径。
        // 如果HasSubdir为nil,则Import使用构建的实现
        // filepath.EvalSymlinks。
        HasSubdir func(root, dir string) (rel string, ok bool)

        // ReadDir返回一个os.FileInfo片段,按名称排序,
        // 描述命名目录的内容。
        // 如果ReadDir为nil,则Import使用ioutil.ReadDir。
        ReadDir func(dir string) ([]os.FileInfo, error)

        // OpenFile打开一个文件(不是目录)进行读取。
        // 如果OpenFile为nil,则Import使用os.Open。
        OpenFile func(path string) (io.ReadCloser, error)
}

默认是构建的默认上下文。它使用 GOARCH,GOOS,GOROOT 和 GOPATH 环境变量(如果已设置),或者编译代码的 GOARCH,GOOS 和 GOROOT。

var Default Context = defaultContext()

func (*Context) Import(显示源代码)

func (ctxt *Context) Import(path string, srcDir string, mode ImportMode) (*Package, error)

导入返回有关由导入路径命名的Go包的详细信息,解释相对于 srcDir 目录的本地导入路径。如果路径是命名可以使用标准导入路径导入的包的本地导入路径,则返回的包会将 p.ImportPath 设置为该路径。

在包含该软件包的目录中,.go,.c,.h 和 .s 文件被视为软件包的一部分,但以下内容除外:

 - 包文档中的.go文件
- 以_或开头的文件。(可能是编辑临时文件)
- 具有上下文不满足的构建约束的文件

如果发生错误,Import 将返回一个非零错误和一个非零*Package 含部分信息的包。

func (*Context) ImportDir(显示源代码)

func (ctxt *Context) ImportDir(dir string, mode ImportMode) (*Package, error)

ImportDir 与 Import 类似,但处理指定目录中的 Go包。

func (*Context) MatchFile(显示源代码)

func (ctxt *Context) MatchFile(dir, name string) (match bool, err error)

MatchFile 报告给定目录中具有给定名称的文件是否与上下文相匹配,并且将包含在由该目录的 ImportDir 创建的包中。

MatchFile 考虑文件的名称,并可能使用 ctxt.OpenFile 来读取文件的部分或全部内容。

func (*Context) SrcDirs(显示源代码)

func (ctxt *Context) SrcDirs() []string

SrcDirs 返回一个包源代码根目录的列表。它从当前的 Go 和 Go 路径绘制,但省略了不存在的目录。

type ImportMode(显示源代码)

ImportMode 控制 Import 方法的行为。

type ImportMode uint
const (
        // 如果设置了FindOnly,则在找到目录后,Import将停止
        // 应该包含包的来源。 它没有
        // 读取目录中的任何文件。
        FindOnly ImportMode = 1 << iota

        // 如果设置了AllowBinary,则可以通过编译来满足Import
        // 没有相应来源的包对象。
        //
        // Deprecated(推荐使用):
        // 创建仅编译包的受支持方式是
        // 编写包含//go:binary-only-package注释的源代码
        // 文件的顶部。 这样的包装将被认可
        // 无论这个标志设置如何(因为它有源代码)
        // 并将在返回的包中将BinaryOnly设置为true。
        AllowBinary

        // 如果设置了ImportComment,则解析对包语句的导入注释。
        // 如果导入发现无法理解的注释,则返回错误
        // 或在多个源文件中查找冲突的注释。
        // 有关更多信息,请参阅golang.org/s/go14customimport。
        ImportComment

        // 默认情况下,Import搜索供应商目录
        // 在搜索之前应用于给定的源目录
        // GOROOT和GOPATH的根源。
        // 如果Import使用供应商查找并返回包
        // 目录,生成的ImportPath是完整路径
        // 到包,包括导致的路径元素
        // 包括“供应商”。
        // 例如,如果导入(“y”,“x/subdir”,0)找到
        // “x/vendor/y”,返回的包的ImportPath是“x/vendor/y”,
        // 不是简单的“y”。
        // 有关更多信息,请参阅golang.org/s/go15vendor。
        //
        // 设置IgnoreVendor会忽略供应商目录。
        //
        // 与包的ImportPath相反,
        // 返回的包的Imports,TestImports和XTestImports
        // 始终是源文件的确切导入路径:
        // 导入不会尝试解析或检查这些路径。
        IgnoreVendor
)

type MultiplePackageError(显示源代码)

MultiplePackageError 描述了包含多个包的多个可构建的 Go 源文件的目录。

type MultiplePackageError struct {
        Dir      string   // 包含文件的目录
        Packages []string // 找到包名
        Files    []string // 相应文件:Files [i]声明包Packages [i]
}

func (*MultiplePackageError) Error(显示源代码)

func (e *MultiplePackageError) Error() string

type NoGoError(显示源代码)

NoGoError 是 Import 用来描述不包含可构建的 Go 源文件的目录所使用的错误。(它可能仍然包含测试文件,被构建标签隐藏的文件等等。)

type NoGoError struct {
        Dir string
}

func (*NoGoError) Error(显示源代码)

func (e *NoGoError) Error() string

type Package(显示源代码)

软件包描述了在目录中找到的 Go 软件包。

type Package struct {
        Dir           string   // 包含包源的目录
        Name          string   // 包名称
        ImportComment string   // 导入路径注释包语句
        Doc           string   // 文档概要
        ImportPath    string   // 包的导入路径(“”如果未知)
        Root          string   // 这个包所在的Go树的根
        SrcRoot       string   // 包源根目录(“”如果未知)
        PkgRoot       string   // 包安装根目录(“”如果未知)
        PkgTargetRoot string   // 体系结构依赖安装根目录(“”如果未知)
        BinDir        string   // 命令安装目录(“”如果未知)
        Goroot        bool     // 在Go root中找到的包
        PkgObj        string   // 安装.a文件
        AllTags       []string // 可能影响此目录中文件选择的标记
        ConflictDir   string   // 这个目录在$ GOPATH中影子目录
        BinaryOnly    bool     // 无法从源重建(有//go:binary-only-package注释)

        // 源文件
        GoFiles        []string // .go源文件(不包括CgoFiles,TestGoFiles,XTestGoFiles)
        CgoFiles       []string // .go导入“C”的源文件
        IgnoredGoFiles []string // .go源文件被忽略为此版本
        InvalidGoFiles []string // .go源文件检测到问题(解析错误,包名错误等)
        CFiles         []string // .c源文件
        CXXFiles       []string // .cc,.cpp和.cxx源文件
        MFiles         []string // .m(Objective-C)源文件
        HFiles         []string // .h,.hh,.hpp和.hxx源文件
        FFiles         []string // .f,.F,.for和.f90 Fortran源文件
        SFiles         []string // .s源文件
        SwigFiles      []string // .swig文件
        SwigCXXFiles   []string // .swigcxx文件
        SysoFiles      []string // .syso系统对象文件添加到存档

        // Cgo 指令
        CgoCFLAGS    []string // Cgo CFLAGS 指令
        CgoCPPFLAGS  []string // Cgo CPPFLAGS 指令
        CgoCXXFLAGS  []string // Cgo CXXFLAGS 指令
        CgoFFLAGS    []string // Cgo FFLAGS 指令
        CgoLDFLAGS   []string // Cgo LDFLAGS 指令
        CgoPkgConfig []string // Cgo pkg-config 指令

        // 依赖性信息
        Imports   []string                    // 从GoFiles,CgoFiles导入路径
        ImportPos map[string][]token.Position // Imports的行信息

        // Test information
        TestGoFiles    []string                    // 包中的_test.go文件
        TestImports    []string                    // 从TestGoFiles导入路径
        TestImportPos  map[string][]token.Position // TestImports的行信息
        XTestGoFiles   []string                    // 包外的_test.go文件
        XTestImports   []string                    // 从XTestGoFiles导入路径
        XTestImportPos map[string][]token.Position // XTestImports的行信息
}

func Import(显示源代码)

func Import(path, srcDir string, mode ImportMode) (*Package, error)

Import 是 Default.Import 的简写。

func ImportDir(显示源代码)

func ImportDir(dir string, mode ImportMode) (*Package, error)

ImportDir 是 Default.ImportDir 的简写。

func (*Package) IsCommand(显示源代码)

func (p *Package) IsCommand() bool

IsCommand 报告包是否被视为要安装的命令(不仅仅是库)。名为“main”的软件包被视为命令。

Go

Go 是一种编译型语言,它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性。它也打算成为现代的,支持网络与多核计算的语言。要满足这些目标,需要解决一些语言上的问题:一个富有表达能力但轻量级的类型系统,并发与垃圾回收机制,严格的依赖规范等等。这些无法通过库或工具解决好,因此Go也就应运而生了。

主页 https://golang.org/
源码 https://go.googlesource.com/go
发布版本 1.9.2

Go目录

1.档案 | archive
2.缓冲区 | bufio
3.内置 | builtin
4.字节 | bytes
5.压缩 | compress
6.容器 | container
7.上下文 | context
8.加密 | crypto
9.数据库 | database
10.调试 | debug
11.编码 | encoding
12.错误 | errors
13. expvar
14.flag
15. fmt
16. go
17.散列 | hash
18.html
19.图像 | image
20.索引 | index
21.io
22.日志 | log
23.数学 | math
24. math/big
25.math/bits
26.math/cmplx
27.math/rand
28.拟态 | mime
29.net
30.net/http
31. net/mail
32. net/rpc
33.net/smtp
34. net/textproto
35. net/url
36.os
37.路径 | path
38.插件 | plugin
39.反射 | reflect
40.正则表达式 | regexp
41.运行时 | runtime
42.排序算法 | sort
43.转换 | strconv
44.字符串 | strings
45.同步 | sync
46.系统调用 | syscall
47.测试 | testing
48.文本 | text
49.时间戳 | time
50.unicode
51.不安全性 | unsafe
52.Go 语言数据类型
53.Go 语言基础语法
54.Go 语言结构
55.Go 语言 select 语句
56.Go 语言 switch 语句
57.Go 语言 if 语句嵌套
58.Go 语言 if…else 语句
59.Go 语言 if 语句
60.Go 语言运算符
61.Go 语言常量
62.Go 语言函数闭包
63.Go 语言函数作为实参
64.Go 语言函数引用传递值
65.Go 语言函数值传递值
66.Go 语言函数
67.Go 语言 goto 语句
68.Go 语言 continue 语句
69.Go 语言 break 语句
70.Go 语言循环嵌套
71.Go 语言 for 循环
72.Go 语言结构体
73.Go 语言指针作为函数参数
74.Go 语言指向指针的指针
75.Go 语言指针数组
76.Go 语言指针
77.Go 语言向函数传递数组
78.Go 语言多维数组
79.Go 语言变量作用域
80.Go 语言函数方法
81.Go 错误处理
82.Go 语言接口
83.Go 语言类型转换
84.Go 语言递归函数
85.Go 语言Map(集合)
86.Go 语言范围(Range)
87.Go 语言切片(Slice)
88.Go 并发
89.Go fmt.Sprintf 格式化字符串