共计 19 篇文章

golang基础

Data race 数据竞争:当多个goroutine并发访问同一个变量,并且至少有一个goroutine对变量进行写操作时,就会发生数据竞争。 go提供了一个内置的数据竞争检测工具: $ go test -race mypkg // to test the package $ go run -race mysrc.go // to run the source file $ go ...

Golang逃逸分析

简介 编译代码时,编译器根据分析,判断将变量分配在栈或堆上。 一般情况 函数定义中,一般将局部变量和参数分配到栈上(stack frame)上。但是,如果编译器不能确定在函数返回(return)时,变量是否被引用(reference),分配到堆上;如果局部变量非常大,也应分配在堆上。 如果对变量取地址(*和&操作),则有可能分配在堆上。此外,还需要进行逃逸分析( ...

雨痕 Go语言学习笔记-进阶

内存布局 string是指针,指向底层byte数组 slice是指针类型,slice由3部分组成:底层数组指针,len,cap interface也是指针类型,由两部分组成: *Itab,表明指针对应数据的类型 *data,指向指针代表的数据 new,创建对象,返回指针 make,只初始化slice,channel,map。返回值不是指针,但是slice,map,channle是指针类型: slice: ...

雨痕 Go语言学习笔记-工作空间

工作空间 可在 GOPATH 环境变量列表中添加多个⼯作空间,但不能和 GOROOT 相同 通常 go get 使⽤第⼀个⼯作空间保存下载的第三⽅库 源文件 注释:⽀持 "//"、 "/**/" 两种注释⽅式,不能嵌套 命名:采⽤ camelCasing ⻛格, ...

雨痕 Go语言学习笔记-并发

Goroutine 通过go关键字创建并发执行单元,有调度器安排到适合的系统线程执行 调度器不能保证多个 goroutine 执⾏次序,且进程退出时不会等待它们结束 默认情况下,进程启动后仅允许⼀个系统线程服务于 goroutine。可使⽤环境变量或标准库函数runtime.GOMAXPROCS修改,让调度器⽤多个线程实现多核并⾏,⽽不仅仅是并发(注意并行和并发的区别) 调⽤runtime.Goexit将⽴即终⽌当前goroutine 执⾏,调度器确保所有已注册 ...

雨痕 Go语言学习笔记-接口

接口 接⼝命名习惯以 er 结尾,结构体 接⼝没有数据字段 可在接⼝中嵌⼊其他接⼝ 执行机制 接⼝对象由接⼝表 (interface table) 指针和数据指针组成 接⼝表存储元数据信息,包括接⼝类型、动态类型,以及实现接⼝的⽅法指针。 ...

雨痕 Go语言学习笔记-方法

方法定义 ⽅法总是绑定对象实例,并隐式将实例作为第⼀实参 (receiver) 函数和方法有区别,方法和实例绑定,会改变实例状态,方法不会 不⽀持⽅法重载,receiver 只是参数签名的组成部分。(重载,参数和返回值不同的同名函数,实际是函数签名不同) 可⽤实例 value 或 pointer 调⽤全部⽅法,编译器⾃ ...

雨痕 Go语言学习笔记-数据

Array 和以往认知的数组有很⼤不同。 • 数组是值类型,赋值和传参会复制整个数组,⽽不是指针。 • 数组⻓度必须是常量,且是类型的组成部分。 [2]int 和 [3]int 是不同类型。 • ⽀持 "=="、 "!=" 操作符,因为内存总是被初始化过的。 • 指针数组 [n]*T,数组指针 *[n]T 多种初始化方法 a ...

雨痕 Go语言学习笔记-函数

函数定义 不⽀持 嵌套 (nested)、重载 (overload) 和 默认参数 (default parameter)。 • ⽆需声明原型。 • ⽀持不定⻓变参。 • ⽀持多返回值。 • ⽀持命名返回参数。 • ⽀持匿名函数和闭包。 函数是第⼀类对象,可作为参数传递。建议将复杂签名定义为函数类型,以便于阅读。 func test(fn func( ...

golang pkg bufio

golang bufio pkg bufio包实现了可缓冲的IO,它封装io.Reader和io.Writer对象,新创建一个对象并且实现了io.Reader和io.Writer的接口,不同点在于bufio提供了缓冲处理IO文本的方法。 从官方给的例子个人大致了解了Scanner的用法,Reader和Writer的方法还需要探索。 ...

Effective Go阅读纪要

Formatting Commentary godoc regexp | grep -i compile 在可导出函数上的注释是可以搜索的 https://golang.org/doc/effective_go.html#redeclaration defer defer is LIFO order for i := 0; i < ...

golang 面试题知识点梳理

2017年6月份,诺唯在知乎专栏发表文章golang 面试题,我发现自己部分内容回答不上来,基础知识点不牢固,所以结合Golang在线文档,重新梳理下相关知识点。 1 写出下面代码输出内容 package main import ( "fmt" ) func main() { defer_call() } func defer_call() { defer func() { fmt.Println("打印前") }() defer ...

golang os pkg

Golang os包提供了不依赖平台的操作系统函数,os包的接口规定为在所有操作系统中都是一致的。非公用的属性可以从操作系统特定的syscall包获取。 os包提供以下操作 文件 创建 目录 软链接/硬链接 进程 主机信息 ...

golang index out of range

项目中需要计算Linux上的disk usage。个人在查阅相关资料后决定使用bash的df命令, 通过解析df的输出来更方便地获取disk usage。第一版代码如下: import( "fmt" "strconv" "strings" "os/exec" "log" ) func main() { out, _ := exec.Command("df").Output() ret, err := parseDfOutput(string(out)) if ...

golang undefined func

不同的.go文件数据同一个包: . ├── lib.go └── main.go lib.go下有一个Test1函数: package main import "fmt" func Test1() { fmt.Println("lib.go Test1") } main.go如下: package main import( "fmt" ) func ...