galang开发
月亮+六便士
本人从事C++嵌入式应用软件开发,做流媒体相关工作,后端开发
展开
-
golang 获取token方法
golang 获取token原创 2023-03-02 19:00:04 · 1019 阅读 · 0 评论 -
深入理解Golang 中的Context包
深入理解Golang 中的Context包原创 2023-02-24 10:28:39 · 464 阅读 · 0 评论 -
GoLang 协程池
GoLang 协程池原创 2023-02-23 11:17:57 · 668 阅读 · 0 评论 -
Golang 实现定时任务
Golang 实现定时任务原创 2023-02-20 16:32:52 · 2115 阅读 · 0 评论 -
golang设置弹窗提示
前言golang 以加载windows系统动态库的方式代码package mainimport ( "syscall" "time" "unsafe")func IntPtr(n int) uintptr { return uintptr(n)}func StrPtr(s string) uintptr { return uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(..原创 2021-06-17 16:30:26 · 2443 阅读 · 0 评论 -
Golang 在windows平台使用zmq方法介绍
1、背景 zmq官方推荐的golang库,github地址是http://github.com/pebbe/zmq4。上面有地址具体的实例。2、编译1、前几天遇到一个在windows10 上 64位 系统环境下 go get github.com\pebbe\zmq4的时候无法完成,最开始可能提示socket未定义。查看这个包的代码可以发现这套库使用了cgo。这个需要gcc等一些环境支持了。这时需要安装mingw,注意系统是32还是64的,一定要安装对应的版本,否则无法编译成功。2...原创 2021-06-16 09:28:15 · 1391 阅读 · 0 评论 -
golang中cannot refer to unexported field or method handle
在golang中编写了个特定包,该包的某个函数试图让外部引用。结果,在外部引用中,该函数发生错误:cannot refer to unexported name。比较奇怪的是,其他函数可以被引用。后来发现一个golang的语法:模块中要导出的函数,必须首字母大写。PS:1)C语言外部引用的函数,没有这个限制; 2)C语言会有extern C或者extern说明,但golang的首字母大写才能导出的语法,显然是golang语言的特性,值得学习...原创 2021-03-31 10:24:21 · 1377 阅读 · 0 评论 -
golang超时请求设置
package mainimport ( "fmt" "time")func main() { timeout := time.After(time.Second * 10) finish := make(chan bool) count := 1 go func() { for { select { case <-timeout: fmt.Println("timeout") finish.原创 2021-03-20 14:46:02 · 447 阅读 · 0 评论 -
golang查找100个素数
package mainimport ( "fmt")//返回生成自然数序列func GenerateNatural() chan int { ch := make(chan int) go func() { for i := 2; ; i++ { ch <- i } }() return ch}//通过过滤器,删除被素数整除的数func PrimerFiter(in &l...原创 2021-02-22 09:31:31 · 204 阅读 · 0 评论 -
golang 单链表实现
//单链表实现/************************1.判断是否为空的单链表2.单链表的长度3.从头部添加元素4.送尾部添加元素5.在指定位置添加元素6.删除指定元素7.删除指定位置元素8.查看是否包含某个元素9.遍历所有元素*************************/type Object interface{}type Node struct { Data Object //定义数据域 Nex.原创 2021-02-03 19:31:28 · 330 阅读 · 0 评论 -
Golang Context包详解
Golang Context包详解引言:在Go语言编写服务器程序中,服务器通常要为每个 HTTP 请求创建一个 goroutine 以并发地处理业务。同时,这个 goroutine 也可能会创建更多的 goroutine 来访问数据库或者 RPC 服务。当这个请求超时或者被终止的时候,需要优雅地退出所有衍生的 goroutine,并释放资源。因此,我们需要一种机制来通知衍生 goroutine 请求已被取消。 比如以下例子,sleepRandom_1的结束就无法通知到sleepRandom_...原创 2021-01-28 23:21:56 · 862 阅读 · 0 评论 -
GoLang中的反射
原创 2021-01-28 11:31:12 · 107 阅读 · 0 评论 -
Golang 结构体转json
package mainimport ( "encoding/json" "fmt")type Example struct { Item struct { Title string `json:"title"` Properties []struct { Num int `json:"num"` Name string `json:"name"` ...原创 2021-01-27 20:34:28 · 393 阅读 · 1 评论 -
golang 管道
管道可以分为两个方向,一个读,一个写。假如一个函数的输入和输出参数都是相同的chan类型,则该函数可以调用自己。当然多个具有相同参数类型的函数也能组成一个调用链,这个很像unix系统的管道,是一个有类型的管道。func chain(in chan int) chan int {out := make(chan int)go func() {for v := range in {...原创 2021-01-21 22:59:30 · 247 阅读 · 0 评论 -
多个goroutine增强型生成器
package mainimport ( "fmt" "math/rand" //"runtime")//GenterateIntA是一个随机数生成器func GenerateIntA() chan int { ch := make(chan int, 10) go func() { for { ch <- rand.Int() } }() return ch}func Gen...原创 2021-01-20 22:16:00 · 87 阅读 · 0 评论 -
golang select
select是类UNIX系统提供的一个多路复用系统API,Go语言借用多路复用的概念,提供select关键字,用于多路监听多个通道。当监听的通道没有状态可读或者可写的,select是阻塞的,只要监听的通道中有一个状态是可读或者可写的,则select就不会阻塞,而是进入处理就绪通道的分支流程。如果监听的状态有多个可读或者可写的状态,则select则随机选取一个处理。实例如下:package mainimport "fmt"func main() { ch := ma..原创 2021-01-19 22:40:53 · 95 阅读 · 0 评论 -
Golang内存对齐方式
Go语言是如何进行内存对齐的?type T struct { a bool b int8 c uint16 d uint32 e int64 f bool}类型尺寸go白皮书只对以下类型占用的内存大小进行了明确规定.uint和int类型的大小取决于编译器和系统架构,通常32位架构为4字节,64位架构为8字节uintptr 取决于编译器实现,但必须保证一定能够存下任一个内存地址.除了上述明确规定的,白皮书没有对其他种类的...原创 2021-01-18 10:52:00 · 544 阅读 · 0 评论 -
Golang 内存泄漏问题和处理方法
1、给系统打压力,内存占用量增大,但停止打压后内存不能降低,则可能有内存泄漏。2、top不能实时反映程序占用内存,因Go向系统申请内存不能使用后,并不立即归还系统。3、程序占用系统内存、Go的堆内存;从系统的内存会在go的内存池管理,整块的内存页,长时间不被访问并满足一定条件后,才归还给操作系统。又因为有GC,堆内存也不能代表内存占用,清理过之后剩下的,才是实际使用的内存。4、调用runtime.ReadMemStats可以看到Go的内存使用信息。5、使用go tool pprof -inu原创 2021-01-18 10:36:01 · 2599 阅读 · 0 评论 -
切片传递与指针传递的区别
疑问:切片底层不就是指针指向底层数组数据吗,为何不直接传递切片,两者有什么区别?在源码log包中,Logger对象上绑定了formatHeader方法,它的入参对象buf,其类型是*[]byte,而非[]byte。func (l *Logger) formatHeader(buf *[]byte, t time.Time, file string, line int) {}func modifySlice(innerSlice []string) {inne...原创 2021-01-15 16:00:59 · 201 阅读 · 0 评论 -
Golang类型断言
1、类型断言x.(T)检查x的动态类型是否是T,其中x必须是接口值。直接使用func main() {var x interface{}x = 100value1, ok := x.(int)if ok {//打印fmt.Println(value1)}value2, ok := x.(string...原创 2021-01-14 15:42:08 · 1381 阅读 · 0 评论 -
Golang--实战http客户端
原创 2021-01-13 19:53:48 · 227 阅读 · 0 评论 -
2021-01-11
golang 数据结构之单单链表package mainimport "fmt"//定义一个结构体//数据结构列表type LinkNode struct { Data int64 NextNode *LinkNode //下一个节点的地址}//头节点type ListHead struct { HeadNode *LinkNode}//从头节点开始,一次往下添加func (L...原创 2021-01-11 21:39:04 · 84 阅读 · 0 评论 -
go语言聊天服务器
服务端程序 服务端程序中包含4个goroutine,分别是一个主goroutine和广播(broadcaster),每一个连接里面又包含一个来连接处理(handleConn)goroutine 和一个客户写入(clientwriter)goroutine。广播器(broadcaster)是用于如何使用 select 的一个规范说明,因为它需要对三种不同的消息进行响应。主 go...原创 2020-03-29 12:20:54 · 199 阅读 · 0 评论 -
Go语言死锁、活锁和解锁概述
本节我们来介绍一下死锁、活锁和解锁这三个概念死锁死锁是指两个或者两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,他们讲无法推进下去。此时称系统处于死锁状态或者产生死锁,这些永远在互相等待的进程死锁进程。死锁发生的条件有如下几种:1)互斥条件线程对资源的访问是排他性的,如果一个线程对占用某个资源,那么其他线程处于等待状态,直到该资源...原创 2020-03-23 22:34:02 · 746 阅读 · 0 评论 -
Go语言等待组(sync.WaitGroup)
Go语言除了可以使用通道(channel)和互斥锁进行两个并发程序间的同步外,还可以使用等待组进行多个任务的同步,等待组可以保证在并发环境中完成指定数量的任务。 在sync.WaitGroup(等待组)类型中,每个sync.WaitGroup值在内部维护着一个计数,此计数的初始默认值为零。等待组有下面几个方法可以用,如下表示:...原创 2020-03-22 11:13:15 · 595 阅读 · 0 评论 -
Go语言互斥锁(sync.Mutex)和读写互斥锁(sync.RWMutex)
Go语言包中的sync包提供了两种锁类型:sync.Mutex和sync.RWMutex。 Mutex是最简单的一种类型,同时也比较暴力,当一个goroutine获得Mutex后,其他goroutine就只能乖乖等待这个goroutine释放该Mutex. RWMutex 相对友好些,是经典的单写多读模型。在读锁占用的情况下,会阻止写,但不阻止读,也就是多个 goro...原创 2020-03-14 21:10:21 · 414 阅读 · 0 评论 -
Go语言关闭通道后继续使用通道
通达是一个引用,和map类似。map在没有任何外部引用时,Go语言程序在运行时(runtime)会自动对内存进行垃圾回收(Garbage Collection,GC)。类似的,通道也可以被垃圾回收,但通道也可以被主动关闭。格式使用close()来关闭一个通道:close(ch)关闭的通道依然可以被访问,访问被关闭的通道将会发生一些问题。给被关闭通道发送数据将会触发pani...原创 2020-03-01 22:45:52 · 1458 阅读 · 0 评论 -
Go语言使用通道相应计时器的事件
Go 语言中的time包提供了计时器的封装。由于Go语言中的通道和goroutine的设计,定时任务可以在goroutine中通过同步的方式完成,也可以通过goroutine中异步回调完成。这里将分两种例子展示。一段时间之后(time.After)延迟回调package mainimport ("fmt""time")func ...原创 2020-02-27 22:24:44 · 872 阅读 · 0 评论 -
Go语言RPC(模拟远程过程调用)
引入 服务器开发中会使用RPC(Remote Procedure Call,远程过程调用)简化进程间通信的过程。RPC能有效地封装通信过程。RPC能有效地封装通信过程,让远程的数据收发通信过程看起来就像本地的函数调用一样。 本例中,使用通道代理Socket 实现RPC的过程。客户端与服务器运行在同一个进程,服务器和客服端在两个goroutine中运行。先给出完整...原创 2020-02-15 11:24:56 · 717 阅读 · 0 评论 -
Go语言通道的多路复用——同时处理接收和发送多个通道的数据
多路复用是通信和网络的一个专业术语,多路复用通常表示在一个信道上传输多路信号或数据流的过程和技术。提示:报话机同一时刻只能有一边进行或者发的单边通信,报话机需要准守的通信流程如下:1、说话方在完成时需要补上一句“完毕”,随后放开通话按钮,从发送切换到接收状态,收听对方说话;2、收听方在听到对方说“完毕时,按下通话按钮接收切换到发送状态开始说话;电话可以在说话的同时听到对方...原创 2020-02-13 20:35:34 · 1245 阅读 · 0 评论 -
Go语言channel超时机制
前沿 go语言没有提供直接的超时处理机制,所谓超时可以理解为我们上网浏览一些网站时,如果一段时间之后不操作,就会需要重新登录;那么我们应该如何实现这一功能呢?这时就需要select来设置超时。 虽然selecct机制不是专门为超时而设计的,却能很方便的解决超时问题,因为select的特点是只要其中一个case已经完成,程序就会继续往下执行,而不会考虑其他的case...原创 2020-02-11 14:38:17 · 1167 阅读 · 0 评论 -
Go语言缓冲的通道
Go语言中缓冲的通道(buffered channel)是一种在被接收前能存储或者多个值的通道。这种类型的通道并不强制要求goroutine之间同时完成发送和接收。通道会阻塞发送和接收动作的条件也会不同。只有在通道中没有要接收的值时,接收动作才会阻塞。只有在通道没有可用缓冲容纳被发送的值,发送动作才会阻塞。 这导致有缓冲的通告和无缓冲的通道之间的一个很大的不同:...原创 2020-02-10 20:05:27 · 292 阅读 · 0 评论 -
Go语言无缓冲的通道
前沿 Go语言中无缓冲的通道(unbuffered channel)是指在接收前没有能力保存任何值的通道。这种类型的通道要求发送 goroutine 和接收 goroutine 同时准备好,才能完成发送和接收操作。如果两个 goroutine 没有同时准备好,通道会导致先执行发送或接收操作的 goroutine 阻塞等待。这种对通道进行发送和接收的交互行为本身就是同步的...原创 2020-02-10 15:34:25 · 663 阅读 · 2 评论 -
Go语言单向通道——通道中的单行道
Go语言的类型系统提供了单方向的channel类型,顾名思义,单向channel只用于发送或者接受数据。channel本身必然是同时支持读写否则根本没法用。假如一个 channel 真的只能读,那么肯定只会是空的,因为你没机会往里面写数据。同理,如果一个 channel 只允许写,即使写进去了,也没有丝毫意义,因为没有机会读取里面的数据。所谓的单向 channel 概念,其实只是对 c...原创 2020-02-09 21:33:50 · 683 阅读 · 0 评论 -
Go语言并发打印(借助通道实现)
之前的例子创建的都是无缓冲通道。使用无缓冲通道往里面装数据时,装入方将被阻塞,直到另外通道在另一个goroutine中被取出,同时,如果通道中没有放入任何数据,接收方试图从通道中获取数据时,同样也是阻塞。发送和接收的操作是同步完成的。 下面介绍一个并发打印的例子,将goroutine和channel放在一起展示它们的用法;package mainimport "f...原创 2020-02-09 20:39:54 · 1202 阅读 · 0 评论 -
如何控制Go编码Json数据时的行为
一、自定义Json键名首先在Go 程序中要将数据编码成JSON 格式时通常我们会先定义结构体类型,将数据存放到结构体变量中。type Address struct { Type string City string Country string}type CreditCard struct { FirstName stri...原创 2020-02-07 20:59:53 · 252 阅读 · 0 评论 -
go语言的四个盲点
很多熟悉Go的程序员们都会说到Go是一门很简单的语言,话虽如此,但实际上Go的简单是基于复杂底层的极简包装。Go在很多地方均做了“隐式”的转换,这也就导致了很多迷惑点,本文总结了Go开发中几个令人迷惑的地方,如有不当之处请指正。nil究竟是什么 首先明确一点:nil是值而非类型。nil值只能赋值给slice、map、chan、interface和指针。在Go中,任何...原创 2020-02-07 20:25:11 · 220 阅读 · 0 评论 -
Go语言通道讲解
一、浅谈通道 如果说 goroutine 是 Go语言程序的并发体的话,那么 channels 就是它们之间的通信机制。一个 channels 是一个通信机制,它可以让一个 goroutine 通过它给另一个 goroutine 发送值信息。每个 channel 都有一个特殊的类型,也就是 channels 可发送数据的类型。一个可以发送 int 类型数据的 channel ...原创 2020-02-06 21:43:48 · 839 阅读 · 0 评论 -
Go语言竞争状态讲解
两个或者多个goroutine 有并发,就有资源竞争,如果两个或者多个 goroutine 在没有相互同步的情况下,访问某个共享的资源,比如同时对该资源进行读写时,就会处于相互竞争的状态,这就是并发中的资源竞争。竞争状态的存在是让并发程序变得复杂的地方,十分容易引起潜在的问题。对共享资源的操作必须原子化的,同一时刻只能有一个goroutine对共享资源进行读和写操作。//演示程序中...原创 2020-01-31 21:00:31 · 676 阅读 · 0 评论 -
golang单例模式介绍
定义单例对象的类必须保证只有一个实例存在,全局唯一接口访问。实现1--懒汉方式type singleton struct{}var ins *singletonfunc GetIns() *singleton {if ins == nil {ins = &singleton{}}...原创 2020-01-07 12:54:09 · 157 阅读 · 0 评论