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。



posted on 2018-04-18 18:36  letwant  阅读(139)  评论(0编辑  收藏  举报

导航