go语言
Maybe_ch
从0开始
展开
-
通道阻塞的几种场景
func main() { // 示例1。 ch1 := make(chan int, 1) ch1 <- 1 //ch1 <- 2 // 通道已满,因此这里会造成阻塞。 // 示例2。 ch2 := make(chan int, 1) //elem, ok := <-ch2 // 通道已空,因此这里会造成阻塞。 //_, _ = elem, ok ch2 <- 1 // 示例3。 var原创 2020-11-14 23:13:17 · 579 阅读 · 0 评论 -
【Golang】命令源码文件
用途命令源码文件是程序的运行入口,是每个可独立运行的程序必须拥有的。我们可以通过构建或安装,生成与其对应的可执行文件,后者一般会与该命令源码文件的直接父目录同名。如果一个源码文件声明属于main包,并且包含一个无参数声明且无结果声明的main函数,那么它就是命令源码文件。package mainimport "fmt"func main() {fmt.Println("Hello, world!")}当需要模块化编程时,我们往往会将代码拆分到多个文件,甚至拆分到不同的代码包中。但无论怎原创 2020-11-12 13:11:54 · 303 阅读 · 0 评论 -
【Golang】GOOROOT/GOPATH/GOBIN
GOROOT用途Go语言安装根目录的,也就是GO语言的安装路径GOBIN用途GO程序生成的可执行文件的路径GOPATH用途若干工作区目录的路径,是我们自己定义的工作空间Go 语言的源码文件都需要被存放在环境变量 GOPATH 包含的某个工作区(目录)中的 src 目录下的某个代码包(目录)中。Q安装后的结果文件都会放到哪里呢?安装后如果产生了归档文件(以“.a”为扩展名的文件),就会放进该工作区的 pkg子目录如果产生了可执行文件,就可能会放进该工作区的 bin 子目录。某原创 2020-11-11 22:38:02 · 9186 阅读 · 0 评论 -
【Golang】beego连接数据库报错
问题执行连接数据库时报错解决通过追踪断点发现在连接数据库时会查询数据库引擎,通过SQLSELECT ENGINE, TRANSACTIONS FROM information_schema.engines WHERE SUPPORT = 'DEFAULT'而我用了5.0版本的mysql,库中没有这个表,最终更换5.7版本刚了挺久记录一下。...原创 2020-11-11 00:09:01 · 321 阅读 · 0 评论 -
【Golang】sync.NewCond条件等待用法
条件等待和互斥锁有不同,互斥锁是不同协程公用一个锁,条件等待是不同协程各用一个锁,但是wait()方法调用会等待(阻塞),直到有信号发过来,不同协程是共用信号。可以看如下的代码来理解func main() { wg := sync.WaitGroup{} cond := sync.NewCond(new(sync.Mutex)) for i:=0 ; i<3 ;i++{ go func(i int) { wg.Add(1) fmt.Println("协程启动") co原创 2020-06-30 08:30:35 · 859 阅读 · 1 评论 -
【Golang】sync.Once的使用
单次执行Once的作用是多次调用但只执行一次,Once只有一个方法,Once.Do(),向Do传入一个函数,这个函数在第一次执行Once.Do()的时候会被调用以后再执行Once.Do()将没有任何动作,即使传入了其他的函数,也不会被执行,如果要执行其它函数,需要重新创建一个Once对象。Once可以安全的再多个协程中并行使用,是协程安全的。// 多次调用仅执行一次指定的函数f func (o *Once) Do(f func())代码测试我们写一段代码来测试一下sync.Once的原创 2020-06-29 18:28:51 · 431 阅读 · 0 评论 -
【Golang】Sync.WaitGroup的使用
示例这里我们直接来用代码进行讲解,以下面的代码为例我们需要等待协程结束后查询count的,所以最后在末尾处使用了睡眠time.Sleep(time.Second* 2) ,目前的是一个简单的业务逻辑我们可以使用睡眠来等待,但是如果遇到业务复杂的情况,时间是无法进行预料的,这样的方法就不能使用了,func main(){ count := 0 for i:=0 ;i<10000;i++{ go func() { //数据处理 count++ }() } time.Slee原创 2020-06-29 09:27:49 · 517 阅读 · 0 评论 -
【Golang】Sync.Mutex应该怎么用?
示例通过如下的代码,我想通过开多个协程使得count累加10000次,值最终应该是10000,可是执行如下的代码发现值不等于10000,都是小于10000的值func main(){ count := 0 for i:=0 ;i<10000;i++{ go func() { count++ }() } time.Sleep(time.Second* 2) fmt.Println(count)}结果分析原因造成该问题的原因是协程在读count值时,假设有a、b两原创 2020-06-29 09:09:37 · 497 阅读 · 0 评论 -
golang枚举
golang枚举普通枚举类型直接给常量赋值func main(){ enums()}func enums(){ const( java = 1 cpp = 2 c = 3 python = 4 golang = 5 ) fmt.Println(java,cp...原创 2018-03-06 10:58:10 · 2329 阅读 · 0 评论 -
go语言-defer关键字
example1func f() (result int) { defer func() { result++ }() return 0}example2func f() (r int) { t := 5 defer func() { t = t + 5 }() return t}example3fun原创 2017-12-19 11:44:18 · 369 阅读 · 0 评论 -
go语言-生成随机数
package mainimport ( "fmt" "math/rand" "time")func main(){ r:=rand.New(rand.NewSource(time.Now().UnixNano())) for i:=0;i<=10;i++{ fmt.Println(r.Intn(10)) }}原创 2017-12-19 10:07:39 · 599 阅读 · 0 评论