随笔分类 -  go

摘要:一个字符串是一个不可改变的字节序列,字符串通常是用来包含人类可读的文本数据。和数组不同的是,字符串的元素不可修改,是一个只读的字节数组。每个字符串的长度虽然也是固定的,但是字符串的长度并不是字符串类型的一部分。由于Go语言的源代码要求是UTF8编码,导致Go源代码中出现的字符串面值常量一般也是UTF 阅读全文
posted @ 2020-12-24 16:57 hubb 阅读(146) 评论(0) 推荐(0)
摘要:数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。数组的长度是数组类型的组成部分。因为数组的长度是数组类型的一个部分,不同长度或不同类型的数据组成的数组都是不同的类型,因此在Go语言中很少直接使用数组(不同长度的数组因为类型不同无法直接赋值)。和数组对应的类型是切片,切 阅读全文
posted @ 2020-12-24 16:56 hubb 阅读(113) 评论(0) 推荐(0)
摘要:我们先看看切片的结构定义,reflect.SliceHeader: type SliceHeader struct { Data uintptr Len int Cap int } 可以看出切片的开头部分和Go字符串是一样的,但是切片多了一个Cap成员表示切片指向的内存空间的最大容量(对应元素的个数 阅读全文
posted @ 2020-12-24 16:53 hubb 阅读(174) 评论(0) 推荐(0)
摘要:避免切片内存泄漏 如前面所说,切片操作并不会复制底层的数据。底层的数组会被保存在内存中,直到它不再被引用。但是有时候可能会因为一个小的内存引用而导致底层整个数组处于被使用的状态,这会延迟自动内存回收器对底层数组的回收。 例如,FindPhoneNumber函数加载整个文件到内存,然后搜索第一个出现的 阅读全文
posted @ 2020-12-24 16:50 hubb 阅读(2834) 评论(0) 推荐(0)
摘要:切片内存技巧 在本节开头的数组部分我们提到过有类似[0]int的空数组,空数组一般很少用到。但是对于切片来说,len为0但是cap容量不为0的切片则是非常有用的特性。当然,如果len和cap都为0的话,则变成一个真正的空切片,虽然它并不是一个nil值的切片。在判断一个切片是否为空时,一般通过len获 阅读全文
posted @ 2020-12-24 16:49 hubb 阅读(305) 评论(0) 推荐(0)
摘要:func RemoveDuplicateElement(stringList []string) []string { result := make([]string, 0, len(stringList)) temp := map[string]struct{}{} for _, item := 阅读全文
posted @ 2020-12-16 11:46 hubb 阅读(328) 评论(0) 推荐(0)
摘要:执行一个简单协程 package main import ( "fmt" "time" ) func main(){ for i := 0; i < 100 ; i++{ go fmt.Println(i) } time.Sleep(time.Second) }分析: 为什么会有sleep 呢, 主 阅读全文
posted @ 2020-12-14 11:34 hubb 阅读(268) 评论(0) 推荐(0)
摘要:假设我们现在有这么一个需求: 计算1-200之间各个数的阶乘,并将每个结果保存在map中,最终显示出来,要求使用goroutine。 分析: (1)使用goroutine完成,效率高,但是会出现并发/并行安全问题; (2)不同协程之间如何通信; 对于(1):不同协程之间可能同时对一块内存进行操作,导 阅读全文
posted @ 2020-12-13 21:13 hubb 阅读(137) 评论(0) 推荐(0)
摘要:假设我们现在有这么一个需求: 计算1-200之间各个数的阶乘,并将每个结果保存在mao中,最终显示出来,要求使用goroutime。 分析: (1)使用goroutime完成,效率高,但是会出现并发/并行安全问题; (2)不同协程之间如何通信; 对于(1):不同协程之间可能同时对一块内存进行操作,导 阅读全文
posted @ 2020-12-13 21:09 hubb 阅读(992) 评论(0) 推荐(0)
摘要:首先得了解: 进程 线程 并发 并行 Go协程和Go主线程: 主线程:相当于进程;直接作用于cpu上,是重量级的,是物理态的; 协程:相当于轻量级的线程;由主协程开启,是逻辑态的; Go协程的特点: 有独立的栈空间 共享程序堆单元 调度由用户控制 协程是轻量级的线程 举个例子: package ma 阅读全文
posted @ 2020-12-13 21:08 hubb 阅读(121) 评论(0) 推荐(0)
摘要:package commonimport ( "fmt" "strings" "time")const DATE_FORMAT = "2006-01-02 15:04:05"const DATE_FORMAT_YMD = "2006-01-02" //获取时间差, 返回天时分秒func GetTim 阅读全文
posted @ 2020-12-13 19:32 hubb 阅读(303) 评论(0) 推荐(0)
摘要:1 数组 1.1 数组的声明 数组的声明主要可以使用以下几种方法: 指定数组的长度,赋值为默认零值 var my_array [5]int 指定数组的长度,赋值为指定的值 var my_array [5]int{1, 2, 3, 4, 5} 不指定数组的长度,赋值为指定的值,数组长度由初始化时数组的 阅读全文
posted @ 2020-11-19 08:43 hubb 阅读(86) 评论(0) 推荐(0)
摘要:什么是栈 栈(Stack)是一种拥有特殊规则的线性表数据结构。 1) 概念 栈只允许从线性表的同一端放入和取出数据,按照后进先出(LIFO,Last InFirst Out)的顺序,如下图所示。 图:栈的操作及扩展 往栈中放入元素的过程叫做入栈。入栈会增加栈的元素数量,最后放入的元素总是位于栈的顶部 阅读全文
posted @ 2020-11-12 08:56 hubb 阅读(145) 评论(0) 推荐(0)
摘要:有并发,就有资源竞争,如果两个或者多个goroutine在没有相互同步的情况下,访问某个共享的资源,比如同时对该资源进行读写时,就会处于相互竞争的状态,这就是并发中的资源竞争。 并发本身并不复杂,但是因为有了资源竞争的问题,就使得我们开发出好的并发程序变得复杂起来,因为会引起很多莫名其妙的问题。 1 阅读全文
posted @ 2020-11-12 08:51 hubb 阅读(131) 评论(0) 推荐(0)
摘要:Go语言中new和make是内建的两个函数,主要用来创建分配类型内存。在我们定义生成变量的时候,可能会觉得有点迷惑,其实他们的规则很简单,下面我们就通过一些示例说明他们的区别和使用。 变量的声明 1 2 var i int var s string 变量的声明我们可以通过var关键字,然后就可以在程 阅读全文
posted @ 2020-11-06 09:24 hubb 阅读(289) 评论(0) 推荐(0)
摘要:《Go语言实战》读书笔记,未完待续,欢迎扫码关注公众号flysnow_org,第一时间看后续笔记。 切片也是一种数据结构,它和数组非常相似,因为他是围绕动态数组的概念设计的,可以按需自动改变大小,使用这种结构,可以更方便的管理和使用数据集合。 内部实现 切片是基于数组实现的,它的底层是数组,它自己本 阅读全文
posted @ 2020-11-05 19:09 hubb 阅读(152) 评论(0) 推荐(0)
摘要:1.在 Project GOPATH 添加对应项目地址 2.把这个勾打上 3.点击 apply 添加应用完成 阅读全文
posted @ 2020-09-01 21:11 hubb 阅读(1269) 评论(0) 推荐(0)
摘要:Go的json解析:Marshal与Unmarshal 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 阅读全文
posted @ 2020-08-23 20:29 hubb 阅读(592) 评论(0) 推荐(0)