互斥锁,g0获取锁,到释放锁之间,g1去获取锁失败,阻塞,g0释放锁之后g1获取锁成功,gn阻塞。

package main

import (
"fmt"
"sync"
"time"
) func main() {
//声明
var mutex sync.Mutex
fmt.Println("Lock the lock. (G0)")
//加锁mutex
mutex.Lock() fmt.Println("The lock is locked.(G0)")
for i := 1; i < 4; i++ {
go func(i int) {
fmt.Printf("Lock the lock. (G%d)\n", i)
mutex.Lock()
fmt.Printf("The lock is locked. (G%d)\n", i)
}(i)
}
//休息一会,等待打印结果
time.Sleep(time.Second)
fmt.Println("Unlock the lock. (G0)")
//解锁mutex
mutex.Unlock() fmt.Println("The lock is unlocked. (G0)")
//休息一会,等待打印结果
time.Sleep(time.Second)
}

原子操作

通过atomic的AddUint32方法,只有一个协程可以操作sum,保证结果一定是150,原子操作相当于给sum加了锁。

package main

import (
"fmt"
"sync"
"sync/atomic"
) var m *sync.Mutex func main() {
var sum uint32 = 100
var wg sync.WaitGroup
for i := 0; i < 50; i++ {
wg.Add(1)
go func() {
defer wg.Done()
//sum += 1 //1
atomic.AddUint32(&sum, 1) //2
}()
}
wg.Wait()
fmt.Println(sum)
}

go的“any”类型

类似ts的any,但是很麻烦的是用这个字段的时候需要强转,就是.([]string)这个操作,如果range的时候没把内容转成字符串,就会报错,因为毕竟他是interface{}类型

package main

import (
"fmt"
) func main() {
m := map[string]interface{}{
"Name": "Wednesday",
"Age": 6,
"Parents": []string{
"Gomez",
"Morticia",
},
} maps := []interface{}{
"Gomez",
"Morticia",
}
fmt.Println(maps, m)
for key, value := range m["Parents"].([]string) {
fmt.Println("Key:", key, "Value:", value)
}
}

channel

go的chan关键字可以创建一个channel用于协程通信, ch <- 是写数据,<- ch是读数据,你也可以用range来读数据,当读不到数据的时候就会阻塞。所以下面的代码不写sleep,go进程也不会退出。

import (
"fmt"
// "time"
) func main() {
var ch = make(chan []int)
num := []int{1, 2, 3}
i := 0
go func() {
for {
ch <- num
num = append(num, i)
i++
fmt.Println("write")
}
}()
for nu := range ch {
fmt.Println(nu)
} }

channel一般都用select来消费,只要一个case成功就完成,不然就阻塞到成功。

package main

import (
"time"
"fmt"
) func main(){
c := make(chan int)
select{
case <- c:
fmt.Println("没有数据")
case <-time.After(5* time.Second):
fmt.Println("超时退出")
}
}

利用多核cpu

通过设置runtime.GOMAXPROCS(2),让go协程可以跑在两个cpu上,所以打印的2次0-100,没有先后顺序。go的多核利用是利用多个cpu上跑协程。

并不是多核一定高效,比如io操作,单核比多核更快,单核没有线程切换的损耗,而且io操作并不需要go来做啥。多核的场景应该是高计算的任务。


import (
"fmt"
"runtime"
) var quit chan int = make(chan int) func loop() {
for i := 0; i < 100; i++ { //为了观察,跑多些
fmt.Printf("%d ", i)
}
quit <- 0
} func main() {
runtime.GOMAXPROCS(2) // 最多使用2个核 go loop()
go loop() for i := 0; i < 2; i++ {
<-quit
}
}

golang 代码笔记的更多相关文章

  1. golang学习笔记19 用Golang实现以太坊代币转账

    golang学习笔记19 用Golang实现以太坊代币转账 在以太坊区块链中,我们称代币为Token,是以太坊区块链中每个人都可以任意发行的数字资产.并且它必须是遵循erc20标准的,至于erc20标 ...

  2. golang学习笔记8 beego参数配置 打包linux命令

    golang学习笔记8 beego参数配置 打包linux命令 参数配置 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/mvc/contro ...

  3. golang学习笔记7 使用beego swagger 实现API自动化文档

    golang学习笔记7 使用beego swagger 实现API自动化文档 API 自动化文档 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/doc ...

  4. golang学习笔记6 beego项目路由设置

    golang学习笔记5 beego项目路由设置 前面我们已经创建了 beego 项目,而且我们也看到它已经运行起来了,那么是如何运行起来的呢?让我们从入口文件先分析起来吧: package main ...

  5. golang学习笔记5 用bee工具创建项目 bee工具简介

    golang学习笔记5 用bee工具创建项目 bee工具简介 Bee 工具的使用 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/instal ...

  6. go语言,golang学习笔记4 用beego跑一个web应用

    go语言,golang学习笔记4 用beego跑一个web应用 首页 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/ 更新的命令是加个 -u 参数,g ...

  7. go语言,golang学习笔记2 web框架选择

    go语言,golang学习笔记2 web框架选择 用什么go web框架比较好呢?能不能推荐个中文资料多的web框架呢? beego框架用的人最多,中文资料最多 首页 - beego: 简约 & ...

  8. go语言,golang学习笔记1 官网下载安装,中文社区,开发工具LiteIDE

    go语言,golang学习笔记1 官网下载安装,中文社区,开发工具LiteIDE Go语言是谷歌2009发布的专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速 ...

  9. TCP粘"包"问题浅析及解决方案Golang代码实现

    一.粘"包"问题简介 在socket网络编程中,都是端到端通信,客户端端口+客户端IP+服务端端口+服务端IP+传输协议就组成一个可以唯一可以明确的标识一条连接.在TCP的sock ...

随机推荐

  1. Error occurred during initialization of VM Could not reserve enough space for 2097152KB object heap

    ionic build Android后的报错问题 ionic 升级了splashscreen和statusbar的插件后,执行ionic build android会一直报打包错误.原因是过低的An ...

  2. ES6常用

    ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准. 因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015(简称ES2015).虽然浏览器在不 ...

  3. C# 不用递归,获取无限层级数据

    对象属性 public class ResList { public int ID { get; set; } public List<ResList> Child { get; set; ...

  4. 在windows下搭建汇编编程环境

    汇编语言程序搭建masm+debug 下载链接 dosbox:链接:https://pan.baidu.com/s/1TgkfU-d5w6Nz9TOYro1pYw 密码:mp83 masm:链接:ht ...

  5. Html 解决数字和字母不换行

    在html页面中,如果是数字或者字母显示的话,默认是不换行的.一般显示成这种: 解决方法确实也很简单,设置td或者div为: style="word-break:break-all;&quo ...

  6. C#基础知识之字符串比较方法:“==”操作符;RefernceEquals;String.Equals方法;String.Compare方法;String.CompareOrdinal方法。

    一.“==”操作符:String.Equals:ReferenceEquals 方法 1.在编程中实际上我们只需要这两种比较,c#中类型也就这两种 (1)值类型的比较:一般我们就是判断两个值类型实例各 ...

  7. java.util.NoSuchElementException问题定位

    Iterator 迭代器越界 例子如下: Iterator i = set.iterator(); while (i.hasNext()) { System.out.println(i.next()) ...

  8. supervisord支持扩展(xml RPC API & Third Party Applications and Libraries)

    XML-RPC API Documentation http://www.supervisord.org/api.html Third Party Applications and Libraries ...

  9. 【转】JSON.parse() Unexpected token i in JSON at position 2 报错问题

    JSON.parse(): Unexpected token i in JSON at position 2 报错问题 错误代码: var res = "[{id:1,name:'limin ...

  10. web框架开发-Ajax

    Ajax简介 向服务器发送请求的4种方式 1.浏览器地址栏,默认get请求2.form表单: get请求 post请求3.a标签,默认get请求 4.Ajax 特点: 1 异步请求 2 局部刷新 方式 ...