go
Sirius_7
霍格沃兹在读学生
展开
-
git push -u参数意义
其实发现自己在过往对于细节的把控不是很好,所以就会导致再三犯错。以后在工作学习中要主要对于细节的把控。下面对于git push -u的参数进行一下分析。其实一般使用来说。git pull某个分支之后,进行修改,直接git push就会发到对应的某个分支上。但是如果这个分支不是从远端pull下来的,而是本地创建的分支,那么当进行push时,便需要首先和远端的某个分支建立联系,而参数-u便是这个建立联系的关键。-u一般是在第一次push时,建立本地的分支和远端某个分支之间的关联,这样下次在本地分支push原创 2021-06-23 15:54:44 · 1174 阅读 · 0 评论 -
关于Git的一些命令
由于自己即将入职,所以需要提前做一些准备,把git的一些常用指令存储一下,传送门(- -其实主要是想在六月发一篇划水博客)原创 2021-06-23 15:33:05 · 166 阅读 · 0 评论 -
Go语言中字典树的实现
写在前面字典树在存储、查询方面应用广泛。所以特总结一下,利用GO语言实现字典树。具体实现字典树的实现主要还是基于树形结构,如果只是小写字母的话,那其实字典树是一个26叉树,每个节点最多都可以有26个子节点。从而可以利用一个长度为26的数组来记录某个节点的子节点情况。并且每个节点可以使用一个布尔标志位来划定是否是一个单词,这是关键所在,具体代码见下:type Trie struct { children [26]*Trie isEnd bool}func Construct原创 2021-05-23 16:49:15 · 358 阅读 · 2 评论 -
Go语言中的自定义slice排序
写在前面排序算法在日常生活中经常用到,许多语言有着很方便的api进行对排序算法的快速支持,譬如JAVA等中的lambda表达式,可以快速将自定义的排序规则织入。slice作为Go语言中特殊的数据结构,其排序的场景是比较常见的。Slice排序Go语言中的sort.slice可以利用匿名函数来快速实现自定义的排序。其实其很类似于其他语言中的sort函数,通过利用lambda表达式实现自定义排序,只不过这里是通过一个匿名函数。具体使用,见一个算法案例。案例分析给定一个字符串数组,和一个整数K,返回这个字原创 2021-05-20 20:37:00 · 1887 阅读 · 0 评论 -
Go语言实现一个简单的并发聊天室
写在前面Go语言在很多方面天然的具备很多便捷性,譬如网络编程,并发编程。而通道则又是Go语言实现并发编程的重要工具,因为其承担着通道之间互相通信的重任。并且因为其本身就是并发安全的,所以在某些场景下是非常好用的。并发聊天服务器这里主要是实现一个简单的并发聊天服务器。首先,客户端可以在服务器中注册自己的信息(登录以及退出),客户端发出的所有的信息由服务器向各个客户端进行转发,或者换句话说是广播。具体代码服务端说的再多,没有代码简单明了,直接上代码~package mainimport (原创 2021-04-26 16:48:30 · 1988 阅读 · 5 评论 -
Docker实现异构容器的创建
需求背景需要在X86的环境中,生成非X86架构的Docker容器,譬如arm以及ppc等。基本思路需要借助一款类似于转译cpu指令的程序:qumu-user-static。每一个异构容器的内部指令都会通过此程序转译给底层的X86架构cpu,从而实现上述功能。简要过程步骤1. 首先打开Linux内核的binfmt功能。该功能就是告诉linux什么样的文件等该用什么样的程序打开。这里主要是为了让Linux知道,系统在运行arm等架构的程序指令时,自动调用qemu-user-static来执行。开启方式原创 2021-04-24 11:20:26 · 648 阅读 · 0 评论 -
GO语言实现拓扑排序-2
本次主要利用BFS实现拓扑排序在上一篇文章中,主要是利用BFS实现了拓扑排序。与DFS实现拓扑排序不一样的是,DFS主要采用递归的方式实现拓扑排序,而BFS则无需引入递归,其核心思想是对一个有向(有环)图的各个节点入度的判断与分析。核心代码func findOrder(numCourses int, prerequisites [][]int) []int { var ( //描述有向图 edges = make([][]int, numCourses)原创 2021-04-01 11:04:56 · 253 阅读 · 0 评论 -
Go语言实现拓扑排序-1
写在前面所谓算法,一定一定是要落地才有意义的,任何一个在计算机领域流行的算法,一定有与之深度match的业务场景。这里之所以总结拓扑排序,是因为拓扑排序的应用场景还是非常丰富的。拓扑排序应用场景从经典的(人人都刷过)的课程表排课问题,到任何一些存在前驱和后驱关系的元素排序问题,其实都是典型的拓扑排序问题。如果细化问题,拓扑排序更多时候是有向图遍历或者排序。Go语言实现拓扑排序业务需求n门课程,其各个课程之间的有的课程需要先修,对应关系以map给出,例如:“信号与系统”:{"通信原理",“线性代原创 2021-03-30 10:15:53 · 320 阅读 · 0 评论 -
关于Go语言中的迭代变量的分析
写在前面迭代变量的使用,在立即执行的函数中,一般是不会显现问题的,但是在延迟执行的函数中,就会出现致命的问题。立即执行的情况当然,这种例子有很多,这里举一个非常简单的例子分析一下。场景需求:将silce内的数字迭代输出即可。package mainimport "fmt"func main() { var numsSilces []int for i:=0; i<10; i++ { numsSilces = append(numsSilces, i) } for _, nu原创 2021-03-28 15:08:57 · 359 阅读 · 0 评论 -
关于Go语言中的接口类型判断问题
作为一款面向对象的编程语言,Go语言的接口同样也存在多态这项特性。任何类型,如果其实现了某个接口所定义约束的函数,那么就说该类型实现了此接口。所以,就需要判断此时这个接口变量到底是什么类型的。具体见下:package mainimport "fmt"//定义接口type phone interface { call()}//利用两个子类型来实现该接口(实现其方法就ok,并无类似于implament等关键字)type apple struct{}type nokia struct {}原创 2021-03-19 16:01:36 · 517 阅读 · 0 评论 -
Go语言中的函数字面量与匿名函数
写在前面习惯性的在写内容前说点儿什么,个人感觉Go语言中的函数字面量这个东西用着不是很顺手,所以想着总结一下,今天先从简单的开始。持续更新给出概念命名函数的作用范围是包级别的,这个大家都知道。如果想在程序的任意表达式中使用一个变量来表达函数,那便需要:函数字面量。函数字面量类似于函数申明,只不过其实际是一个变量,而此变量的值是一个匿名函数。如下所示:func lbw() func() int { return func() int{ }}其实可以这么理解,lbw这个字面量指的是一个返回值为原创 2021-03-13 19:37:01 · 513 阅读 · 2 评论 -
GO语言多线程实践-3
关于Channel这种GO语言并发原语其实channel已经在另外一篇博客里面有曾经提到过,其使用起来是阻塞的(非buffered),所以比较容易造成dead lock。今天主要总结其两种比较优秀的应用场景:1.生产者和消费者的场景;2.用于替换WaitGroup的场景。生产者和消费者的场景具体代码见下:package mainimport ( "fmt" "math/rand" "time")func main() { c := make(chan int) for i :=原创 2021-03-08 11:27:04 · 163 阅读 · 0 评论 -
GO语言多线程实践-2
实践背景本次实践的背景依然MIT的6.824课程,在课程中lab2需要实现Raft算法,Raft算法的原理细节在我的另外一篇博客中,在这里就不再赘述了。Raft中Leader Election在Raft算法中,当一个节点变为candidate节点之后,其他的节点需要对其进行投票,当其获得超过半数票数时即当选,反之落选。下面将对该过程进行简单的模拟实践。实践思路1.首先向其他节点发送投票请求;2.根据投票请求的结果进行票数计算;3.根据票数的结果,得出投票的结果。那么在第一个步骤中,一定是并发原创 2021-03-04 19:53:29 · 230 阅读 · 2 评论 -
GO语言多线程实践-1
写在前面其实不论是哪一种编程语言,在当下这种大数据的业务压力下,多线程都是重中之重。本文的一些关于go语言的多线程实践都是基于MIT6.824课程总结而来的。多线程通信使用channel通道关于利用channel实现多线程通信的方法,在另外一篇博客中已经提及了,需要注意的主要是其可能造成的死锁问题,本文主要介绍下面这种多线程通信的方式。使用全局变量+锁其实这种方法与channel最大的不同就是,前者是go语言所独有的特性,因为其天然的可以集成多线程并发。这种方法在很多编程语言中都有,譬如Java原创 2021-03-03 11:09:03 · 559 阅读 · 0 评论 -
GO中的Channel以及死锁的造成
写在前面这篇文章的诞生要感谢MIT 6.284课程。在其中一节课中,谈到了多线程的协同的一些问题,其中就涉及到了channel这个概念,并由一段代码引发思考并逐渐深入得到了这篇文章。引子课程中有一段代码如下:其大致含义是:代码背景是在进行多线程网络爬虫页面url,master线程启动后,从channel通道中读取当前页面的所有url即urls,接着再对这个urls中的每一个url进行爬虫读取新页面中的urls(即执行go worker(u, ch ,fetcher)),每启动一个worker线程便原创 2021-01-31 22:19:47 · 419 阅读 · 0 评论 -
关于Go语言中的waitGroup
写在前面如果你刚接触Go语言并且想用它构建高并发,高性能的应用,弄明白WaitGroups是怎么回事很重要。在本教程中,我们将掌握以下内容:WaitGroups的用途一个WaitGroups的简单示例学习完本教程,你将会对WaitGroups有个全面的了解并且可以在你的高并发go应用中使用它。理解WaitGroups接下来我们就来看一下WaitGroups是什么以及它能为我们解决什么问题当你在程序中使用go语言的协程的时候,在协程执行完成之前,你需要阻塞程序的执行。请看以下代码示例 :原创 2021-01-30 22:21:15 · 204 阅读 · 0 评论 -
关于Go语言中一些日志的打印
之前一直为了偷懒,将日志的答应全部使用的是log.Fatal,结果发现,一旦出现问题,程序直接退出了。研究源码发现:func Fatal(v ...interface{}) { std.Output(2, fmt.Sprint(v...)) os.Exit(1)}可以明显的看到:使用log.Fatal 和 log.Panic 相关的函数时,会调用os.Exit(1)退出程序。总结所以说,在平时的使用过程中,尽量换用 log.Print 。该函数在输出日志的时候并不会调用os.Exit 进原创 2020-12-23 19:35:56 · 489 阅读 · 0 评论 -
Go语言中连接MySql并进行数据交互
写在前面总结这一篇博文的原因是,今天竟然被一条SQL的预处理语句给教训了,应该反省一下。借鉴一下大佬的文章太烂了,先把大佬的文章放上来供自己以后参考原创 2020-12-19 21:24:18 · 215 阅读 · 2 评论 -
关于go语言中格式化时间的问题
看到一篇文章,还不错,直接拿来转载使用了:格式日期转载 2020-12-14 14:19:25 · 190 阅读 · 0 评论 -
GO语言原生实现文件上传
写在前面最近在学习go,发现实践才是检验真理的唯一标准。在不引入任何框架的基础上,利用go语言实现一个web小应用也是比较方便的,但是坑还是不少,这里直接放上来,以防以后自己用得到,也希望可以帮到你。首先写处理文件上传的handlerpackage handler/**实现文件的上传和下载*/import ( "fmt" "io" "io/ioutil" "net/http" "os")//文件上传(这里一定要注意,方法名首字母大写,否则无法在别的包中被引用发现)func原创 2020-12-13 17:09:12 · 1384 阅读 · 0 评论 -
Go语言中的rune数据类型
写在前面最近开始学习Go语言,因为自己是从Java逐步转Go原因,在感慨Go语言简便的同时,也因为其封装的数据类型和包较多,所以还得慢慢学习。今天来谈谈Go语言中的rune数据类型。名词解释Go语言中的整数类型也有有符号数和无符号数之别,分别用int 和uint表示,也分别由8、16、32、64位之分。Go语言中有一种特殊的数据类型rune,该数据类型与int32是同义词,或者说其本身只是int32的别称。为何要有rune那么既然rune和int32等价,为什么还需要有rune这种数据类型呢?我是原创 2020-12-06 16:54:51 · 2284 阅读 · 2 评论