go基础概括

330 阅读5分钟

go基础概括

打包命令

Mac 下编译 Linux 和 Windows 64位可执行程序

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

Linux 下编译 Mac 和 Windows 64位可执行程序

CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

Windows 下编译 Mac 和 Linux 64位可执行程序

SET CGO_ENABLED=0
SET GOOS=darwin
SET GOARCH=amd64
go build

SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build

命令说明

go env用于打印Go语言的环境信息。
go run命令可以编译并运行命令源码文件。
go get可以根据要求和实际情况从互联网上下载或更新指定的代码包及其依赖包,并对它们进行编译和安装。
go build命令用于编译我们指定的源码文件或代码包以及它们的依赖包。
go install用于编译并安装指定的代码包及它们的依赖包。
go clean命令会删除掉执行其它命令时产生的一些文件和目录。
go doc命令可以打印附于Go语言程序实体上的文档。我们可以通过把程序实体的标识符作为该命令的参数来达到    查看其文档的
  目的。
go test命令用于对Go语言编写的程序进行测试。
go list命令的作用是列出指定的代码包的信息。
go fix会把指定代码包的所有Go语言源码文件中的旧版本代码修正为新版本的代码。
go vet是一个用于检查Go语言源码中静态错误的简单工具。
go tool pprof命令来交互式的访问概要文件的内容。

语言基础

1、go下划线

1、若在import引入的包中。则只运行引入的包的init函数,
  若在函数或者方法的返回作为参数接受,则是忽略返回的结果或者充当占位符。
2、说明:特别是引入mysql包,只是把驱动注册到sql包。

2、变量

1、变量的作用就是为了存储数据。同一作用域内不支持重复声明。先变量名 再变量类型
2、字符串修改必须转为[]rune或[]byte 修改完成后在转换为string类型。

3、指针

1、只需要记住两个符号:&(取地址)和*(根据地址取值)。
  取地址操作符&和取值操作符*是一对互补操作符,&取出地址,*根据地址取出地址指向的值。

4、if

1go不支持三目运算符。

5、for

forfor range有什么区别?

for可以遍历array和slice、遍历key为整型递增的map、遍历string

range可以完成所有for可以做的事情,却能做到for不能做的,包括
遍历key为string类型的map并同时获取key和value、遍历channel

6、函数

1、参数两种传递方式
   1、值传递:则是将值拷贝一份,在函数中对该参数进行修改则不会修改原值
   2、引用传递:参数传递实际是将地址传递到函数中,那么在函数中进行修改,将影响到实际函数。

7、字符串

1、字符串是用一对双引号("")或反引号(` `)括起来定义,它的类型是 string

8、切片

切片和声明array一样,只是少了长度

9、类型转换

不只持隐式转换 ,必须进行显式类型转换

10、init()函数

    执行的顺序,同一个源文件中按照从上而下的顺序执行,同一个包中不同文件如果不存在依赖关系按照文件名的字符串

比较决定执行顺序,如果存在依赖关系最早依赖的最后调用。

11、数组

是同一类型固定长度的序列,长度是数组类型的一部分若长度不同则类型不同,数组是值类型,赋值和传参都会复制整个数组。

声明、初始化

声明:var new_arr [3]T T为变量类型 比如说intstring
初始化: arr_name := [5]int{3,5,22,12,23}或者arr_name := [...]int{3,5,22,12,23}

12、切片

是数组的引用,因此切片是引用类型,但自身是结构体,值拷贝传递。如果切片=nil len cap都等于0
append :向 slice 尾部添加数据,返回新的 slice 对象。

声明、初始化

声明:var str []T  T为变量类型 比如说intstring
初始化 slice := make([]T, len, cap) len切片长度 cap 切片容量

13、map

判断map中key是否存在 value, ok := map[key] if ok {todo}

声明、初始化

声明:var m map[T]T T变量类型
初始化:m: = make(m map[T]T)

14、结构体

结构体标签tag可以通过反射机制取出来,结构体标签由一个或多个键值对组成。
键与值使用冒号分隔,值用双引号括起来。键值对之间使用一个空格分隔。 
注意事项: 为结构体编写Tag时,必须严格遵守键值对的规则。结构体标签的解析代码的容错能力很差,一旦格式写错,编译和运行时都不会提示任何错误,通过反射也无法正确取值。

例如不要在key和value之间添加空格。

声明

type structName struct {} 匿名结构体 type struct {}

15、管道

channel c := <-channel 出管道  channel<- c 进管道  管道无需手动关闭 因为它会被gc回收

声明

var 变量 chan 元素类型,声明的通道后需要使用make函数初始化之后才能使用
chan := make(chan T, len) 

16、可变参数

Golang 可变参数本质上就是 slice。只能有一个,且必须是最后一个。Golang匿名函数可赋值给变量,做为结构字段,或者在 channel 里传送。
Golang匿名函数可赋值给变量,做为结构字段,或者在 channel 里传送。

17、闭包

是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境)。

18、defer

延迟调用,这些调用直到 return 前才被执。因此,可以用来做资源清理,多个defer先进后出执行
用途:文件句柄释放,数据库连接释放,关闭锁连接