![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
golang
maxdaic
这个作者很懒,什么都没留下…
展开
-
slice的浅拷贝和深拷贝
以前学c++的时候就知道有深拷贝和浅拷贝,主要是涉及到指针的拷贝。浅拷贝就是只拷贝指针的值,指针指向的内容只有一份。而深拷贝是把指针指向的值拷贝一份,这样指向这段数据的指针的值也要跟着改变了。golang里面也有浅拷贝和深拷贝。slice的浅拷贝就是指slice变量的赋值操作。slice的深拷贝就是指使用内置的copy函数来拷贝两个slice。实例代码如下所示:func main() { SliceShallowCopy() SliceDeepCopy()}func Slic原创 2020-07-23 15:03:38 · 3394 阅读 · 0 评论 -
Golang的unsafe.Pointer是真的不安全
今天看了一篇文章,介绍通过指针的方式在类型强转的过程中避免数据拷贝。代码如下:a :="aaa"ssh := *(*reflect.StringHeader)(unsafe.Pointer(&a))b := *(*[]byte)(unsafe.Pointer(&ssh))fmt.Printf("%T",b)fmt.Printf("%v",b)原理就是,内置string类型其实本质是个reflect.StringHeader,内置切片类型其本质其实是reflect.Slic原创 2020-07-23 11:33:16 · 1035 阅读 · 0 评论 -
goland给断点设置条件
goland给断点设置条件是一项非常实用的技能。尤其是在for循环中。比如提前知道该for循环将在当i==812的时候出现异常,那么可以在for循环里设置一个断点并给该断点设置条件i==811提前准备观察软件异常前的程序状态。goland给断点设置条件有几种方法:第一,点击断点,然后点击右键在弹出的窗口中编辑断点条件,如下图所示第二,光标移动到断点所在的行,然后按下快捷键Alt+Enter,在弹出的窗口中选中Edit breakpoint,然后编辑断点条件。第三,光标移动到断点所在的行,原创 2020-07-22 11:51:38 · 2576 阅读 · 0 评论 -
最简单的P2P加密聊天软件开发完成
昨天花了点时间做了一个最简单的P2P加密聊天软件。代码很少,功能很简单,暂时只能吃两个人聊,也暂时没有动力去做扩展,做这个的初衷也只是为了锻炼自己用golang写代码的熟练程度,以及对AES对称加密和ECDSA密钥交换算法的应用还好,很顺畅,没遇到太大的阻碍。下面是效果,只能在控制台下输入和打印聊天信息也软件日志,红√勾出来的是聊天内容,其他的是日志信息。代码已上传到github,开源地址:https://github.com/lilianwen/P2P-Crypto-Chat...原创 2020-07-21 16:59:02 · 1533 阅读 · 0 评论 -
golang的sync.Map是残缺的
今天用了一下golang的sync.Map,但是让我感到很蛋疼的地方在于,我发现这个东西,这个官方提供的东西,居然有个很大的功能是残缺的!!!那就是获取map中元素的个数。像普通的map,直接使用len()就可以测量出当前map的键值对的个数。但是sync.Map是一个封装好的产品,不能使用len(),也没有提供输出的接口告诉使用者当前里面的元素的个数。当然也可以自己去改代码,或者自己依赖sync.Map创建新的类型,自己实现这个接口,但那毕竟不是很方便。这样一个官方推出的东西居然有这样一个问题原创 2020-07-19 01:00:40 · 325 阅读 · 0 评论 -
golang的error wrapping
我们都知道error用处特别多,但是golang官方提供的error类型功能实在太单一了,只能打印错误提示字符串。不过在Go1.13版本后对error功能进行了增强,也就是今天要提到的error wrapping。error wrapping的原理非常简单,通过fmt.Errorf + %w的组合生成一个嵌套的error。通过多次调用生成多层嵌套error。同时errors包还提供了三个好用的函数,全列在下面的图里。最后我写了个demo测试了一下,确实很好用:type MyError原创 2020-07-18 03:07:15 · 1357 阅读 · 0 评论 -
golang的一个让人不解的bug
今天写代码遇到一个很奇葩的问题,我一直觉得没有语法错误的地方,偏偏居然有语法错误:mgr.dbUtxo, err := leveldb.OpenFile(cfg.DataDir+"/blockchain/utxo",nil)错误提示如下图:把上面的代码改成下面这样就OK了var err errormgr.dbUtxo, err = leveldb.OpenFile(cfg.DataDir+"/blockchain/utxo",nil)真是见鬼了,以前没遇到过这种情况。哦觉得原创 2020-07-14 11:33:56 · 263 阅读 · 1 评论 -
学习go语言内置的gob编码——编码后的数据长度
go语言内置了gob这种编码方案,我从来没用过,感觉很好奇,今天试试。先写一个简单的代码体验一下:type Retangle struct { Length uint8 Width uint8}func main() { r := Retangle{ 20, 18, } var buffer bytes.Buffer encoder := gob.NewEncoder(&buffer) err := encoder.Encode(&r) .原创 2020-07-12 02:40:33 · 670 阅读 · 0 评论 -
用container/heap实现一个最小堆
很少用container/heap这个工具,今天看到别人用来实现一个最小堆,感觉很有意思哈。代码如下:type Request struct { fn func() int data []byte op int c chan int}type Worker struct { req chan Request pending int index int done chan struct{}}type Pool []*Workerfu原创 2020-07-11 03:31:14 · 168 阅读 · 0 评论 -
简单二分查找-golang
又是程序员小灰的漫画,关于二分查找的,我写了个简单的实现。不过实际写代码的过程中并不一帆风顺,有些特殊情况还是没有考虑到。下面是源码:var ( ErrNotFound = errors.New("not found target"))func BinarySearch(data []int, target int) (int,error) { dataAmount := len(data) if dataAmount == 0 { return 0, ErrNotFound原创 2020-07-10 21:14:42 · 148 阅读 · 0 评论 -
简单插入排序-golang
看了程序员小灰的插入排序漫画,还是很好理解的。我当初上大学的时候能有这么好的学习资料就好了。下面是我自己用golang实现的插入排序算法func InsertSort(data []int) { var dataAmount = len(data) for i:=1; i<dataAmount; i++ { target := data[i] for j:=i-1; j >=0; j-- { if data[j] > target { data[j+原创 2020-07-10 20:10:05 · 133 阅读 · 0 评论 -
golang处理系统信号
今天学了一下golang处理系统信号。和在后台开发来说,应该是个很常规的操作。先定义一个通道sigs ,用来和系统交互,系统把信号存放在这个通道里面,怎么让系统知道要存放到这个通道里呢?调用系统函数:signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)后面两个是我们定义的要捕获的信号。也就是说系统会将这两种信号捕获给我们的程序,其他的信号不会捕获给我们,除非我们继续注册其他的信号。接下来,我们要开一个goroutine专门用来等待系.原创 2020-07-06 02:50:13 · 543 阅读 · 0 评论 -
golang内置的log
今天学习了一下golang内置的log实现,有点小收获。先来看看它是怎么用的。import "log"func main() { log.SetPrefix("[logusage]") log.SetFlags(log.Ldate|log.Llongfile) log.Println("i am log") log.Fatalln("i am fatal") log.Panicln("i am panic")}log提供的接口也不多,最基础的用法就那几个函数。log..原创 2020-07-11 12:01:45 · 835 阅读 · 0 评论 -
go get无法访问github怎么办?
在控制台下输入go get github.com/xxx/xxx结果提示访问github.com超时。虽然我的浏览器可以通过sock5代理访问github.com,但是控制台不行。后来找到一个简单的解决方案:在win10系统里设置两个环境变量:设置好环境变量后,重启控制台即可访问github.com。...原创 2020-06-30 12:39:42 · 3946 阅读 · 3 评论 -
golang的反射机制
写一段最简单的代码看看golang的反射机制是怎么做的。import ( "fmt" "reflect")func main() { var a int typeOfA := reflect.TypeOf(a) fmt.Println(typeOfA.String()) fmt.Println(typeOfA.Kind())}看看这个TypeOf是怎么实现的func TypeOf(i interface{}) Type { eface := *(*emptyInt原创 2020-07-11 18:46:27 · 130 阅读 · 0 评论