![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Go
文章平均质量分 50
siwluxuefeng
后知后觉
展开
-
Context学习
WithCancel实例:package mainimport ( "context" "fmt")/*Context 包定义了上下文类型,该上下文类型跨越 API 边界和进程之间传递截止期限,取消信号和其他请求范围值。对服务器的传入请求应创建一个 Context,对服务器的传出调用应接受 Context。它们之间的函数调用链必须传播 Context,可以用使用 WithCancel,WithDeadline,WithTimeout 或WithValue创建的派生上...原创 2021-04-05 22:15:29 · 460 阅读 · 0 评论 -
Go:反射之用字符串函数名调用函数
package mainimport ( "fmt" "reflect")type Animal struct {}func (m *Animal) Eat() { fmt.Println("Eat")}func main() { animal := Animal{} value := reflect.ValueOf(&animal) f := value.MethodByName("Eat") //通过反射获取它对应的函数,然后通过call来调用 f.Call(.原创 2021-03-29 23:39:06 · 3279 阅读 · 1 评论 -
Golang:控制gorountie执行顺序
3个函数分别打印dog、fish、cat,要求每个函数都要起一个goroutine,按照dog、fish、cat顺序打印在屏幕上10次。通过channel传递信号,来控制goroutine的执行顺序package mainimport ( "fmt" "sync" "sync/atomic")func main() { var wg sync.WaitGroup var dogcounter uint64 var fishcounter uint64 var catco.原创 2021-03-29 23:35:40 · 1049 阅读 · 0 评论 -
Go:流式接口 Fluent Interface
使用场景也就只能在对于同一个业务对象的不断操作下可以简化错误处理,对于多个业务对象的话,还是得需要各种if err != nil的方式。package mainimport ( "bytes" "encoding/binary" "fmt")// 长度不够,少一个Weightvar b = []byte {0x48, 0x61, 0x6f, 0x20, 0x43, 0x68, 0x65, 0x6e, 0x00, 0x00, 0x2c} var r = bytes.NewR..转载 2021-03-04 22:19:16 · 542 阅读 · 1 评论 -
Go:functional Options编程模式
强烈推荐使用Functional Options这种方式,这种方式至少带来了如下的好处:直觉式的编程 高度的可配置化 很容易维护和扩展 自文档 对于新来的人很容易上手 没有什么令人困惑的事(是nil 还是空)type Server struct { Addr string Port int Protocol string Timeout time.Duration MaxConns int TLS *tls..转载 2021-03-04 21:51:57 · 203 阅读 · 1 评论 -
Golang:init函数和全局变量执行顺序
package mainimport "fmt"var a = test()func test() int { fmt.Println("全局变量。。。") return 90}func init() { fmt.Println("init 方法。。", a)}func main() { fmt.Println("main 方法", a)}/*全局变量。。。init 方法。。 90main 方法 90*/全局变量→init方法→main方法...原创 2021-02-25 13:26:34 · 2474 阅读 · 0 评论 -
golang:channel死锁
如果子协程向channel中发送完后不关闭channel,主协程在从channel中取数据时会发生死锁package mainimport ( "fmt" "time")func main() { ch1 := make(chan int, 10) go func() { for i := 0; i < 10; i++ { ch1 <- i } }() time.Sleep(5 * time.Second) for i := 0; i < 20.原创 2021-02-24 20:08:28 · 288 阅读 · 0 评论 -
GPM模型
Golang 为并发而生Golang 从语言级别支持并发,通过轻量级协程 Goroutine 来实现程序并发运行。Goroutine 非常轻量,主要体现在以下两个方面:上下文切换代价小: Goroutine 上下文切换只涉及到三个寄存器(PC / SP / DX)的值修改;而对比线程的上下文切换则需要涉及模式切换(从用户态切换到内核态)、以及 16 个寄存器、PC、SP…等寄存器的刷新;内存占用少:线程栈空间通常是 2M,Goroutine 栈空间最小 2K;Golang 程序中可以轻松原创 2021-01-16 22:45:31 · 2247 阅读 · 0 评论 -
Golang之多路复用gorilla/mux路由介绍
一:golang自带路由介绍#golang自带路由库 http.ServerMux ,实际上是一个 map[string]Handler,是请求的url路径和该url路径对于的一个处理函数的映射关系。这个实现比较简单,有一些缺点:不支持参数设定,例如/user/:uid 这种泛型类型匹配 无法很友好的支持REST模式,无法限制访问方法(POST,GET等) 也不支持正则二:gorilla/mux路由#github地址:https://github.com/gorilla/muxhttp:转载 2021-01-16 17:42:25 · 2736 阅读 · 0 评论 -
Golang之接口型函数和http.Handler接口
一、接口型函数参考Golang必备技巧:接口型函数1.原始接口实现type Handler interface { Do(k, v interface{})}func Each(m map[interface{}]interface{}, h Handler) { if m != nil && len(m) > 0 { for k, v := range m { h.Do(k, v) }.转载 2021-01-16 17:28:02 · 487 阅读 · 0 评论 -
Golang之高并发原理
用一个简单的web服务探究golang的高并发原理 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。要做到高并发,就要做到资源合理分配,需要多少就分配多少,反之小马拉大车,拉不动,大马拉小二轮,造成资源浪费。 严格意义上说,单核的CPU是没法做到并行的,只有多核的CPU才能做到严格意义上的并行,因为一个CPU同时只能做一件事。那为什么是单核的CPU也能做到高并发。这就是操作系统...转载 2021-01-16 17:25:40 · 1213 阅读 · 0 评论 -
Go:调用crontab命令定期执行
package mainimport ( "log" "gopkg.in/robfig/cron.v2" //"github.com/robfig/cron")func main() { i := 0 c := cron.New() spec := "*/2 * * * * ?" //每2s执行一次 c.AddFunc(spec, func() { i++ log.Println("cron running:", i) }) c.Start() select {}.原创 2021-01-15 19:29:53 · 397 阅读 · 0 评论 -
Go-类型断言
原创 2021-01-11 23:44:37 · 117 阅读 · 0 评论 -
go flag示例
package mainimport ( "bytes" "flag" "fmt" "syscall")func main() { var fullpath, attr string flag.StringVar(&fullpath, "fullpath", "", "the fullpath ") flag.StringVar(&attr, "attr", "", "the attr ") flag.Parse() // getfattr -n "xtao..原创 2020-12-29 13:13:41 · 198 阅读 · 0 评论 -
Golang之interface
接口类型是由一组方法签名定义的集合。接口类型的变量可以保存任何实现了这些方法的值。注意:示例代码的 22 行存在一个错误。由于Abs方法只为*Vertex(指针类型)定义,因此Vertex(值类型)并未实现Abser。package mainimport ( "fmt" "math")type Abser interface { Abs() float64}func main() { var a Abser f := MyFloat(-math.Sqr...转载 2020-12-08 19:45:35 · 181 阅读 · 0 评论 -
Go-自定义Error
package commonimport ( "fmt")type ErrCode stringvar ( //common api err message SUCCESS ErrCode = "0" DB_UNKNOW_ERR ErrCode = "1001")var errCodeName = map[ErrCode]string{ SUCCESS: "Success return", DB_UNKNOW_ERR: "Db unknow erro.原创 2020-05-20 18:34:34 · 694 阅读 · 0 评论 -
golang:监听信号量
package mainimport ( "log" "os" "os/signal" "syscall" "time")func main() { // 监听退出信号 shutdown := make(chan os.Signal, 1) signal.Notify(shutdown, syscall.SIGTERM, syscall.SIGINT, syscall....原创 2020-04-30 17:36:41 · 880 阅读 · 0 评论 -
Golang 接口型函数和http.Handler接口
一、接口型函数参考Golang必备技巧:接口型函数1.原始接口实现type Handler interface { Do(k, v interface{})}func Each(m map[interface{}]interface{}, h Handler) { if m != nil && len(m) > 0 { fo...转载 2020-04-13 19:30:50 · 405 阅读 · 0 评论 -
Golang高并发原理
软件的处理能力不仅仅跟内存有关,还有是否阻塞,是否异步处理,CPU等等。那么是不是可以有一种语言使用更小的处理单元,占用内存比线程更小,那么它的并发处理能力就可以更高。所以Google就做了这件事,就有了golang语言,golang从语言层面就支持了高并发。go的高并发处理核心 - goroutinegoroutine是Go并行设计的核心。goroutine说到底其实就是协程,它比线程更...转载 2020-04-12 19:08:01 · 554 阅读 · 0 评论 -
Golang之sync.Map 并发安全的map
Go 语言自带的字典类型map并不是并发安全的。Go 1.9 中,正式加入了并发安全的字典类型sync.Map。这个字典类型提供了一些常用的键值存取操作方法,并保证了这些操作的并发安全。同时,它的存、取、删等操作都可以基本保证在常数时间内执行完毕。换句话说,它们的算法复杂度与map类型一样都是O(1)的。在有些时候,与单纯使用原生map和互斥锁的方案相比,使用sync.Ma...原创 2020-04-12 18:15:29 · 446 阅读 · 0 评论 -
Golang之sync.Pool
我们通常用golang来构建高并发场景下的应用,但是由于golang内建的GC机制会影响应用的性能,为了减少GC,golang提供了对象重用的机制,也就是sync.Pool对象池。 sync.Pool是可伸缩的,并发安全的。其大小仅受限于内存的大小,可以被看作是一个存放可重用对象的值的容器。 设计的目的是存放已经分配的但是暂时不用的对象,在需要用到的时候直接从pool中取。任何存放区其中的值可...转载 2020-04-12 17:44:33 · 136 阅读 · 0 评论 -
Go之sync.Once
作用:sync.Once能确保实例化对象Do方法在多线程环境只运行一次,内部通过互斥锁实现。比如,某个操作只需要做一次,在多个goroutine同时操作的时候,保证只操作一次,不会重复操作。sync.Once表示只执行一次函数。要做到这点,就需要两点:(1)计数器,统计函数执行次数;(2)线程安全,保障在多G情况下,函数仍然只执行一次,比如锁。示例1:一个线程安全的单例模式...原创 2020-04-12 17:17:52 · 133 阅读 · 0 评论 -
Go之sync.WaitGroup
作用:等待主协程中创建的协程执行完毕之后再结束主协程Go提供了sync.WaitGroup。WaitGroup顾名思义,就是用来等待一组操作完成的。WaitGroup内部实现了一个计数器,用来记录未完成的操作个数,它提供了三个方法,Add()用来添加计数。Done()用来在操作结束时调用,使计数减一。Wait()用来等待所有的操作结束,即计数变为0,该函数会在计数不为0时等待,在计数为0时...原创 2020-04-12 17:08:50 · 291 阅读 · 0 评论 -
Go之sync.Cond
sync.Cond条件变量是基于互斥锁的,条件变量并不是被用来保护临界区和共享资源的,它是用于协调想要访问共享资源的那些线程的。当共享资源的状态发生变化时,它可以被用来通知被互斥锁阻塞的线程。条件变量的初始化离不开互斥锁,并且它的方法有的也是基于互斥锁的。条件变量提供的方法有三个:等待通知(wait)、在互斥锁下进行;单发通知(signal)、在互斥锁解锁后进行;广播通知(...原创 2020-04-12 16:59:38 · 291 阅读 · 1 评论 -
golang之sync.Mutex笔记
sync.Mutex互斥量(mutual exclusio,简称 mutex)。sync包中的Mutex就是与其对应的类型,该类型的值可以被称为互斥量或者互斥锁。一个互斥锁可以被用来保护一个临界区或者一组相关临界区。我们可以通过它来保证,在同一时刻只有一个 goroutine 处于该临界区之内。为了兑现这个保证,每当有 goroutine想进入临界区时,都需要先对它进行锁定,并且,每个...原创 2020-04-12 16:17:21 · 332 阅读 · 0 评论 -
golang 防止主goroutine退出的方法
通过系统signal信号的方式防止groutine退出package mainimport ( "runtime" "sync" "os" "os/signal" "syscall" "fmt")func main() { runtime.GOMAXPROCS(runtime.NumCPU()) wg := &...转载 2020-02-26 13:11:44 · 731 阅读 · 0 评论 -
Go之读取已有的缓存chan数据
有一个并发的 Go 协程来向chan写入数据,而 Go 主协程负责读取(接收)数据。Go 主协程中创建了容量为 100 的chan队列 ch,而第 25行把 ch 传递给了 write 协程。接下来 Go 主协程休眠了0.2秒。在这期间,write 协程在并发地运行。write 协程有一个 for 循环,依次向chan队列 ch 写入 0~47。而缓冲chan的容量为 100,如果写满10...原创 2020-02-25 15:03:16 · 1878 阅读 · 0 评论 -
chan与select的使用及多个chan的并行处理
select语句是一种仅能用于通道发送和接收操作的专用语句一条select语句的执行,会选择其中某一个分支执行。select语句与switch语句类型,但选择分支的方法不同。每个分支以关键字case开始。每个case后只能是针对某个通道的发送语句或接收语句。select右边直接跟左花括号。select语句是一种仅能用于通道发送和接收操作的专用语句一条select语句的执行...原创 2020-02-13 16:30:11 · 2309 阅读 · 1 评论 -
chan队列之发送方等待接收方处理结果
从一个nil通道中接收元素,当前goroutine会阻塞向一个nil通道中发送元素,当前gotoutine也会阻塞向一个已关闭的通道中发送元素,会引发一个运行时panic,即使发送操作因通道已满而阻塞。多个goroutine向同一个已满的通道发送元素阻塞时,当通道有空余空间时,最早被阻塞的goroutine会最先被唤醒。多个goroutine从同一个空的通道接收元素阻塞时,当...原创 2020-02-10 10:54:59 · 309 阅读 · 0 评论 -
golang 字节序
golang 字节序简述最近看TCP通信发现字节序,对此不太了解,故记录下来。所谓字节序就是字符顺序。在查看资料常用的有2类排序方式: Big-Endian 高位字节放在内存的低地址端,低位字节放在内存的高地址端。 Little-Endian 低位字节放在内存的低地址段,高位字节放在内存的高地址端。 例如十进制数255用二进制表示为1111 1111,十...转载 2019-11-25 15:58:36 · 479 阅读 · 0 评论 -
Go-理解go func背后发生了什么
理解go func背后发生了什么看一段代码func main() { wg := sync.WaitGroup{} wg.Add(20) for i := 0; i < 10; i++ { go func() { fmt.Println("A: ", i) wg.Done() }...转载 2019-11-25 15:34:28 · 369 阅读 · 0 评论 -
Go学习笔记-链表
Go 语言的链表实现在其标准库的container/list代码包中。这个包包含了两个公开的程序实体:List和Element.前者实现了一个双向链表(以下简称链表),而后者则代表了链表中元素的结构。结构体类型的零值,都会拥有其特定结构,但没有初始化内容的缺省值。var a [2]int : 包含了两个0的整数数组;var s []int : 一个 []int类型的、值为nil的...原创 2018-10-19 12:01:30 · 159 阅读 · 0 评论 -
Go学习笔记-数组和切片
数组类型的值(以下简称数组)的长度是固定的,而切片类型的值(以下简称切片)是可变长的。数组的长度在声明它的时候就必须给定,并且在之后不会再改变。可以说,数组的长度是其类型的一部分。Go 语言的切片类型属于引用类型,同属引用类型的还有后面会讲到的字典类型、通道类型、函数类型等;而 Go 语言的数组类型则属于值类型,同属值类型的有基础数据类型以及结构体类型。Go 语言中,我们判断所谓的“传值...原创 2018-10-15 22:29:58 · 178 阅读 · 0 评论 -
Go学习笔记-程序实体(下)
类型断言表达式的语法形式是x.(T)。其中的x代表要被判断类型的那个值。这个值当下的类型必须是接口类型的,不过具体是哪接口类型其实是无所谓的。 所以,当这里的container变量类型不是任何的接口类型时,我们就需要先把它转成某个接口类型的值。 如果container是某个接口类型的,那么这个类型断言表达式就可以是container.([]string)。interface{}代表空接口,任何...原创 2018-10-12 21:03:27 · 143 阅读 · 0 评论 -
Go学习笔记-程序实体(中)
变量重复声明和变量重名不是一个事情,上篇讲的是前者,这一篇讲后者。变量重名按照作用域进行屏蔽,查找过程从小作用域查到大作用域。作用域最大的用处,就是对程序实体的访问权限的控制。package mainimport "fmt"var block = "package"func main() { fmt.Printf("The block is %s.\n", block)//...原创 2018-10-11 18:19:52 · 142 阅读 · 0 评论 -
Go学习笔记-程序实体(上)
变量的类型可以是预定义的类型,也可以是程序自定义的函数、结构体或接口。常量的合法类型只能是Go语言预定义的基本类型。基本类型: 类型的声明方式:var声明 与 短变量(1)var name string //var name string = "hehe"(2)name := "hehe" //用来了go的类型推断 ,编译器自动推断表达式第一种方式更通用,可用在任何...原创 2018-10-11 18:17:32 · 164 阅读 · 0 评论 -
Go学习笔记-库源码文件
程序实体是什么?在 Go 语言中,它是变量、常量、函数、结构体和接口的统称。程序实体的名字被统称为标识符。标识符可以是任何 Unicode 编码可以表示的字母字符、数字以及下划线“_”,但是其首字母不能是数字。 代码包声明的基本规则总结:1.同目录下的源码文件的代码包声明语句要一致。也就是说,它们要同属于一个代码包。这对于所有源码文件都是适用的。否则会报如下错误:D:\go\s...原创 2018-10-11 18:04:24 · 496 阅读 · 0 评论 -
Go学习笔记-命令源码文件
源码文件又分为三种,即:命令源码文件、库源码文件和测试源码文件,它们都有着不同的用途和编写规则。命令源码文件是程序的运行入口,是每个可独立运行的程序必须拥有的。我们可以通过构建或安装生成与其对应的可执行文件,后者一般会与该命令源码文件的直接父目录同名。如果一个源码文件声明属于main包,并且包含一个无参数声明且无结果声明的main函数,那么就是命令源码文件。如果有与命令源码文件同包的源...原创 2018-10-11 13:38:08 · 142 阅读 · 0 评论 -
Go学习笔记-map
Go 语言的字典类型其实是一个哈希表(hash table)的特定实现。在这个实现中,键和元素的最大不同在于,前者的类型是受限的,不可以是函数类型、字典类型和切片类型(因为不支持 == 和 != 判等操作 ),而后者却可以是任意类型的。键和元素的这种对应关系在数学里就被称为“映射”,这也是“map”这个词的本意,哈希表的映射过程就存在于对键 - 元素对的增、删、改、查的操作之中aMap...原创 2018-10-19 12:54:01 · 179 阅读 · 0 评论 -
Go学习笔记-通道基本操作
通道(channel)完全可以与 goroutine(也可称go程)并驾齐驱。通道类型的值本身是并发安全的,且使用十分方便。声明:1.第一个参数代表通道的具体类型的类型字面量;确定通道类型的元素类型;chan int :元素类型为int的通道类型;chan string:元素类型为string的通道类型;2.第二个参数可选,一个int类型的数值且大于0,表示通道的容量(...原创 2018-11-22 20:44:40 · 578 阅读 · 0 评论