GO语言学习笔记1——总览

GO语言做网络并发服务确实有自己的优点,毕竟网络IO的速率是远远小于CPU的速率,GO这种自带协程的语言方便我们编写出高并发的程序,绝不让CPU闲着,为用户提供高并发的服务。。。

而且GO作为现代语言,提供的包和内置函数使用起来都十分方便,值得一学。

这段时间学习GO语言,把笔记整理了一下,持续更新…

GO介绍

优势:

  • 垃圾回收,只需要new分配内存,不需要释放。
  • 原生并发,语言支持协程,使用简单,用户级线程轻量级,成千上万goroutine成为可能
  • channel
    • 管道,类似unix/linux的pipe
    • 多个goroutine通过channel进行通信
    • 支持任何类型

安装

  • 安装go(golang.org)

  • 安装vs code

    • 安装相关插件
  • goland

    • 够懒得,不用再装插件了
  • 查看环境变量:

    • 1
      go env
  • 修改环境变量

    • 到系统环境变量找到GOPATH修改

规则

  • 变量访问权限
    • 在一个包(package)可以相互访问
    • 在包外访问包里的变量要首字母大写才可以
  • 好习惯
    • 不同功能的代码划分到不同包里
      • 数据库操作的代价一个包
      • 网络的代码一个包…
      • 使代码结构更清晰

工具

  • gofmt
    • gofmt -w hello.go

语法

  • 变量定义
    • 类型在后
    • 前要跟var
    • 定义加初始化
      • :=
  • for循环
    • 没有小括号
    • for i:=0; i<100; i++{

  • 和python相似,把相同功能的代码放到一个目录,称之为包
  • 包可以被其他包引用
  • main包是用来生成可执行文件,每个程序只有一个main包
  • 包的主要用途是提高代码的可重复性
  • 正确的代码规划方式:
  • package_example
    • calc(package calc)
      • sum.go
      • sub.go
    • main(import package_example/calc)
      • main.go
    • 以这样方式规划目录,编译只需要执行go build -o main package_example/main 即可
      • 不指定-o名称和路径,默认是生成在当前目录下为main

编译

  • 编译时要包含所有用到的文件
    • 比如package main 包里含有 hello.go和world.go
    • 编译时go build hello.go world.go
  • 按GOPATH规则进行编译
    • 在GOPATH目录下的src,里有go_dev/example文件
    • go build go_dev/example
    • GO会自动到GOPATH目录下的src去找相关目录,并编译example中所有go文件进行build
      • 生成可执行文件会存在当前目录

管道

  • 创建管道

    • pipe := make(chan int,3)
  • 向管道中放数据

    • pipe <- 1
  • 管道取数据

    • 1
      2
      var t1 int
      t1 =<- pipe
  • 死锁

    • 往容量为3的管道放4的数据,默认行为是产生死锁错误

      • 编译时报错

go语言静态库的编译和使用

本文主要介绍go语言静态库的编译和使用方法,以windows平台为例,linux平台步骤一样,具体环境如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>echo %GOPATH%
E:\share\git\go_practice\
>echo %GOROOT%
C:\Go\
>tree /F %GOPATH%\src
卷 work 的文件夹 PATH 列表
卷序列号为 0009-D8C8
E:\SHARE\GIT\GO_PRACTICE\SRC
│ main.go
└─demo
demo.go

在%GOPATH%\src目录,有demo包和使用demo包的应用程序main.go,main.go代码如下:

1
2
3
4
5
6
7
package main
import "demo"
func main() {
demo.Demo()
}

demo包中的demo.go代码如下:

1
2
3
4
5
6
7
package demo
import "fmt"
func Demo() {
fmt.Println("call demo ...")
}

由于demo.go是%GOPATH%\src目录下的一个包,main.go在import该包后,可以直接使用,运行main.go:

1
2
>go run main.go
call demo ...

现在,需要将demo.go编译成静态库demo.a,不提供demo.go的源代码,让main.go也能正常编译运行,详细步骤如下:

1 编译静态库demo.a

1
>go install demo

在命令行运行go install demo命令,会在%GOPATH%目录下生相应的静态库文件demo.a(windows平台一般在%GOPATH%\src\pkg\windows_amd64目录)。

2 编译main.go

进入main.go所在目录,编译main.go:

1
>go tool compile -I E:\share\git\go_practice\pkg\windows_amd64 main.go

-I选项指定了demo包的安装路径,供main.go导入使用,即E:\share\git\go_practice\pkg\win dows_amd64目录,编译成功后会生成相应的目标文件main.o。

3 链接main.o

1
>go tool link -o main.exe -L E:\share\git\go_practice\pkg\windows_amd64 main.o

-L选项指定了静态库demo.a的路径,即E:\share\git\go_practice\pkg\win dows_amd64目录,链接成功后会生成相应的可执行文件main.exe。

4 运行main.exe

1
2
>main.exe
call demo ...

现在,就算把demo目录删除,再次编译链接main.go,也能正确生成main.exe:

1
2
3
4
5
6
>go tool compile -I E:\share\git\go_practice\pkg\windows_amd64 main.go
>go tool link -o main.exe -L E:\share\git\go_practice\pkg\windows_amd64 main.o
>main.exe
call demo ...

但是,如果删除了静态库demo.a,就不能编译main.go,如下:

1
2
>go tool compile -I E:\share\git\go_practice\pkg\windows_amd64 main.go
main.go:3: can't find import: "demo"

以上就是go语言静态库的编译和使用方法,下次介绍动态库的编译和使用方法。

编译

go run:go run 编译并直接运行程序,它会产生一个临时文件(但不会生成 .exe 文件),直接在命令行输出程序执行结果,方便用户调试。

go build:go build 用于测试编译包,主要检查是否会有编译错误,如果是一个可执行文件的源码(即是 main 包),就会直接生成一个可执行文件。

go install:go install 的作用有两步:第一步是编译导入的包文件,所有导入的包文件编译完才会编译主程序;第二步是将编译后生成的可执行文件放到 bin 目录下(\$GOPATH/bin),编译后的包文件放到 pkg 目录下(\$GOPATH/pkg)。

  • 编译时如果包里没有 main 函数默认编译成一个lib库
  • 有main函数编译成一个可执行程序
  • go在$GOPATH/src下的一个文件夹加就可以作为一个包,或者说它默认到GOPATH/src去找有没有这个包,里面统一package即可
  • 一个包package被导入时会调用它的init()函数
    • 导入一个包只是使用它做初始化
      • 前面加小-
      • import - “demo”

反引号

``

包含的字符串,会原模原样打印,不会进行任何转义。

全局声明需要注意

全局变量不能用 := 进行声明了。

要用完整声明。

格式化打印

1
2
3
4
5
6
7
8
9
10
11
12
13
%b 表示为二进制
%c 该值对应的unicode码值
%d 表示为十进制
%o 表示为八进制
%X 表示为十六进制,使用A-F
%U 表示为Unicode格式:U+1234,等价于"U+%04X"
%t 单词true或false
%s 直接输出字符串或者[]byte 的转义表示
%p 表示为十六进制,并加上前导的0x
%v 值的默认格式表示。当输出结构体时,扩展标志(%+v)会添加字段名
%#v 值的Go语法表示
%T 值的类型的Go语法表示
%% 百分号

本文标题:GO语言学习笔记1——总览

文章作者:Yang Shuai

发布时间:2019年06月09日 - 17:06

最后更新:2019年06月09日 - 17:06

原始链接:https://ysbbswork.github.io/2019/06/09/GO语言学习笔记1——总览/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

坚持原创技术分享,您的支持将鼓励我继续创作!