go 学习笔记1

关注点

  • go 的协程(routine)是通过调度器,调度,每个调度器绑定到一个线程(thread)上
  • 引用类型 channel,map,slice.引用类型的零值是nil(所以全局声明这些变量最好用make eg:var matchers = make(map[string]Matcher))
  • 使用接口写通用代码
  • _ 空位符,
  • (在包中使用init函数和手工调用初始化函数区别 就是 init 自动调用,并且不会)
  • 声明

channel 通道

通道是用来在多个goroutine 发送和共享数据,通道分为两种 缓冲通道和无缓冲通道。

  • 缓冲通道 接受和发送不必同步,当通道满了,发送会阻塞,当通道空了接受会阻塞。

  • 无缓冲通道 通道的大小为0,接受和发送必须是同步的,否则就会造成一方阻塞,所以也被称为同步通道。无缓冲通道相当于 make(chan int,0)

  • 总结1 正式因为以上特性,如果在一个goroutine中给无缓冲通道赋值,但没有在其他goroutine 进行读取操作,会造成死锁(一直等待其他协程读取)

eg: 
func main(){
    messages := make(chan string, 0)
    
     messages <- "cjem" // 没有其他goroutine读取造成死锁
    //  go func() { messages <- "ping" }()
    
    fmt.Println(<-messages)
}
  • 总结2 如果一个缓冲通道,数据被读取结束,但是没有close 通道,那么通道为空,一直在等待数据输入,所以也会造成死锁
        queue := make(chan string, 2)

    queue <- "1"
    queue <- "2"
    // 读取结束但是没有close(queue),造成读取方一直等待读取,死锁
    for elem := range queue {
        fmt.Println(elem)
    }
  • 总结3 通道用完一定要close,缓冲通道可以保证事件不会阻塞程序运行。

变量声明

如果需要声明初始值为零值的变量应该用var关键字声明变量,如果提供确切的非零值初始化变量或者使用函数返回值创建变量 ,应该使用简明变量声明运算符
指针变量可以在函数之间共享数据

关于方法

  • 建议方法的接受者声明为指针。这样既可以防止对象拷贝也可以修改接受者值的状态
  • 方法通过接受者类型调用的话无论是通过指针还是值方法都可以调用
  • 方法如果通过 实现的接口调用,那么接受者是指针实现的方法 只能在接口类型的值是一个指针的时候被调用(因为可能只&1 这样的值可以复制给接口 但是没有地址)。如果使用值作为接受者声明的方法,在接口类型的值为值或者指针的时候,都可以被调用

接口

如果一个接口只有一个方法,那么这个类型的名字以er结尾

问题

Q1 通道中存储指针而不是值有什么好处?

在通道中只保存指针 而不是值 对于复杂类型可以有效的减少内存占用,如果用值就会造成数值内存拷贝并且等待系统GC

Q2 range channel 在什么情况下自动结束?

close 之后才会结束,如果没有进行close 操作,那么就会造成死锁

go package

使用包来封装不同的语义单元。目的是能够更好的复用代码,并对包内的数据的使用有更好的控制。
同一个目录下所有.go文件必须声明同一个包名。
包名命名惯例是使用包所在目录的名字。
包名及其目录名应该简介,清晰且全是小写的名字。
go get 获取指定包以及包的依赖包

go command

  • go vet (vs code 插件可做)校验代码常见错误
  • go fmt (vs code 插件可做)格式化代码
  • go doc 打印文档(中断查看)
  • godoc 网页浏览文档
  • godep
  • go build -race 检测竞争

数组,切片和映射

数组是切片和映射的基础数据结构

函数之间传递是一个开销很大的操作,在函数之间传递变量总是以值的形式传递,所以如果这个变量是一个数组,意味着整个数组,不管多长,都会被完整复制,并传递给函数。所以函数之间数组传递,应该只穿数组指针。

切片  如果基于这个切片创建新的切片,新的切片会和原有切片共享底层数组。切片是引用类型:
只声明是nil:eg var slice []int
空切片:eg:make([]int,0)
函数中传递切片 值复制,但是切片本身尺寸很小

映射 在函数之间传递映射并不会制造出该映射的副本和切片一样传递map值

切片,map 的分为nil 和空切片(map)
只声明就是nil,make(*,0)或者直接初始化map[string]string{}这样是空切片,但是之后nil才能和nil比较,虽然len()结果一样

类型系统

方法

值接收者:调用时会使用这个值的一个副本执行。
指针接收者

引用类型

切片,映射,通道,接口和函数。永远不要共享一个引用类型的值。赋值传递一个引用类型值的副本,本质上就是在共享底层数据结构。

并发

操作系统会在物理处理器上调度线程来运行,而go 语言的运行时会在逻辑处理器上调度goroutine 来运行。
每个逻辑处理器分别绑定到单个操作系统线程。

并发模式

  • 控制程序的生命周期
  • 管理可复用的资源池
  • 创建可以处理任务的goroutine池

runner

runner 包用来展示使用通道监视程序的执行时间,如果程序运行时间过长,也可以使用runner包来终止程序。(当开发需要调度后台处理任务的时候这种模式很有用)
  • 程序在分配的时间内完成工作,正常终止

  • 程序没有及时完成工作,"自杀"

  • 接受到操作系统发送的中断事件,程序立即试图清理状态,并停止工作。

  • select 在监控通道的时候 可以添default.可以将监听的通道阻塞变为非阻塞的。

eg:
select {
     case err := <-r.interrupt
        signal.Stop(r.interruppt)
      return true
     default:
        return false
}

pool 使用缓冲的通道实现资源池,,来管理任意数量的goroutine 之间共享或者独立的资源。

测试(单元测试,基准测试)

单元测试

验证代码正确性
  • 正向测试,正常执行的情况下,保证代码不产生错误的测试
  • 负向路径 保证代码产生错误,而其实预期错误(构建网络服务,不运行服务,调用服务功能测试)
  • 测试函数必须是公开的并且以Test单词开头并且函数的参数必须接受一个指向testing.T 类型的指针,并且不能返回任何值。
  • httptest 可以模仿http的网络调用
  • 服务端点是指与服务宿主信息无关,用来分辨某个服务的地址,一般是不包含宿主的一个路径。如果在构造网络API,你会希望直接测试自己服务的所有端点,而不用启动整个网络服务。

基准测试

检验代码性能
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,914评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,935评论 2 383
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,531评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,309评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,381评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,730评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,882评论 3 404
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,643评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,095评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,448评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,566评论 1 339
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,253评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,829评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,715评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,945评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,248评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,440评论 2 348

推荐阅读更多精彩内容

  • 出处---Go编程语言 欢迎来到 Go 编程语言指南。本指南涵盖了该语言的大部分重要特性 Go 语言的交互式简介,...
    Tuberose阅读 18,405评论 1 46
  • 第一章五个程序 都很好!但是初学编程/没有其他语言基础的不容易看懂。 记一遍不熟悉的东西: who = strin...
    暗黑破坏球嘿哈阅读 1,420评论 0 10
  • 官方网站:https://golang.org/标准库文档:https://golang.org/pkg/在线编码...
    技术学习阅读 2,324评论 2 39
  • Go的内存模型 看完这篇文章你会明白 一个Go程序在启动时的执行顺序 并发的执行顺序 并发环境下如何保证数据的同步...
    初级赛亚人阅读 2,841评论 0 2
  • 引言 UIWebView 和 WKWebView 的区别 WKWebView 更快(占用内存可能只有 UIWebV...
    胡同里敲代码阅读 1,047评论 0 0