golang

golang sync.Map 使用

馋奶兔 提交于 2019-11-26 03:41:28
自1.9版本以后提供了sync.Map,支持多线程并发读写,比之前的加锁map性能要好一点。 提供一下几个方法: type Map //删除指定key func (m *Map) Delete(key interface{}) //查询指定key func (m *Map) Load(key interface{}) (value interface{}, ok bool) //查询,查不到则追加 func (m *Map) LoadOrStore(key, value interface{}) (actual interface{}, loaded bool) //遍历map func (m *Map) Range(f func(key, value interface{}) bool) //添加 func (m *Map) Store(key, value interface{}) 用例: // main.go package main import ( "fmt" "sync" ) type Class struct { Students sync.Map } func handler(key, value interface{}) bool { fmt.Printf("Name :%s %s\n", key, value) return true } func main()

golang 中 sync WaitGroup使用

故事扮演 提交于 2019-11-26 03:41:11
今天写一些关于sync.WaitGroup的内容。 在golang中有两种方法可以实现同步机制 1. 无缓存的channel 2. WaitGroup WaitGroup 有3个方法: Add(), Done(), Wait() Add() 增加计算器 Done() 计算器减1 Wait() 计算器非0 一直阻塞 测试代码: func handle(data int) { fmt.Println(data) time.Sleep(time.Second * 6) fmt.Println("in handle") } func main() { var wg sync.WaitGroup wg.Add(16) for i := 0; i < 50; i++ { go func(data int) { handle(data) wg.Done() }(i) } fmt.Println("now wait.....") wg.Wait() fmt.Println("end") } 结果如下: now wait..... 49 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47

关于golang select的用法

大憨熊 提交于 2019-11-26 03:31:32
1 go的信道 1.1 什么是信道 信道可以理解为go协程之间进行通信的通道。 1.2 信道的声明 所有的信道都关联一个类型,一旦关联了类型,该信道就只能传输该类型的数据,传输其它类型的数据的话就是非法的。 chan T表示t类型的信道。 var b chan int,声明一个信道b 1.3 定义一个信道 b := make(chan int) 1.4 通过信道进行数据的发送和接收 箭头离开信道表示从信道中接收数据:data := <- b 箭头指向信道的话,就是发送数据 : b <- data 1.5 信道的发送和接收默认是阻塞的 当把数据发送给信道时,程序控制会在发送数据的语句处阻塞,直到有其它go协程从信道中读取数据才会解除阻塞。读取信道时,如果没有其它协程把数据写入该信道,读取过程也会阻塞。 2 什么是select select是用于通信的switch语句,每条case是一个信道操作,如果有数据读写,那么select会随机选择一个执行,然后退出整个select,如果没有读写,那么阻塞,或者执行default,然后退出。 也就是说,一次select执行只会执行case或者default中的一个分支。 来源: https://www.cnblogs.com/hustdc/p/11315759.html

Golang面试题解析(五)

我与影子孤独终老i 提交于 2019-11-26 02:52:40
41.执行下面的代码发生什么? package main type Param map[string]interface{} type Show struct { *Param } func main() { s := new(Show) s.Param["RMB"] = 10000 } 考点: map初始化 map需要初始化后才能使用。 编译错误:invalid operation: s.Param["RMB"] (type *Param does not support indexing) 42.执行下面的代码发生什么? package main import "fmt" type student struct { Name string } func zhoujielun(v interface{}) { switch msg := v.(type) { case *student, student: msg.Name = "qq" fmt.Print(msg) } } 考点: 类型转换 msg不属于student类型,所以没有Name字段。 改为: s := v.(student) s.Name = "qq" 43.执行下面的代码发生什么? package main import ( "encoding/json" "fmt" ) type People struct {

Golang的context包详解

▼魔方 西西 提交于 2019-11-26 02:29:33
context 包说明 说明:本文的用到的例子大部分来自context包。 概述 context 包定义了Context接口类型,它可以具有生命周期、取消/关闭的channel信号、请求域范围的健值存储功能。 因此可以用它来管理goroutine 的生命周期、或者与一个请求关联,在functions之间传递等。 每个Context应该视为只读的,通过WithCancel、WithDeadline、WithTimeout和WithValue函数可以基于现有的一个Context(称为父Context)派生出一个新的Context(称为子Context)。 其中WithCancel、WithDeadline和WithTimeout函数除了返回一个派生的Context以外,还会返回一个与之关联的CancelFunc类型的函数,用于关闭Context。 通过调用CancelFunc来关闭关联的Context时,基于该Context所派生的Context也都会被关闭,并且会将自己从父Context中移除,停止和它相关的timer。 如果不调用CancelFunc,除非该Context的父Context调用对应的CancelFunc,或者timer时间到,否则该Context和派生的Context就内存泄漏了。 可以使用go vet工具来检查所有control

Golang modules 初探

∥☆過路亽.° 提交于 2019-11-26 01:50:47
今天天色刚刚亮起,起床看到golang 1.11正式发版了,有着两个重要的特性:modules和WebAssembly。 本博文只要说的是modules,congJava转golang的同学肯定是对golang的包管理充满了无奈之情,我也曾在博客中介绍过 glide ,也介绍过 dep ,现在我们再一次升级介绍modules。 什么是modules 现在都在说modules,那么它是什么? 到文档看看 Modules, module versions, and more : A module is a collection of related Go packages. Modules are the unit of source code interchange and versioning. The go command has direct support for working with modules, including recording and resolving dependencies on other modules. Modules replace the old GOPATH-based approach to specifying which source files are used in a given build. 翻译一下:

golang 服务平滑重启小结

我的梦境 提交于 2019-11-26 01:05:53
golang 服务平滑重启小结 背景 golang 程序平滑重启框架 supervisor 出现 defunct 原因 使用 master/worker 模式 背景 在业务快速增长中,前期只是验证模式是否可行,初期忽略程序发布重启带来的暂短停机影响。当模式实验成熟之后会逐渐放量,此时我们的发布停机带来的影响就会大很多。我们整个服务都是基于云,请求流量从 四层->七层->机器。 要想实现平滑重启大致有三种方案,一种是在流量调度的入口处理,一般的做法是 ApiGateway + CD ,发布的时候自动摘除机器,等待程序处理完现有请求再做发布处理,这样的好处就是程序不需要关心如何做平滑重启。 第二种就是程序自己完成平滑重启,保证在重启的时候 listen socket FD (文件描述符) 依然可以接受请求进来,只不过切换新老进程,但是这个方案需要程序自己去完成,有些技术栈可能实现起来不是很简单,有些语言无法控制到操作系统级别,实现起来会很麻烦。 第三种方案就是完全 docker ,所有的东西交给 k8s 统一管理,我们正在小规模接入中。 golang 程序平滑重启框架 与 java、net 等基于虚拟机的语言不同, golang 天然支持系统级别的调用,平滑重启处理起来很容易。从原理上讲,基于 linux fork 子进程的方式,启动新的代码,再切换 listen socket FD

golang break语句可以break掉select,switch,for

淺唱寂寞╮ 提交于 2019-11-26 01:05:28
坑,以下例子中,原本以为close掉done channel后,循环会退出。但事实上会进入死循环 for { select { case packet := <-s.avPacketChan: s.sendPacket(packet) case <-s.done: //终止channel break } } 原因: [A "break" statement terminates execution of the innermost "for", "switch" or "select" statement. 官方文档]( https://golang.org/ref/spec#Break_statements ) BreakStmt = "break" [ Label ] . If there is a label, it must be that of an enclosing "for", "switch" or "select" statement, and that is the one whose execution terminates (§For statements, §Switch statements, §Select statements). L: for i < n { switch i { case 5: break L // 从L标签处开始执行 } }

golang学习demo2-简单socket通信-client与server

こ雲淡風輕ζ 提交于 2019-11-26 00:54:42
涉及知识 golang的socket基本编程 defer 的使用(nice) byte类型的使用 这是一个简单的golang socket应用demo 有两个程序, 分别是server和client, 功能是在client中输入字符串, 然后发送给server, server打印出来 server刚运行时阻塞监听client 然后启动某个client之后, server接受到一个连接 client中向server发送字符串 server成功接收 源代码 server.go package main // 聊天服务器 import ( "fmt" "net" // 做 socket编程需要 ) func process ( conn net . Conn ) { defer conn . Close ( ) for { buf := make ( [ ] byte , 1024 ) //fmt.Println("server waiting for client: " + conn.RemoteAddr().String()) n , err := conn . Read ( buf ) if err != nil { fmt . Println ( "server read err: " , err ) return } fmt . Println ( string ( buf [

Golang的配置信息处理框架Viper

泪湿孤枕 提交于 2019-11-25 23:21:50
Viper 项目地址: https://github.com/spf13/viper 本文翻译自该项目里README.md文件中的内容 有很多Go语言项目用到了Viper框架,比如: Hugo EMC RexRay Imgur’s Incus Nanobox/Nanopack Docker Notary BloomApi doctl Clairctl 什么是Viper Viper是一个方便Go语言应用程序处理配置信息的库。它可以处理多种格式的配置。它支持的特性: 设置默认值 从JSON、TOML、YAML、HCL和Java properties文件中读取配置数据 可以监视配置文件的变动、重新读取配置文件 从环境变量中读取配置数据 从远端配置系统中读取数据,并监视它们(比如etcd、Consul) 从命令参数中读物配置 从buffer中读取 调用函数设置配置信息 为什么要使用Viper 在构建现代应用程序时,您不必担心配置文件格式; 你可以专注于构建出色的软件。 Viper 可以做如下工作: 加载并解析JSON、TOML、YAML、HCL 或 Java properties 格式的配置文件 可以为各种配置项设置默认值 可以在命令行中指定配置项来覆盖配置值 提供了别名系统,可以不破坏现有代码来实现参数重命名 可以很容易地分辨出用户提供的命令行参数或配置文件与默认相同的区别