
Golang
文章平均质量分 87
RealKeyboardMan
天不生我键盘侠,键道万古长如夜。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
ASCII、Unicode、UTF-8
ASCIIASCII码是英语字符与二进制间的编码,比如空格SPACE是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的一位统一规定为0。Unicode有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字表示的,这是一种所有符号的编码。Unicode只规定了字符和二进制的对应关系,没有规定二进制如何存原创 2020-09-28 17:34:52 · 170 阅读 · 0 评论 -
Go命名规范
前言命名规则涉及变量、常量、全局函数、结构、接口、方法等的命名。 Go语言从语法层面进行了以下限定:任何需要对外暴露的名字必须以大写字母开头,不需要对外暴露的则应该以小写字母开头。当命名(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Analysize,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);命名如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用原创 2020-07-09 19:18:21 · 404 阅读 · 2 评论 -
Golang:io包中的接口
回顾之前学习了strings.Builder,strings.Reader,bytes.Buffer。strings.Builder类型主要用于构建字符串,他的指针类型实现的接口有io.Writer、io.ByteWriter和fmt.Stringer。另外,它其实还实现了一个io包的包级私有接口,io.StringWriter。strings.Reader类型主要用于读取字符串...原创 2020-04-12 20:41:51 · 388 阅读 · 0 评论 -
Golang:bytes.Buffer
bytes.Buffer(缓冲区)结构bytes.Buffer开箱即用,不仅可以拼接、截断子序列,还可以顺序读取。读写一体Buffer是一个结构体,包含四个字段,buf是一个[]byte,用来保存内容,称之为内容容器;off表示当前读到了哪个位置,写的话从len(buf)后开始写;bootstrap是一个[64]byte,是为了快速支持长度较小的内容;lastRead是readOp类型,r...原创 2020-04-08 19:29:39 · 1297 阅读 · 0 评论 -
Golang:strings包和字符串操作
strings包string类型值是不可变的,如果想要获得一个不一样的字符串,就只能基于原字符串进行剪裁,拼接等操作,然后将得到的新字符串存放到一块联系内存中。string值包含了指向底层字节数组头部的指针值,以及该字节数组的长度。在string值上做切片,就相当于在其底层字节数组做切片。而字符串拼接时(使用+),会把所有被拼接的字符串依次拷贝到一个崭新且足够大的连续内存空间中,并把持有新...原创 2020-04-06 18:04:42 · 696 阅读 · 0 评论 -
Golang:unicode与字符编码
字符编码基础Go语言中标识符可以包含“任何Unicode编码可以表示的字母字符”。当将整数转换为string类型时,如果整数值不能代表一个有效的Unicode代码点,转换的结果就会是"�"。当一个string类型的值被转换为[]rune类型时,其中的字符串会被拆分成一个一个的Unicode字符。Go语言采用的字符编码方案从属于Unicode编码规范,所有源代码,都必须按照Unicode编...原创 2020-04-05 19:14:34 · 1683 阅读 · 0 评论 -
Golang:sync.Map
并发安全Go自带的map并不是并发安全的。可以使用sync.Mutex或sync.RWMutex加上原生map自行构建。在1.9版本之后,Go正式加入了并发安全的字典类型sync.Map。sync.Map提供了常用的键值存取操作,并保证了操作的并发安全,并且时间复杂度与map一样都是O(1)。使用锁意味着要把一些并发操作串行化,实际上是降低了程序性能,特别是在多核CPU上;所以常说,能使.........原创 2020-04-02 18:18:07 · 730 阅读 · 0 评论 -
Golang:sync.Pool
临时对象池sync.Pool类型可以被称为临时对象池子,它的值可以被用来存储临时的对象。它的值在被真正使用后,就不应该再复制了临时对象的意思是:不需要持久使用的某一类值,这类值对于程序来说可有可无,但如果有的话明显更好。它们的创建和销毁可以在任何时候发生,不影响程序功能。临时对象应该是无需被区分的,其中任何一个值都可以代替另一个。临时对象池最主要的用途就是充当数据缓存。sync.Pool...原创 2020-03-31 18:09:12 · 187 阅读 · 0 评论 -
Golang:context.Context
使用context实现一对多的goroutine协作参考实现func main() { coordinateWithContext()}func coordinateWithContext() { total := 12 var num int32 // cxt实际上是一个指向cancelCtx结构体类型的指针,cancelCtx结构体内嵌了Context接口 // cxt.d......原创 2020-03-31 16:46:58 · 283 阅读 · 0 评论 -
Golang:sync.WaitGroup和sync.Once
sync.WaitGroup开箱即用,并发安全。使用了原子操作。拥有三个指针方法:Add、Done、Wait。WaitGroup的计数器值不能小于0,否则会引发panic。如果Wait方法的调用和首次Add方法的调用时同时发起的,比如,在两个同时启动的goroutine中,分别调用这两个方法,就有可能会引发panic。如果Wait方法执行期间,跨越了两个计数周期,就会引发panic,比...原创 2020-03-30 11:58:09 · 211 阅读 · 0 评论 -
Golang:原子操作
前导对于一个Go程序来说,同一时刻,只有少数的goroutine真正地处于运行状态,这个数量只会与M的数量一致,而不会随着G增多而增长。为了公平起见,调度器总是会频繁地换上换下这些goroutine。中断的时机有很多,任何两条语句执行的间隙,甚至在某条语句执行的过程中都是可以的,即便这些语句在临界区内。所以,互斥锁虽然可以保证临界区代码的串行执行,但却不能保证这些代码执行的原子性能够保证...原创 2020-03-29 10:47:08 · 614 阅读 · 0 评论 -
Golang:sync.Cond
条件变量与互斥锁配合使用条件变量是基于互斥锁的。用于协调想要访问共享资源的线程。当共享资源状态发生变化,用来通知被互斥锁阻塞的线程。条件变量使用互斥锁初始化、并提供了三个方法:等待通知(Wait),单发通知(Signal)和广播通知(Broadcast)。sync.Cond类型不是开箱即用的,需要通过构造函数NewCond创建它的指针值,NewCond需要一个sync.Locker类型的参...原创 2020-03-27 18:09:35 · 362 阅读 · 0 评论 -
Golang:sync.Mutex与sync.RWMutex
概念竞态条件:数据被多个线程共享,很可能会产生争用和冲突的情况,往往会破坏共享数据的一致性(一致性即多个线程对共享数据的操作可以到达各自的预期),这种情况称为竞态条件。为了解决这种情况,需要同步,用途有两个:避免多个线程同一时刻操作同一个数据和避免多个线程同一时刻执行同一段代码。这样的数据块和代码块隐含着一种或多种资源(存储资源、计算资源、I/O资源、网络资源等),可以看作是共享资源,同步...原创 2020-03-26 18:12:23 · 466 阅读 · 0 评论 -
Golang:for、switch
forrange表达式结果可以是数组,数组指针,切片,字符串,字典或者通道。使用range时迭代切片,若只有一个迭代变量,那么这个迭代变量是索引;如果有两个迭代变量,则第一个迭代变量是索引,第二个迭代变量是元素值。range表达式只会在for语句开始时被求值一次,求值结果会被复制,即被迭代对象是range表达式结果值得副本而不是原值switchswitch表达式和case表达式结果...原创 2020-03-24 11:12:43 · 218 阅读 · 0 评论 -
Golang:接口
前导接口无法被实例化,即可以通过var a Animal声明接口变量a,但是无法使用new、make、或者:=创建。如果没有任何数据类型实现了接口约定的所有方法,那么该接口的值就不可能存在。只要某个数据类型实现了接口约定的所有方法,那么这个数据类型就是该接口的实现类型。对于接口类型的变量来说,赋给它的值称为动态值,该值的类型称为动态类型。在给一个接口类型的变量赋予实际值之前,动态类型是不...原创 2020-03-22 20:50:01 · 161 阅读 · 0 评论 -
Golang:结构体
前导方法是函数的特殊版本。函数是独立的程序实体,可以有名字也可以没名字(匿名函数),还可以当做其他函数的参数或者返回值。可以把具有相同签名(函数的参数和返回值类型都相同,叫做签名相同)的函数抽象成独立的函数类型。如type operate func(string) int。方法不同,必须要有名字,不能当作值来看待(不能作为其他函数的参数或返回值),必须属于某一个自定义类型。当一个结构体声...原创 2020-03-22 17:05:52 · 173 阅读 · 0 评论 -
Golang:函数
高阶函数接受其他函数作为参数传入把其他函数作为结果返回type operate func(x, y int) intfunc genCalculator(op operate) calculateFunc { return func(x int, y int) (int, error) { if op == nil { return 0, errors.New...原创 2020-03-19 18:51:29 · 103 阅读 · 0 评论 -
Golang:通道(channel)
双向通道// 带缓冲区ch1 := make(chan int, 10)// 不带缓冲区ch := make(chan int)特性同一时刻,如果有多个goroutine尝试往同一个channel发送数据,那么只会执行其中一个,而不会同时发送;接收也是同理,同一时刻,有多个goroutine尝试从一个channel中接收数据,也只会执行其中一个,直到这个元素被完全移出,其他gor...原创 2020-03-19 12:11:42 · 1042 阅读 · 0 评论 -
Golang:字典操作和约束
字典中key的约束字典(map)存储的不是单一值的集合,而是键值对(key-value)集合。Go语言字典类型是一个哈希表的特定实现,在这个实现中,key和value的不同在于,key的类型是受限制的(key不能是函数类型、字典类型和切片类型),value可以是任意类型。key的类型必须支持判等操作(== 和 !=),另外,如果key是接口类型,那么实际类型也不能是func,map和sli...原创 2020-03-14 17:14:21 · 428 阅读 · 0 评论 -
Golang:数组和切片
不同数组类型的值(简称数组)长度是固定的,切片类型的值(简称切片)是可变长的。数组长度在声明时指定,并且之后不再改变。切片长度可以自动随着元素数量增长而增长。切片可以看作是对数组的简单封装,每个切片的底层数据结构一定包含一个数组。正因为如此,Go语言切片类型属于引用类型,同属引用类型的还有map、channel、func;Go语言数组类型属于值类型,属于值类型的有基础数据类型和结构体。...原创 2020-03-13 18:11:29 · 152 阅读 · 0 评论 -
Golang:new和make
二者都是内存的分配(堆上)make只用于slice、map以及channel的初始化(非nil);new用于类型的内存分配,并且内存置为零(指针不是nil,但该类型是零值)。make返回的还是这三个引用类型本身;而new返回的是指向类型的指针。...原创 2020-03-10 15:16:43 · 122 阅读 · 0 评论 -
Golang:内存分配和垃圾回收
堆和栈区别空间分配区别:栈:由操作系统(编译器)自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构中的栈。堆:一般由代码分配释放,若代码没有显式释放,程序结束时可能由OS回收,分配方式类似链表。缓存方式区别:栈:使用的是一级缓存,通常都是被调用时处于存储空间中,调用完毕立即释放。堆:存放在二级缓存中,生命周期由垃圾回收算法来决定。数据结构区别:...原创 2020-03-08 18:55:25 · 2220 阅读 · 1 评论 -
Golang内存模型
定义为了保证共享内存的正确性(可见性,有序性,原子性),内存模型定义了共享内存系统中对多线程程序读写操作行为的规范。通过这些规则来规范对内存的读写操作,从而保证指令正确执行,与处理器、缓存、并发和编译器都有关。Go的内存模型Go 定义了Happens Before:如果A happens before B,那么A的执行结果对B可见(并不一定表示A比B先执行)单线程在单线程环境...原创 2020-03-01 18:59:38 · 267 阅读 · 0 评论 -
golang常用
定时器func ticker() { t := time.NewTicker(1 * time.Second) for { select { case <-t.C: fmt.Println(1) } }}控制goroutine运行func syncGo() { var wg sync.WaitGroup wg.Add(10) for i := 0; i...原创 2020-02-19 18:35:41 · 154 阅读 · 0 评论 -
由goroutine引出的问题
概念进程操作系统为了执行程序,给他分配文本域、数据区域和堆栈,让程序活动起来,活动的程序可以叫做进程。文本区域存储处理器执行的代码。数据区域存储变量和进程执行期间使用的动态分配的内存。堆栈区域存储着活动过程调用的指令和本地变量。线程线程是操作系统能够进行运算调度的最小单位,是进程中的实际运作单位。一个进程中可以并发多个线程,每条线程并行执行不同的任务。同一进程中的多条线程将...原创 2020-02-19 17:33:49 · 131 阅读 · 0 评论