您的位置:首页 > 编程语言 > Go语言

GO语言学习笔记(三)

2014-04-23 13:50 435 查看
在一个函数调用前加上关键字go,这次调用就会在一个新的goroutine(轻量级线程,协程)中执行,当被调用函数返回时,这个goroutine也就结束了,如果这个函数有返回值,那么这个返回值将被丢弃
go语言中的锁机制和channel
package main

import (
"fmt"
"sync"
"runtime"
)

var counter int = 0

func Count(lock *sync.Mutex) {
lock.Lock()
counter ++
fmt.Println(counter)
lock.Unlock()
}

func main() {
lock := &sync.Mutex{}
for i := 0; i < 10; i ++ {
go Count(lock)
}
for {
lock.Lock()
c := counter
lock.Unlock()
runtime.Gosched()
if c >= 10 {
break
}
}

}

package main
import (
"fmt"
)

func Count(ch chan int) {
fmt.Println("Counting")
ch <- 1
}

func main() {
chs := make([]chan int, 10)
for i := 0; i < 10;i ++ {
chs[i] = make(chan int)
go Count(chs[i])
}
for _, ch := range(chs) {
<-ch
}
}

channel声明方法
var ch chan int
声明一个map,元素是bool型的channel:
var m map[string] chan bool

向channel中写入数据
ch <- val

从channel中读出数据
val := <- ch

select用法
select {
case <-chan1:
// 如果chan1成功读到数据,则进行该case处理语句
case chan2 <- 1:
// 如果成功向chan2写入数据,则进行该case处理语句
default:
// 如果上面都没有成功,则进入default处理流程
}

关闭通道,判断通道是否关闭
关闭通道,直接使用Go内置的close(ch)
判断通道是否关闭,使用多重返回值方式
x, ok := <- ch

runtime.Gosched()方法用于出让时间片,runtime.NumCPU()用于获得cpu核心数,runtime.GOMAXPROCS(16)设置routine使用多少个CPU核心
全局唯一性操作sync.Once.Do(func)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  GO