Go教程
文章平均质量分 88
楼仔
一枚小小的Go/Java代码搬运工!
展开
-
【Go语言核心手册14】结语&参考文献
14.1初衷学习Go语言有2年时间,最开始的入门书籍是《Go程序设计语言》,之后看了《Go语言学习笔记》,然后也学习了极客的《Go语言核心36讲》,这些也算是Go比较经典的书籍和学习教材,但是感觉整体比较散,特别是《Go程序设计语言》,整体感觉作者写的有种走马观花的感觉,然后对于《Go语言核心36讲》,搭建Go语言的基础体系不错,但是作者的语文功底真的的非常欠缺,写的不仅啰嗦,很多知识点还晦涩难懂,唯一感觉还不错的,就属《Go语言学习笔记》了,但是里面涉及到并发相关的知识,基本是一笔带过,然后涉及到.原创 2021-08-04 09:16:18 · 987 阅读 · 0 评论 -
【Go语言核心手册13】sync.Once
当一个函数不希望程序在一开始的时候就被执行的时候,我们可以使用sync.Once。Once类型的Do方法只接受一个参数,这个参数的类型必须是func(),即:无参数声明和结果声明的函数。该方法的功能并不是对每一种参数函数都只执行一次,而是只执行“首次被调用时传入的”那个函数,并且之后不会再执行任何参数函数。所以,如果你有多个只需要执行一次的函数,那么就应该为它们中的每一个都分配一个sync.Once类型的值(以下简称Once值),看个示例:func main() { var once sync原创 2021-08-03 08:11:27 · 186 阅读 · 0 评论 -
【Go语言核心手册12】sync.Pool
12.1 基础知识在 golang 中有一个池,它特别神奇,你只要和它有个约定,你要什么它就给什么,你用完了还可以还回去,但是下次拿的时候呢,确不一定是你上次存的那个,这个池就是 sync.Pool。sync.Pool类型只有两个方法——Put和Get。Put 用于在当前的池中存放临时对象,它接受一个interface{}类型的参数;而 Get 则被用于从当前的池中获取临时对象,它会返回一个interface{}类型的值。更具体地说,这个类型的Get方法可能会从当前的池中删除掉任何一个值,然后把这原创 2021-08-03 08:11:20 · 213 阅读 · 0 评论 -
【Go语言核心手册11】context.Context
11.1 内容前导回顾之前的知识,我们先看一个关于WaitGroup的示例:func main() { var wg sync.WaitGroup wg.Add(2) go func() { time.Sleep(2*time.Second) fmt.Println("1号完成") wg.Done() }() go func() { time.Sleep(2*time.Second) fmt.Pr原创 2021-08-03 08:11:12 · 1956 阅读 · 0 评论 -
【Go语言核心手册10】原子操作
10.1 内容前导上一章我们学到,互斥锁是一个很有用的同步工具,它可以保证每一时刻进入临界区的goroutine只有一个。通过对互斥锁的合理使用,我们可以使一个goroutine在执行临界区中的代码时,不被其他的goroutine打扰,但是它仍然可能会被中断(interruption)。那什么是原子操作呢?我们已经知道,原子操作即是进行过程中不能被中断的操作。也就是说,针对某个值的原子操作在被进行的过程当中,CPU绝不会再去进行其它的针对该值的操作。为了实现这样的严谨性,原子操由 CPU 提供芯片原创 2021-08-03 08:11:03 · 696 阅读 · 0 评论 -
【Go语言核心手册9】互斥锁
9.1 基础知识对写操作的锁定和解锁,简称“写锁定”和“写解锁”:func (*RWMutex)Lock() func (*RWMutex)Unlock()对读操作的锁定和解锁,简称为“读锁定”与“读解锁”:func (*RWMutex)RLock() func (*RWMutex)RUnlock()看个不使用锁的示例:func printer(str string) { for _, data := range str { fmt.Printf("%c",..原创 2021-08-03 08:10:54 · 191 阅读 · 0 评论 -
【Go语言核心手册8】sync.WaitGroup
8.1 基础知识这个是通过通道,来控制goroutine协程结束的示例:func coordinateWithChan() { sign := make(chan struct{}, 2) num := int32(0) fmt.Printf("The number: %d [with chan struct{}]\n", num) max := int32(10) go addNum(&num, 1, max, func() { sign <- struct{}{} }) go原创 2021-08-03 08:10:45 · 387 阅读 · 0 评论 -
【Go语言核心手册7】通道
Don’t communicate by sharing memory, share memory by communicating。相信学过Go的同学都知道这句名言,可以说channel就是后边这句话的具体实现。channel是一个类型安全的循环队列,能够控制groutine在它上面读写消息的行为,比如阻塞某个groutine ,或者唤醒某个 groutine。7.1 基本特征一个通道相当于一个先进先出(FIFO)的队列,各个元素值都是严格地按照发送的顺序排列的,先被发送通道的元素值一定会先被接原创 2021-08-03 08:10:37 · 281 阅读 · 0 评论 -
【Go语言核心手册6】接口
6.1 协程和线程协程跟线程是有区别的,线程由CPU调度是抢占式的,协程由用户态调度是协作式的,一个协程让出CPU后,才执行下一个协程。6.1.1 1:1关系 优点:1个协程绑定1个线程,这种最容易实现,协程的调度都由CPU完成了。 缺点:协程的创建、删除和切换的代价都由CPU完成,有点略显昂贵了。 6.1.2 N:1关系 优点:N个协程绑定1个线程,协程在用户态线程即完成切换,不会陷入到内核态,这种切换非常的轻量快速。 缺点:1个进程的所有协程都绑定在1个线原创 2021-08-03 08:10:27 · 171 阅读 · 0 评论 -
【Go语言核心手册5】接口
5.1 接口实现一个接口类型定义了一套方法,如果一个具体类型要实现该接口,那么必须实现接口类型定义中的所有方法。有同学可能觉得,这个概念很简单啊,先看个示例:type tester interface { test() string() string}type data struct {}func (*data) test() {}func (data) string() string { return ""}func main() { var d data //原创 2021-08-03 08:10:18 · 197 阅读 · 0 评论 -
【Go语言核心手册4】结构体&方法
4.1 匿名字段所谓匿名字段,是指没有名字,仅有类型的字段,被称为嵌入字段或者嵌入类型。type attr struct{ perm int}type file struct{ name string attr // 仅有类名}var f filef.name = "lvmenglou"f.perm = 24 // 等价于f.attr.perm = 244.2 方法覆盖方法存在同名遮蔽问题,通过匿名字段user构建manager结构,两者都实现了toString()方法原创 2021-08-03 08:10:09 · 144 阅读 · 0 评论 -
【Go语言核心手册3】字典
3.1 基本用法字典属于引用类型,初始化方式主要有2种,分别为:m1 := make(map[string]int)m2 := map[string]int { "lvmenglou": 32, "litinajie": 28,}字典是被设计成“not addressable”,所以不能直接修改value成员,如果需要修改value成员,需要对元素整体替换:type user struct { name string age byte}m := map[int]原创 2021-08-02 10:01:31 · 218 阅读 · 0 评论 -
【Go语言核心手册2】数组和切片
2.1 数组数组初始化方式常用的有3种,至于其它的用的很少,就不用管了,常用方式如下:var a[4]intb := [4]int{2, 4}c := [...]int{2, 4}Go数组是值类型,赋值和传参会复制整个数组数据,为了避免数据复制,可以使用数组指针:func test(x *[2]int) { x[1] += 1}func main() { a := [2]int{2, 3} test(&a)}最后需要区分指针数组和数组指针的区别:fu原创 2021-08-02 10:01:22 · 124 阅读 · 0 评论 -
【Go语言核心手册1】字符串
1.1 基础概念ASCII是英文“American Standard Code for Information Interchange”的缩写,中文译为美国信息交换标准代码,它是由美国国家标准学会(ANSI)制定的单字节字符编码方案,它使用单个字节(byte)的二进制数来编码一个字符。Unicode编码规范为世界上现存的所有自然语言中的每一个字符,都设定了一个唯一的二进制编码。它 ASCII 编码集为出发点,并突破了ASCII只能对拉丁字母进行编码的限制。Unicode编码规范通常使用十六进制表示原创 2021-08-02 10:01:11 · 204 阅读 · 0 评论