golang学习
cyb_17302190874
这个作者很懒,什么都没留下…
展开
-
golang学习之--利用channel实现火车站多窗口买票问题【解决超卖】
eg:火车站有四个卖票窗口,一共有10000张票,现在设计一个方案实现自动售票,并且不发生超卖现象。func main() { nums := 10000 //预置票量 incs := make(chan int, nums) for i:= nums ; i > 0; i-- {//利用channel保证原子性库存操作 incs <- i } for j:= 1; j <=4; j++ {//开启四个协程 go func () { for {原创 2020-10-28 14:21:06 · 841 阅读 · 1 评论 -
golang学习之--select--case 原理【转载】
Go 的select语句是一种仅能用于channl发送和接收消息的专用语句,此语句运行期间是阻塞的;当select中没有case语句的时候,会阻塞当前的groutine。所以,有人也会说select是用来阻塞监听goroutine的。还有人说:select是Golang在语言层面提供的I/O多路复用的机制,其专门用来检测多个channel是否准备完毕:可读或可写。以上说法都正确。I/O多路复用我们来回顾一下是什么是I/O多路复用。普通多线程(或进程)I/Oimage每来一个进程转载 2020-08-26 17:52:13 · 1731 阅读 · 0 评论 -
golang学习之--限制程序中协程执行的数量上限【转载】
package mainimport ( "fmt" "strconv" "time")var ( maxRoutineNum = 10)// 模拟下载页面的方法func download(url string, ch chan int) { fmt.Println("download from ", url) // 休眠两秒模拟下载页面 time.Sleep(2 * 1e9) // 下载完成则从ch推出数据 <...转载 2020-08-26 17:40:09 · 832 阅读 · 0 评论 -
golang学习之--context实现原理【转载】
概述 context是Go中广泛使用的程序包,由Google官方开发,在1.7版本引入。它用来简化在多个go routine传递上下文数据、(手动/超时)中止routine树等操作,比如,官方http包使用context传递请求的上下文数据,gRpc使用context来终止某个请求产生的routine树。每个Context应该视为只读的,通过WithCancel、WithDeadline、WithTimeout和WithValue函数可以基于现有的一个Context(称为父Context)派生出一..转载 2020-08-26 14:56:56 · 418 阅读 · 1 评论 -
golang 学习之select原理【转载】
写在最前面select为golang提供了多路IO复用机制,和其他IO复用一样,用于检测是否有读写事件是否ready。本文将介绍一下golang的select的用法和实现原理。实现原理golang实现select的时候,实际上为每一个case语句定义了一个数据结构,select语句块执行的时候,实际上可以类比成对一个case数组处理的代码块(或者函数),然后程序流程转到选中的case块。case数据结构源码包src/runtime/select.go:scase定义了表示case语句转载 2020-08-19 17:08:40 · 150 阅读 · 0 评论 -
golang学习之--strings包关于字符串查找方法总结【转载】
1)func Contains(s, substr string) bool这个函数是查找某个字符是否在这个字符串中存在,存在返回true示例如下:import ( "fmt" "strings")func main() { fmt.Println(strings.Contains("widuu", "wi")) //true fmt.Println(strings.Contains("wi", "widuu")) //false}2)func ContainsAny(s转载 2020-07-09 21:00:44 · 2342 阅读 · 0 评论 -
【GoLang】深入理解slice len cap什么算法? 参数传递有啥蹊跷?【转载】
先上结论1、内置append函数在现有数组的长度 < 1024 时 cap 增长是翻倍的,再往上的增长率则是 1.25,至于为何后面会说。2、Go语言中channel,slice,map这三种类型的实现机制类似指针,所以可以直接传递,而不用取地址后传递指针。(注:若函数需改变slice的长度,则仍需要取地址传递指针)3、在函数内用append时,append会自动以倍增的方式扩展slice_2的容量,但是扩展也仅仅是函数内slice_2的长度和容量,slice_1的长度和容量是没变的,所转载 2020-06-08 17:25:56 · 313 阅读 · 0 评论 -
Linux中用 grep查找特定进程,屏蔽grep进程本身(也就是不出现grep --color=auto)【转载】
日常操作linux 中,通常在使用 ps命令后 用管道连接 查询特定进程会显示grep进程本身。如下:1 [root@ecs-linux-byx ~]# ps -ef|grep gs42 root 6284 5879 0 14:30 pts/0 00:00:00 grep --color=auto gs41 [root@ecs-linux-byx gs4]# ps axu |grep gs42 root 2480 0.0 0.0 112728 97.转载 2020-06-04 10:48:58 · 12074 阅读 · 0 评论 -
git push到远程仓库的时候遇到non-fast-forward的问题【转载】
名为的manage项目操作过程1、在manage文件夹里打开git,输入git init初始化本地仓库,GitHub创建远程仓库manage2、以下命令关联本地和远程仓库,*****为我的用户名git remote add origin git@github.com:******/manage.git3、本地已经有项目代码了在add和commit之后,想要push到远程仓库git push origin master此时报错:! [rejected] master...转载 2020-06-03 23:01:33 · 243 阅读 · 0 评论 -
golang学习之map排序方法
实际操作中遇到map无法排序问题,借鉴前辈的方案(亲测可行)注意:Golang中的map默认是无序的,每次遍历,得到的输出结果可能不一样。Golang中的map排序:将map的key放到切片中; 对切片排序; 遍历切片,然后来按key来输出map的值。package mainimport ( "sort" "fmt")func main() { lockTest()}func lockTest() { map1 := make(map[string]int) m转载 2020-06-03 17:51:09 · 1533 阅读 · 1 评论 -
golang学习之Go语言垃圾回收和SetFinalizer【转载】
Go语言自带垃圾回收机制(GC)。GC 通过独立的进程执行,它会搜索不再使用的变量,并将其释放。需要注意的是,GC 在运行时会占用机器资源。GC 是自动进行的,如果要手动进行 GC,可以使用 runtime.GC() 函数,显式的执行 GC。显式的进行 GC 只在某些特殊的情况下才有用,比如当内存资源不足时调用 runtime.GC() ,这样会立即释放一大片内存,但是会造成程序短时间的性能下降...转载 2020-05-01 21:48:52 · 450 阅读 · 0 评论 -
golang学习之new()、make() 区别
make 函数只用于 map,slice 和 channel,并且不返回指针。如果想要获得一个显式的指针,可以使用 new 函数进行分配,或者显式地使用一个变量的地址。Go语言中的 new 和 make 主要区别如下: make 只能用来分配及初始化类型为 slice、map、chan 的数据。new 可以分配任意类型的数据; new 分配返回的是指针,即类型 *Type。make ...原创 2020-05-01 21:28:36 · 170 阅读 · 0 评论 -
golang 学习之----异常捕获Recover 使用
Recover 是一个Go语言的内建函数,可以让进入宕机流程中的 goroutine 恢复过来,recover 仅在延迟函数 defer 中有效,在正常的执行过程中,调用 recover 会返回 nil 并且没有其他任何效果,如果当前的 goroutine 陷入恐慌,调用 recover 可以捕获到 panic 的输入值,并且恢复正常的执行。通常来说,不应该对进入 panic 宕机的程序做任何处...转载 2020-04-30 11:06:54 · 700 阅读 · 0 评论 -
golang中range用法以及需要注意点【转载】
一、用法:1、range类似迭代器,可以遍历数组,字符串,map等等,对象的不同,返回的结果也不同。package mainimport "fmt"func main(){ //数组的遍历 a := [3]int {1, 2, 3} for i, n := range a{ fmt.Println(i, n) } //切片...转载 2020-04-27 11:33:42 · 761 阅读 · 0 评论