GOROOT: Go 语言安装根目录的路径,也就是 GO 语言的安装路径。
GOPATH: 若干工作区目录的路径。是我们自己定义的工作空间。在 Go Module 模式之前非常重要,现在基本上用来存放使用 go get 命令获取的项目。
GOBIN: Go 编译生成的程序的安装目录,比如通过 go install 命令,会把生成的 Go 程序放到该目录下,即可在终端使用。

1. GOROOT 安装目录说明

GOROOT 的值是 Go 安装目录。安装目录如下所示:

wohu@wohu:/usr/local/go$ ls
api      bin              CONTRIBUTORS  favicon.ico  LICENSE  PATENTS  README.md   src   VERSION
AUTHORS  CONTRIBUTING.md  doc           lib          misc     pkg      robots.txt  test
wohu@wohu:/usr/local/go$
目录 说明
api 用于存放依照 Go 版本顺序的 API 增量列表文件。这里所说的 API 包含公开的变量,常量,函数等
bin 用于存放主要的标准命令文件,包括 go,godoc 和gofmt
doc 用于存放标准库的 HTML 格式的程序文档。我们可以通过 godoc 命令启动一个 Web 程序展现这些文档
lib 用于存放一些特殊的库文件
misc 用于存放一些辅助类的说明和工具
pkg 用于存放安装 Go 标准库的所有归档文件
src 用于存放 Go 本身,Go 标准工具以及标准库的所有源码文件
test 存放用来测试和验证Go本身的所有相关文件
  • pkg 目录:
wohu@wohu:/usr/local/go$ ls pkg/
include  linux_amd64  linux_amd64_race  tool

你会发现其中有名称为 linux_amd64 的文件夹,我们称为平台相关目录。这类文件夹的名称由对应的操作系统和计算架构的名称组合而成。

通过 go install 命令,Go 程序(这里是标准库中的程序)会被编译成平台相关的归档文件存放到其中。另外,pkg/tool/linux_amd64 文件夹存放了使用 Go 制作软件时用到的很多强大的命令和工具。

wohu@wohu:/usr/local/go$ ls pkg/linux_amd64
archive    context.a  encoding    fmt.a   html.a    io     math.a  os        reflect.a  sort.a     syscall.a  unicode
bufio.a    crypto     encoding.a  go      image     io.a   mime    os.a      regexp     strconv.a  testing    unicode.a
bytes.a    crypto.a   errors.a    hash    image.a   log    mime.a  path      regexp.a   strings.a  testing.a
compress   database   expvar.a    hash.a  index     log.a  net     path.a    runtime    sync       text
container  debug      flag.a      html    internal  math   net.a   plugin.a  runtime.a  sync.a     time.a
wohu@wohu:/usr/local/go$

2. GOPATH 工作区间说明

GOPATH 为自己项目的工作区间, 笔记学习(1)中我们已经进行了设置。通过 go env 可以看到 Go 的全部环境变量。

wohu@wohu:~/gocode$ go env
GOARCH="amd64"
GOBIN="/home/wohu/gocode/bin"
GOCACHE="/home/wohu/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/wohu/gocode"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build076028171=/tmp/go-build -gno-record-gcc-switches"

GOPATH 是作为编译后二进制的存放目的地和 import 包时的搜索路径 (其实也是你的工作目录,可以在 src 下创建你自己的 Go 源文件, 然后开始工作),一般情况下,Go 源码文件必须放在工作区中。

GOPATH 之下主要包含三个目录: bin、pkgsrc

wohu@wohu:~/gocode$ echo $GOPATH
/home/wohu/gocode
wohu@wohu:~/gocode$ ls
bin  pkg  src
wohu@wohu:~/gocode$

我们需要将工作区的目录路径添加到环境变量 GOPATH 中。否则,即使处于同一工作区(事实上,未被加入 GOPATH 中的目录不用管成为工作区),代码之间也无法通过绝对代码包路径调用。

在实际开发环境中,工作区可以只有一个,也可以由多个,这些工作区的目录路径都需要添加到 GOPATH 中。与 GOROOT 一样,我们应确保 GOPATH 一直有效。

GOPATH="/home/wohu/gocode"

在很多与 Go 语言相关的书籍、文章中描述的 GOPATH 都是通过修改系统全局的环境变量来实现的。然而,这种设置全局 GOPATH 的方法可能会导致当前项目错误引用了其他目录的 Go 源码文件从而造成编译输出错误的版本或编译报出一些无法理解的错误提示。

比如说,将某项目代码保存在 /home/davy/projectA 目录下,将该目录设置为 GOPATH 。随着开发进行,需要再次获取一份工程项目的源码,此时源码保存在 /home/davy/projectB 目录下,如果此时需要编译 projectB 目录的项目,但开发者忘记设置 GOPATH 而直接使用命令行编译,则当前的 GOPATH 指向的是 /home/davy/projectA 目录,而不是开发者编译时期望的 projectB 目录。编译完成后,开发者就会将错误的工程版本发布到外网。

因此,建议大家无论是使用命令行或者使用集成开发环境编译 Go 源码时, 不要设置全局的 GOPATH ,而是随项目设置 GOPATH

GOPATH 意义:
你可以把 GOPATH 简单理解成 Go 语言的工作目录,它的值是一个目录的路径,也可以是多个目录路径,每个目录都代表 Go 语言的一个工作区(workspace)。

我们需要利于这些工作区,去放置 Go 语言的源码文件(source file),以及安装(install)后的归档文件(archive file,也就是以 .a 为扩展名的文件)和可执行文件(executable file)。

归档文件在 Linux 下就是扩展名是 .a 的文件,也就是 archive 文件。写过 C 程序的朋友都知道,这是程序编译后生成的静态库文件。

Go 语言在多个工作区中查找依赖包的时候是以怎样的顺序进行的?
答案:先 GOROOT 然后再 GOPATH

wohu@ubuntu-dev:~/project/go/src/github.com$ go install github.com/ramya-rao-a/go-outline
can't load package: package github.com/ramya-rao-a/go-outline: cannot find package "github.com/ramya-rao-a/go-outline" in any of:/usr/local/go/src/github.com/ramya-rao-a/go-outline (from $GOROOT)/home/wohu/project/go/src/github.com/ramya-rao-a/go-outline (from $GOPATH)

如果在多个工作区中都存在导入路径相同的代码包会产生冲突吗?
答案是:不会冲突。因为 Go 语言在寻找代码包时是有顺序的。对于 GOPATH 中的工作区来说,它会按照你设置的顺序进行查找。所以它会找到并使用较靠前的那个工作区中的同路径项目。

2.1 src 目录

  • src 目录:主要存放 Go 的源码文件

用于以代码包的形式组织并保存 Go 源码文件,这里的代码包与 src 下子目录一一对应。例如,若一个源码文件被声明属于代码包 log,那么它就应当保存在 “src/log” 目录中。当然,你也可以把 Go 源码文件直接放在 src 目录下,但这样的 Go 源码文件就只能被声明属于 main代码包了

除非用于临时测试或演示,一般还是建议把 Go 源码文件存入特定的代码包中。

2.2 pkg 目录

  • pkg 目录:存放编译好的库文件, 主要是 .a 文件

用于存放通过 go install 命令安装后的代码包的归档文件。前提是代码包中必需包含 Go 库源码文件。归档文件是指那些名称以 .a 结尾的文件。

该目录与 GOROOT 目录下的 pkg 目录功能类似。区别在于,工作区中的 pkg 目录专门用来存放用户代码的归档文件

编译和安装用户代码的过程一般会以代码包为单位进行。比如 log 包被编译安装后,将生成一个名为 log.a 的归档文件,并存放在当前工作区的 pkg 目录下的平台相关目录中。

.a 文件属于静态链接库文件,是某一个代码包中的程序。Go 语言的链接器可以把相关的静态库链接在一起,从而生成最终的可执行文件。 在 Go 语言对可执行程序进行安装的时候,会把相关的静态链接库与之打包在一起。所以生成的可执行文件才可以独立运行的,这也是很明显的优势。

2.3 bin 目录

  • bin 目录:主要存放可执行文件

与 pkg 目录类似,在通过 go install 命令完成安装后,保存由 Go 命令源码文件生成的可执行文件。在类 Unix 操作系统下,这个可执行文件一般来说名称与源码文件的主文件名相同。

而在 windows 操作系统下,这个可执行文件的名称则是源码文件主文件名加 “.exe” 后缀。

需要把 GOPATH 中的可执行目录 bin 也配置到环境变量中,否则自行下载的第三方 go 工具就无法使用了。

GOBIN="/home/wohu/gocode/bin"

注意:GOPATH 中不要包含 Go 语言的安装目录,以便将 Go 语言本身的工作区同用户工作区严格分开。通过 Go 工具中的代码获取命令 go get ,可以指定项目的代码下载到我们在 GOPATH 中设定的第一个工作区中,并在其中完成编译和安装。

三个目录下的文件如下所示:

wohu@wohu:~/gocode$ ls bin/
dlv  gocode  godef  golint  go-outline  gopkgs  goplay  gorename  goreturns  go-symbols  guru  impl
wohu@wohu:~/gocode$ ls pkg/
linux_amd64  mod
wohu@wohu:~/gocode$ ls src/
github.com  golang.org  hello  hello.go
  1. Go 语言源码的组织方式

一个代码包中可以包含任意个以 .go 为扩展名的源码文件,这些源码文件都需要被声明属于同一个代码包。

Go 语言源码的组织方式就是以环境变量 GOPATH、工作区、src 目录和代码包为主线的。一般情况下,Go 语言的源码文件都需要被存放在环境变量 GOPATH 包含的某个工作区(目录)中的 src 目录下的某个代码包(目录)中。

  1. 了解源码安装后的结果

源码文件通常会被放在某个工作区的 src 子目录下。那么在安装后如果产生了归档文件(以 .a 为扩展名的文件),就会放进该工作区的 pkg 子目录;如果产生了可执行文件,就可能会放进该工作区的 bin 子目录。

  1. 理解构建和安装 Go 程序的过程

构建使用命令 go build,安装使用命令 go install 。构建和安装代码包的时候都会执行编译、打包等操作,并且,这些操作生成的任何文件都会先被保存到某个临时的目录中。

如果构建的是库源码文件,那么操作后产生的结果文件只会存在于临时目录中。这里的构建的主要意义在于检查和验证。

如果构建的是命令源码文件,那么操作的结果文件会被搬运到源码文件所在的目录中。

安装操作会先执行构建,然后还会进行链接操作,并且把结果文件搬运到指定目录。进一步说,

  • 如果安装的是库源码文件,那么结果文件会被搬运到它所在工作区的 pkg 目录下的某个子目录中。
  • 如果安装的是命令源码文件,那么结果文件会被搬运到它所在工作区的 bin 目录中,或者环境变量 GOBIN 指向的目录中。

3. 源码文件

Go 源码文件有分 3 种,即命令源码文件,库源码文件和测试源码文件。不管是命令源文件还是库源文件,在同一个目录下的所有源文件,其所属包的名称必须一致的。

构建 = 编译 + 链接

  1. 编译和链接是两个步骤。
  2. 一个代码包在被安装(编译、链接并生成相应文件)完成之后,相应的静态链接库文件就会被 go 工具放到 pkg 目录里。
  3. 在编译的时候,如果 pkg 目录里已经有了依赖代码包的静态链接库文件,那么在默认情况下 go 工具就不会再编译一遍了。
  4. 在链接的时候,如果依赖包的静态链接库文件已经存在于 pkg 目录中了,那么 go 工具就会直接使用。这个链接的过程实际上就是把主包和依赖包链接在一起。

之所以 Go 程序这么方便,一部分原因就是它的工具对静态链接库的管理。

3.1 命令源码文件

声明为属于 main 代码包,并且包含无参数声明和结果声明的 main 函数的源码文件。这类源码是程序的入口,可以独立运行(使用 go run 命令),也可以被 go buildgo install 命令转换为可执行文件。

同一个代码包中的所有源码文件,其所属代码包的名称必须一致。如果命令源码文件和库源码文件处于同一代码包中,该包就无法正确执行 go buildgo install 命令。换句话说,这些源码文件也就无法被编译和安装。因此,命令源码文件通常会单独放在一个代码包中。一般情况下,一个程序模块或软件的启动入口只有一个。

同一个代码包中可以有多个命令源码文件,可通过 go run 命令分别运行它们。但通过 go buildgo install 命令无法编译和安装该代码包。所以一般情况下,不建议把多个命令源码文件放在同一个代码包中。

当代码包中有且仅有一个命令源码文件时,在文件所在目录中执行 go build 命令,即可在该目录下生成一个与目录同名的可执行文件;若使用 go install 命令,则可在当前工作区的 bin 目录下生成相应的可执行文件。

总结:如果一个 Go 源文件被声明属于 main 包,并且该文件中包含 main 函数,则它就是命令源码文件。命令源文件属于程序的入口,可以通过 Go 语言的go run命令运行或者通过go build命令生成可执行文件。

3.2 库源码文件

库源文件则是指存在于某个包中的普通源文件,并且库源文件中不包含 **main** 函数。库源码文件声明的包名会与它实际所属的代码包(目录)名一致,且库源码文件中不包含无参数声明和无结果声明的 main 函数

如在 basic/set 目录下执行 go install 命令,成功地安装了 basic/set 包,并生成一个名为 set.a 的归档文件。归档文件的存放目录由以下规则产生:

  • 安装库源码文件时所生成的归档文件会被存放到当前工作区的 pkg 目录中。
  • 根据被编译的目标计算机架构,归档文件会被放置在 pkg 目录下的平台相关目录中。如上的 set.a 在 64 位 window 系统上就是 pkg/windows_amd64 目录中。
  • 存放归档文件的目录的相对路径与被安装的代码包的上一级代码包的相对路径是一致的。

第一个相对路径就是相对于工作区的 pkg 目录下的平台相关目录而言的,而第二个相对路径是相对于工作区的 src 目录而言的。如果被安装的代码包没有上一级代码包(也就是说它的父目录就是工作的 src 目录),那么它的归档文件就会被直接存放到当前工作区的 pkg 目录的平台相关目录下。如 basic 包的归档文件 basic.a 总会被直接存放到 pkg/windows_amd64 目录下,而 basic/set 包的归档文件 set.a 则会被存放到 pkg/windows_amd64/basic 目录下。

3.3 测试源码文件

这是一种特殊的库文件,可以通过执行 go test 命令运行当前代码包下的所有测试源码文件。成为测试源码文件的充分条件有两个:

  • 文件名需要以 ”_test.go” 结尾
  • 文件中需要至少包含该一个名称为 Test 开头或 Benchmark 开头,拥有一个类型为 *testing.T 或 testing.B 的参数的函数。类型 testing.T 或 testing.B 是两个结构体类型。

当在某个代码包中执行 go test 命令,该代码包中的所有测试源码文件就会被找到并运行。

注意:存储 Go 代码的文本文件需要以 UTF-8 编码存储。如果源码文件中出现了非 UTF-8 编码的字符,则在运行、编译或安装时,Go 会抛出 “illegal UTF-8 sequence” 的错误。

代码示例 :

wohu@wohu:~/GoCode/src$ tree -L  3
.
├── download
│   └── download_demo.go
├── main.go
└── upload└── upload_demo.go

download_demo.go 代码内容:

package downloadimport "fmt"
// Download_imge 方法名首字母大写,表示外部可以调用
func Download_imge() {fmt.Println("This is download image demo")
}

upload_demo.go 代码内容:

package uploadimport "fmt"
// Upload_imge 方法名首字母大写,表示外部可以调用
func Upload_imge() {fmt.Println("This is upload image demo")
}

main.go 代码内容:

package mainimport ("download""upload"
)func main() {upload.Upload_imge()download.Download_imge()
}

分别执行 go rungo buildgo install 命令, 可以看到能有正常的输出、会生成二进制文件 main,并且在 bin 目录下有对应的二进制文件。

wohu@wohu:~/GoCode/src$ go run main.go
This is upload image demo
This is download image demo
wohu@wohu:~/GoCode/src$ ls
download    main.go    upload
wohu@wohu:~/GoCode/src$ go build main.go
wohu@wohu:~/GoCode/src$ ls
download   main  main.go   upload
wohu@wohu:~/GoCode/src$ ./main
This is upload image demo
This is download image demo
wohu@wohu:~/GoCode/src$ go install main.go
wohu@wohu:~/GoCode/src$ ls ../bin/main
wohu@wohu:~/GoCode/src$ ls ../pkg/
wohu@wohu:~/GoCode/src$

4. 标准命令简述

Go 本身包含来大量用于处理 Go 程序的命令和工具。

4.1 常用命令

  • build

用于编译指定的代码包或 Go 语言源码文件。命令源码文件会被编译成可执行文件,并存放到命令执行的目录或指定目录下。而库源码文件被编译后,则不会在非临时目录中留下任何文件。

  • clean

用于清除因执行其他 go 命令而遗留下来的临时目录和文件。

  • doc

用于显示打印 Go 语言代码包以及程序实体的文档。

  • env

用于打印 Go 语言相关的环境信息。

  • fix

用于修正指定代码的源码文件中包含的过时语法和代码调用。这使得我们在升级 Go 语言版本时,可以非常方便地同步升级程序。

  • fmt

用于格式化指定代码包中的 Go 源码文件。实际上,它是通过执行 gofmt 命令来实现功能的。

  • generate

用于识别指定代码中资源文件中的 “go:generate” 注释,并执行其携带的任意命令。该命令独立于 Go 语言标准的编译和安装体系。如果你有需要解析的 “go:generate” 注释,就单独运行它。这个命令非常有用,我常用它自动生成或改动 Go 源码文件。

  • get

用于下载,编译并安装指定改动代码包及其依赖包。从我们自己的代码中转站或第三方代码库上自动拉取代码,就全靠它了。

  • install

用于编译并安装指定的代码包及其依赖包。安装命令源码文件后,代码包所在的工作区目录的 bin 子目录,或者当前环境变量 GOBIN 指向的目录中会生成相应的可执行文件。安装源码文件后,会在代码包所在的工作目录的 pkg 子目录中生成相应的归档文件。

  • list

用于显示指定代码包的信息,它可谓是代码包分析的一大便利工具。利用 Go 语言标准代码库代码包 “text/template” 中规定的模版语法,你可以非常灵活的控制输出信息。

  • run

用于编译并运行指定的代码源码文件。当你想不生成可执行文件而直接运行命令源码文件时,就需要用到它。

  • test

用于测试指定的代码包,前提是该代码包目录中必须存在测试源代码文件。

  • tool

用于运行 Go 语言的特殊工具。

  • vet

如果开发人员已经写了一些代码,vet 命令会帮开发人员检测代码的常见错误。让我们看看 vet 捕获哪些类型的错误。

  • Printf类函数调用时,类型匹配错误的参数。
  • 定义常用的方法时,方法签名的错误。
  • 错误的结构标签。
  • 没有指定字段名的结构字面量。

用于检查指定代码包中的 Go 语言代码,并报告发现可疑代码问题。该命令提供了除编译之外的又一个程序检查方法,可用于找到程序中的潜在错误。

go vet main.go
  • version

用于显示当前安装的 Go 语言的版本信息以及计算环境。

4.2 附加参数

执行上述命令时,可以通过附加一些额外的标记来定制命令的执行过程。下面是一个比较通用的标记。

  • -n

使命令仅打印其执行过程中用到的所有命令,而不真正执行它们。如果只想查看或验证命令的执行过程,而不想改变任何东西,使用它正合适。

  • -race

用于检测并报告指定 Go 语言程序中存在的数据竞争问题。当用 Go 语言编写并发程序时,这是很重要的检测手段之一。

  • -v

用于打印命令执行过程中涉及的代码包。这一定包括我们指定的目标代码包,并且有时还会包括该代码包直接或间接依赖的那些代码包。这会让你知道哪些代码包被命令处理过了。

  • -work

用于打印命令执行时生成和使用的临时工作目录的名字,且命令执行完成后不删除它。这个目录下的文件可能会对你有用,也可以从侧面了解命令的执行过程。如果不添加此标记,那么临时工作目录会在命令执行完毕前删除。

  • -x:

使命令打印其执行过程中用到的所有命令,同时执行它们。

我们可以把这些标记看作命令的特殊参数,他们都可以添加到命令名称和命令的真正参数中间。用于编译, 安装,运行和测试 Go 语言代码包或源码文件的命令都支持它们。上面提到了 tool 这个子命令,它用来运行一些特殊的 Go 语言工具。直接执行 go tool 命令,可以看到这些特殊工具。它们有的是其他 Go 标准命令的底层支持,有的规则是可以独当一面的利器。其中有两个工具值得特别介绍一下。

  • pprof

用于以交互的方式访问一些性能概要文件。命令将会分析给定的概要文件,并根据要求提供高可读性的输出信息。这个工具可以分析的概要文件包括 CPU 概要文件,内存概要文件和程序阻塞概要文件。这些包含 Go 程序运行信息的概要文件,可以通过标准库代码 runtime 和runtime/pprof 中的程序来生成。

  • trace

用于读取 Go 程序踪迹文件,并以图形化的方式展现出来。它能够让我们深入了解 Go 程序在运行过程中的内部情况。比如,当前进程中堆的大小及使用情况。又比如,程序中的多个 goruntime 是怎样调度的,以及它们在某个时刻被调度的原因。Go 程序踪迹文件可以通过标准代码包 “runtime/trace” 和 “net/http/pprof” 中的程序来生成。

上述的两个特殊的工具对 Go 程序调优非常有用。如果想探究程序运行的过程,或者想让程序跑的更快,更稳定,那么这两个工具是必知必会的。另外,这两个工具都受到 go test 命令的直接支持。因此你可以很方便地把它们融入到程序测试当中。

Go 学习笔记(2)— 安装目录、工作区、源码文件和标准命令相关推荐

  1. linux sipp 呼叫转移_SIPp 学习笔记 一 (安装)

    SIPp学习笔记一(安装) SIPp可以用来测试各种sip的设备,如终端电话或者proxy,包括功能和性能上的(性能上只能在linux平台下才可以;)具体的描述可以去参照SIPp的官方网站; http ...

  2. OracleDesigner学习笔记1――安装篇

    OracleDesigner学习笔记1――安装篇   QQ:King MSN:qiutianwh@msn.com Email:qqking@gmail.com 一.       前言 Oracle是当 ...

  3. Ui学习笔记---EasyUI的EasyLoader组件源码分析

    Ui学习笔记---EasyUI的EasyLoader组件源码分析 技术qq交流群:JavaDream:251572072   1.问题1:为什么只使用了dialog却加载了那么多的js   http: ...

  4. mesos 学习笔记-- mesos安装和配置

    2019独角兽企业重金招聘Python工程师标准>>> mesos 学习笔记-- mesos安装和配置 博客分类: 架构 mesos 参考资料: 官方文档:http://mesos. ...

  5. Joomla 学习笔记-----Joomla 安装

    Joomla 学习笔记-----Joomla 安装 1.Joomla安装 自己建的web服务器地址:10.170.89.116 下载Joomla 3.2  并解压 解压后的目录: 使用FileZill ...

  6. ZED相机学习笔记1——安装与配置(Win10 + Python)

    系列文章目录 ZED相机学习笔记1--安装与配置(Win10 + Python) 文章目录 系列文章目录 前言 一.ZED2 相机 二.配置ZED相机环境 1.安装CUDA 2.安装ZED-SDK 3 ...

  7. Qt学习笔记,再次分析EVA源码之后得出的结论-QListView,QListViewItem(Qt3);Q3ListView,Q3ListViewItem(Qt4)...

    Qt学习笔记,再次分析EVA源码之后得出的结论-QListView,QListViewItem(Qt3);Q3ListView,Q3ListViewItem(Qt4) 今天再次分析了Eva的源码,也看 ...

  8. homeassistant mysql_HomeAssistant学习笔记docker安装的ha更换数据库

    HomeAssistant学习笔记docker安装的ha更换数据库 用了一段时间之后发现日志和历史打开的速度越来越慢,在论坛里查了半天发现是因为HA官方所用数据库导致,官方也给出了相关文档,https ...

  9. Netty网络框架学习笔记-16(心跳(heartbeat)服务源码分析)

    Netty网络框架学习笔记-16(心跳(heartbeat)服务源码分析_2020.06.25) 前言: Netty 作为一个网络框架,提供了诸多功能,比如编码解码等,Netty 还提供了非常重要的一 ...

最新文章

  1. pandas 读取sqlserver_13个Pandas实用技巧,请收好
  2. 如何让签到成为提升用户活跃度的利器
  3. android 如何动态设置margin,Android 动态设置margin
  4. django 性能优化_优化Django管理员
  5. 开源巨头 SUSE 收购 Rancher Labs,云原生时代来临
  6. virtualbox 该内存不能为written_系统提示“该内存不能为read”的原因和解决办法...
  7. [有限元]虚位移原理和虚力原理的证明的统一逻辑
  8. Liferay7 BPM门户开发之46: 集成Activiti用户、用户组、成员关系同步
  9. i9 9900k mysql_i9-9900K性能如何 CPU天梯图秒懂i9-9900K性能排行
  10. linux下的/dev/shm/ 以及与swap目录的区别
  11. router走差分_route
  12. OpenCV笔记_20(1)基于dlib进行人脸识别( 图片检测 )
  13. H264系列(10):GOP之M和N值介绍
  14. 小觅摄像头 VINS-MONO安装
  15. 自己怎么开发一个软件app、如何开发一个app系统软件?
  16. Java Web中乱码问题
  17. 京东登陆界面(静态)
  18. python读取HTML文本文件
  19. 批量添加用户脚本--Linux bash
  20. linux 设置默认播放设备,Ubuntu MATE 19.10采用GNOME MPV(Celluloid)做为默认媒体播放器...

热门文章

  1. 2022-2028年中国塑料绳的制造行业市场现状调查及投资商机预测报告
  2. python内置库之学习configparser库(一)
  3. 【Springboot】日志
  4. 《将要淘汰的八种人》读后感
  5. tf.placeholder函数说明
  6. https://blog.csdn.net/blmoistawinde/article/details/84329103
  7. 视频处理单元Video Processing Unit
  8. CUDA Pro:通过向量化内存访问提高性能
  9. Visual SLAM
  10. 2021年大数据Flink(二十五):Flink 状态管理