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,) go func(ch chan int) {
for{
val := <-ch
fmt.Println("val:",val)
}
}(ch) tick :=time.NewTicker( * time.Second)
for i := ;i <;i++{
select {
case ch <-i:
case <-tick.C:
fmt.Println("1 Second")
}
time.Sleep( * 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 常见变成问题01的更多相关文章

  1. Golang 常见设计模式之单例模式

    之前我们已经看过了 Golang 常见设计模式中的装饰和选项模式,今天要看的是 Golang 设计模式里最简单的单例模式.单例模式的作用是确保无论对象被实例化多少次,全局都只有一个实例存在.根据这一特 ...

  2. Golang 常见设计模式之选项模式

    熟悉 Python 开发的同学都知道,Python 有默认参数的存在,使得我们在实例化一个对象的时候,可以根据需要来选择性的覆盖某些默认参数,以此来决定如何实例化对象.当一个对象有多个默认参数时,这个 ...

  3. golang 常见疑惑总结

    经常会有一些朋友问go语言的一些问题和疑惑,其实好多问题在官方文档和stackoverflow里都有详细的讲解,只要你肯花时间读一遍官方文档和Effective Go基本上都有找到答案.本文总结一下大 ...

  4. Golang常见误区(二)

    35. 关闭 HTTP 的响应体 使用 HTTP 标准库发起请求.获取响应时,即使你不从响应中读取任何数据或响应为空,都需要手动关闭响应体.新手很容易忘记手动关闭,或者写在了错误的位置: // 请求失 ...

  5. Golang gRPC微服务01: 介绍

    gRPC 是什么 gRPC是goole开源的一个RPC框架和库,支持多语言之间的通信.底层通信采用的是 HTTP2 协议.gRPC在设计上使用了 ProtoBuf 这种接口描述语言.这种IDL语言可以 ...

  6. Golang 源码解读 01、深入解析 strings.Builder、strings.Join

    strings.Builder 源码解析. 存在意义. 实现原理. 常用方法. 写入方法. 扩容方法. String() 方法. 禁止复制. 线程不安全. io.Writer 接口. 代码. stri ...

  7. Golang常见误区(一)

    1.左大括号一般不能单独一行 在其他大多数语言中,{ 的位置你自行决定.Go 比较特别,遵守分号注入规则(automatic semicolon injection):编译器会在每行代码尾部特定分隔符 ...

  8. golang常见错误

    import import unuse package: error : imported and not used: "os" := = c := 1 // error non- ...

  9. VS编译常见错误枚举01

    fatal error C1189: #error :  This file requires _WIN32_WINNT to be #defined at least to 0x0403. Valu ...

随机推荐

  1. matlab安装与使用

    Matlab安装和使用 百度网盘连接:https://pan.baidu.com/s/1aHPeAkNofCuwyYopnva4Mg 提取码:ci96 下载完成后: 将R2017b_win64_dvd ...

  2. NEST 增删改查

    /// <summary> /// HEAD /employee/employee/1 /// </summary> public void DocumentExists() ...

  3. ADO.NET 二(Connection)

    C# 语言中 Connection 类是 ADO.NET 组件连接数据库时第一个要使用的类,也是通过编程访问数据库的第一步. 接下来了解一下 Connection 类中的常用属性和方法,以及如何连接 ...

  4. 【洛谷 P2444】 [POI2000]病毒(AC自动机)

    题目链接 这么多字符串,肯定是自动机啦. 先建出AC自动机,然后怎么表示一个安全代码没有病毒代码呢? 就是存在一条路径不经过有病毒代码段结尾的节点呗. 所以呢?有环啊!dfs一下救星了. #inclu ...

  5. 深入理解JVM(五) -- 垃圾回收算法

    上篇文章我们了解到哪些内存区域和哪些对象可以被回收,这篇文章我们就来了解一下具体的垃圾回收算法的思路,不讨论具体的实现. 一 最基础算法 标记-清除(Mark-Swap) 为什么说他是最基础的算法,因 ...

  6. iOS - 静态库的导入和头文件路径的设置

    开发过程中,免不了要用到一些第三方或者是别人写好的一些Demo,这时就经常会用到别人写的一些静态库(.a文件)和n多个头文件(.h文件),这些文件不是简单地把它们拉到自己的工程里面就行的,还要设置一些 ...

  7. Qt环境搭建

    下载 qtcreator:http://download.qt.io/official_releases/qtcreator/ 编译器(mingw):http://download.qt.io/dev ...

  8. js求对象数组的交集/并集/差集/去重

    1.求交集 var arr1 = [{name:'name1',id:1},{name:'name2',id:2},{name:'name3',id:3}]; var arr1Id = [1,2,3] ...

  9. MySQL Error--存储inode用完后报设备没有空间

    问题描述:磁盘有足够剩余空间,但在创建文件或文件夹时报错,提示“设备没有空间”. 问题原因:当存储设备通过分区格式化为文件系统后,会分为两部分:1.block部分: 存储的最小单位为扇区(Sector ...

  10. ansible之基础篇(三)

    setup ansible_all_ipv4_addresses # ipv4的所有地址 ansible_all_ipv6_addresses # ipv6的所有地址 ansible_date_tim ...