Go笔记
进程同步与异步:
function
系统资源:内存,CPU,硬盘,显卡
阻塞与非阻塞
M G P
GO并发模型
内存泄漏
Path
GOPATH //go工作文件目录,可以设置多个 go get,下载第三方模块,默认是第一个工作目录中的src文件夹中
四个文件夹bin gocs pkg src
GOPATH 中的bin也要加到Path环境变量中
GOROOT //go安装根目录,里面有bin安装到path环境变量中
go version能起作用,是因为path中存在go/bin,go version先在path中寻找,在path路径中找到go 然后匹配到go/bin
包名最好与文件名一致,
go run main.go //临时执行
go build main.go //生成可执行文件,并放在当前目录
go install //生成可执行文件,并放到bin目录下
接着go install 命令 ./src
交叉编译
GOOS=windows GOARCH=amd64 go build //两个重要参数,系统版本,机器版本
数组,长度固定,
在全局变量中定义变量只能用var,在函数体中能用:=
slice 长度不固定
arr长度固定
数组和结构体是值类型,切片slice和map是引用类型
go语言所有变量都已经初始化
例:var arr [2]int // array{0,0}
var chanA chan bool //chan类型
判断为空nil
happen before
管道方式解决
defer
//会使函数最终会执行,即close()肯定会关闭
//类比try catch
//func add(a,b int) (result int, err error){
}
//defer相当于栈,defer里面的函数会逆序执行
interface
//不需要实例化,可以直接赋值
//var a intaface{}
struct(
package main import "fmt" type Vertex struct { X int Y int } func main() { v := Vertex{1, 2} //结构体的实例化以及初始化 v.X = 4 //对结构体中元素赋值 fmt.Println(v.X)
p := &v //指针引用 p.X = 1e9
)
slice map
channel以及channel使用场景
函数大写开头,其他包可以调用,如果小写,则其他包不可调用
循环迭代,range
for _,value := range array { //_ 意思是丢弃不用
for ... range的坑,for range创建了每个元素的副本,而不是直接返回每个元素的引用,如果使用该值变量的地址作为指向每个元素的指针,就会导致错误,在迭代时,返回的变量是一个迭代过程中根据切片依次赋值的新变量,所以值的地址总是相同的
import _ "github.com/a/a“
slice 作为参数最好用返回值返回
func main() { slice := []int{0, 1, 2, 3} myMap := make(map[int]*int) for index, value := range slice { num := value myMap[index] = &num } fmt.Println("=====new map=====") prtMap(myMap) } func prtMap(myMap map[int]*int) { for key, value := range myMap { fmt.Printf("map[%v]=%v\n", key, *value) //注意调用是用* } }
}
项目文件夹里创建vander
go get -u github.com/...
服务自发性consul
Go语言查看变量的类型: fmt.Println(reflect.TypeOf(v))
golang 使用 iota
自增长常量经常包含一个自定义枚举类型,允许你依靠编译器完成自增设置。
type Stereotype int
const (
TypicalNoob Stereotype = iota // 0
TypicalHipster // 1
TypicalUnixWizard // 2
TypicalStartupFounder // 3
)
即TypicalStartupFounder的值就是为3,可以直接调用
fmt.Println(TypicalStartupFounder) //3
可跳过的值
type AudioOutput int //注意最上面要给个初始值
const (
OutMute AudioOutput = iota // 0
OutMono // 1
OutStereo // 2
_
_
OutSurround // 5
)
const ( Apple, Banana = iota + 1, iota + 2 Cherimoya, Durian Elderberry, Fig )
// Apple: 1
// Banana: 2
// Cherimoya: 2
// Durian: 3
// Elderberry: 3
// Fig: 4
const (
i = iota
j = 3.14
k = iota
l
)
那么打印出来的结果是 i=0,j=3.14,k=2,l=3
Go for range语句
for key, value range obj {
.....
}
将数组类型的interface转为str
ops := d.job.JobParams["host_name"]
des := fmt.Sprintf("%v", ops)
return des
服务器响应数字类型
1XX 提示信息 - 表示请求已被成功接收,继续处理
2XX 成功 - 表示请求已被成功接收,理解,接受
3XX 重定向 - 要完成请求必须进行更进一步的处理
4XX 客户端错误 - 请求有语法错误或请求无法实现
5XX 服务器端错误 - 服务器未能实现合法的请求
golang截取字符串
str := "XBodyContentX" content := str[1 : len(str)-1] fmt.Println(content)
Go切片:
接口interface: 一组方法的集合,不需要实现这些方法,接口中不能有任何变量,默认类型是一个指针,
打印类型: %T
定义结构体如果是指针类型的方法,可以这样初始化
bwm := &BWM{
name := "baoma"
}
panic会导致程序直接结束,一般只有在读取配置文件初始化时才会用到panic,即在init()中读取配置文件信息失败,会调用一下panic,其他情况下不能调用panic。