杂七杂八扫盲区
肖肖肖肖小小
咿呀~
展开
-
【转】GO中的select3个特性
原文链接作者:大彬链接:https://segmentfault.com/a/1190000017410112来源:SegmentFault 思否select的三个特性nil的通道永远阻塞当case上读一个通道时,如果这个通道是nil,则该case永远阻塞。这个功能有1个妙用,select通常处理的是多个通道,当某个读通道关闭了,但不想select再继续关注此case,继续处理其他case,把该通道设置为nil即可。下面是一个合并程序等待两个输入通道都关闭后才退出的例子,就使用了这个特性。转载 2020-07-22 08:29:27 · 266 阅读 · 0 评论 -
Go接口扫盲
Go接口接口嵌入接口,保持深度在0或1为最佳。接口中直接定义的方法数量10个之内最佳参考RuneJava的char类型是UTF-16的code unit,也就是两个字节,字符串是UTF-16 code unit的序列,因此每个字符都是定长的,要想获得某个位置字符,很容易计算出它的字节在字符串中的位置。Go语言使用UTF-8作为字符串的内部编码,因此对于大部分字符串都是ascii字符的情况下,占用的内存空间就会大大减少,但是带来的问题是,从字符串的字节slice中查找第n个字符比较麻烦,因为原创 2020-07-09 11:45:16 · 133 阅读 · 0 评论 -
【持续更】go语言避免踩坑
slice切片使用之前要判断长度在对slice进行操作时,必须判断长度是否合法,防止程序panic// 使用data前应判断长度是否合法 func decode(data [] byte) bool { if len(data) == 6 { if data[0] == 'F' && data[1] == 'U' && data[2] == 'Z' && data[3] == 'Z' && data[4] == '原创 2020-07-09 11:42:02 · 168 阅读 · 0 评论 -
Go中的定时器Timer
前言在go1.14 版本中,首先把存放定时事件的四叉堆放到p结构中,使用netpoll的epoll wait来做就近时间的休眠等待。在每次runtime.schedule调度时都检查运行到期的定时器。大概使用有时候我们会在开发中会使用到time.NewTicker或者time.NewTimer进行定时或者延时的处理,两者的底层实现基本是一样的,我们可以先来看看Timer的大概使用方式import ( "fmt" "time")func main() { timer :=原创 2020-06-30 11:13:37 · 663 阅读 · 0 评论 -
Go语言中的no copy机制
前言在go语言的源码中,有很多的结构体上面都被注解上了no copy强调no copy的原因是为了安全,因为结构体对象中包含指针对象的话,直接赋值拷贝是浅拷贝,是极不安全的。Go中如何保证no copy2.1 runtime checkingstrings.Builderpackage mainimport "strings"func main() { var testA strings.Builder testA.Write([]byte("a")) testB :=tes原创 2020-06-29 22:49:05 · 1531 阅读 · 0 评论 -
Go语言:限流算法
前言之前写过java版本的限流算法,最近刚好在学习go语言,那就当作练习,写一下go的限流算法简单计数器// 简单计数器package mainimport ( "fmt" "sync" "time")func main() { service := NewRequestLimitService(time.Second, 2) for true { hasToken := service.AddRequestCount() if hasToken { fmt.Pri原创 2020-06-29 20:28:54 · 387 阅读 · 0 评论 -
Go语言中channel有关的知识点
channel容量为0和为1的区别容量为1的channel是有缓冲channel的特殊情况,可以用在2个goroutine之间同步状态,或者其中一个等待另一个完成时才继续执行任务的情况。无缓存的channel的容量始终为0,发送者发送数据和接受者接受数据时同时的,无任何中间态,不能缓冲任何数据。容量为1的channel是可以缓冲1个数据,发送者和接受者之间可以不同时进行,可以发送者可以先把数据放进去,接受者可以过会儿再读取数据。无缓存的 channel 的发送者和接受者是相互等待,发送者等待接受者准原创 2020-06-23 15:12:35 · 677 阅读 · 0 评论 -
Go语言踩坑:源代码import的是文件路径,而调用的时候使用的是包名
import 后面跟的是相对文件夹路径(非文件路径)包名是golang文件中package后面的字符,但包导入后使用的是包名非路径文件夹名称文件名称在golang中仅仅是文件名称,没有编码含义原创 2020-06-22 09:26:00 · 1119 阅读 · 0 评论 -
Go语言import一个包但是不调用,那它import干啥子
一开始学习Go的时候,看到如下import _ "xxx/xxx"其实这是调用里面的init方法做一些初始化,注册之类的。例子package mainimport ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" // 导入驱动程序 "time")func main() { dsName := "root:xxxxxx@tcp(127.0.0.1:3306)/resk?charset=utf8&par原创 2020-06-23 20:30:00 · 603 阅读 · 0 评论