golang 常见变成问题01
Golang 常见 01 变成 问题
2023-09-27 14:26:53 时间
Golang常见编程问题
--语言简单
func CopyFile (dst, src string) (w int64, err error) { srcFile, err := os.Open (src) defer srcFile.Close () if err != nil { return } //using srcFile to do sth return }
- 函数可以返回多个值
- 推荐将 error 作为最后一一个返回值
- Defer , 常用用来做资源清理、记录执行行时间等
--go range
values := []string{"a", "b", "c"} for _, v := range values { go func() { fmt.Println(v) }() }
--goroutine 通信
- 消息机制基于通信来共享。
- go中goroutine之间是通chan通讯的,chan的处理了不少用到select
- 当多个receiver channel都处于就绪状态时,激活的channel是随机的。
package main import ( "fmt" "runtime" "time" ) func main() { runtime.GOMAXPROCS(runtime.NumCPU()) ch := make(chan int,1024) go func(ch chan int) { for{ val := <-ch fmt.Println("val:",val) } }(ch) tick :=time.NewTicker(1 * time.Second) for i := 0;i <30;i++{ select { case ch <-i: case <-tick.C: fmt.Println("1 Second") } time.Sleep(200 * time.Millisecond) } close(ch) tick.Stop() } //val: 0 //val: 1 //val: 2 //val: 3 //val: 4 //val: 5 //val: 6 //1 Second //val: 8 //val: 9 //1 Second //val: 11 //val: 12 //val: 13 //val: 14 //1 Second //val: 16 //val: 17 //val: 18 //val: 19 //val: 20 //val: 21 //val: 22 //val: 23 //val: 24 //1 Second //val: 26 //val: 27 //val: 28 //val: 29
往 chan 中放数据时,如果缓冲区已经满那么将 block
以下方方式可以试探往 chan 放数据
func putSignal(ch chan struct{}, sign struct{}) (ok bool) { select { case ch <- sign: ok = true default:// 省略了会 block } } return
cpu 消耗问题
select 滥用用引发
相关文章
- golang操作mysql 报错:invalid memory address or nil pointer dereference
- golang rabbitmq 的学习
- golang 使用pprof进行性能调优
- Golang:go-cache基于内存的键值存储缓存库
- golang 中 channel 的详细使用、使用注意事项及死锁分析
- 【编程实践】Golang 获取HTTP请求的IP地址
- Vim打造成GoLang开发环境
- Golang使用有缓冲channel实现协程池限制最大协程数量
- golang 详解defer
- Golang 之协程详解
- [Golang] 初探之 sync.Once
- Golang select
- golang:reflect反射
- LeetCode-35. 搜索插入位置(Golang实现)
- golang语言cli库/Golang的CLI 命令行程序开发
- golang学习二:流程控制, 顺序,选择, 循环