golang编程进阶技巧
对最近使用到的技巧做一个汇总。使用反斜杠处理较长的字符串,省去手动转义,简洁又节省时间。 反斜杠的使用 类型转换。 类型转换一步到位 GC优化。 gc优化 go数组是值类型,如果想避免数据复制,可以改用指针或切片。给函数添加方法,调用自己。 函数属性 匿名接口的使用。 匿名接...阅读全文
对最近使用到的技巧做一个汇总。使用反斜杠处理较长的字符串,省去手动转义,简洁又节省时间。 反斜杠的使用 类型转换。 类型转换一步到位 GC优化。 gc优化 go数组是值类型,如果想避免数据复制,可以改用指针或切片。给函数添加方法,调用自己。 函数属性 匿名接口的使用。 匿名接...阅读全文
Go中的控制语句较精简,仅有if、for、select和switch。但使用时均比较灵活 if 在Go中条件语句*if*中如果条件部分的计算结果为**true**时将执行语句块,否则则执行else语句块(如果存在else时),此逻辑和其他语言中的if一样,但是在Go中还是有一些不同之处。 if条件表达式不能使用花括号**()**包含 if语句代码段必须使用**{}**,并且左括号必须和if在同一行 if条件表达式的前面可以包含初始化语句,支持平行赋值,但不支持多个赋值语句 赋值+条件判断 if a, b := 21, 3; a > b { fmt.Println("a>b ? true") } 在if条件表达式前面声明的的变量只能在if-else语句块中使用。 if a, b := 21, ...阅读全文
想了很久准备学习一门新的语言,纠结了很久,最后选择了go语言。今天开始进入go语言的学习。 1、下载go http://www.golangtc.com/download 2、下载liteide http://www.golangtc.com/download/liteide 3、开始编程 学习任何编程语言的第一个程序都是Hello world。在GOPATH目录下建立hello.go文件,输入下面内容。 package main import "fmt" //引入fmt库 func main() { fmt.Println("Hello World!") } 逐行分析这段程序: 第一行是必须的。所有go语言编写的文件都以package <*>开头,对于独立运行的执行文件必须是 packag...阅读全文
摘要: 话题引入 VPN网关是阿里云新推出的一项网络服务,可以帮助你的企业轻松构建安全、稳定、高可用的网络互联方案。相比传统VPN软件和自建VPN,阿里云VPN网关部署方便,即开即用,售后支持专业。 今天,我们来谈一谈如何如何部署和配置VPN网关,使两个VPC之间能够私网互通,把你的云上网络连接起来。 话题引入 VPN网关是阿里云新推出的一项网络服务,可以帮助你的企业轻松构建安全、稳定、高可用的网络互联方案。相比传统VPN软件和自建VPN,阿里云VPN网关部署方便,即开即用,售后支持专业。 今天,我们来谈一谈如何如何部署和配置VPN网关,使两个VPC之间能够私网互通,把你的云上网络连接起来。 VPN部署 提示:VPN网关是基于Internet建立加密隧道进行通信,通信质...阅读全文
Docker在2013年三月实现了开源发布,它的出现让软件开发行业对于现代化应用的打包以及部署方式发生了巨大的变化。紧随着Docker的发布,各种具有竞争性、致敬性以及支持性的容器技术纷纷涌现,为这一领域带来了极大的关注度,同时也引起了人们的反思。这一系列文章将解答读者的各种困惑,对如何在企业中实际使用容器进行分析。 这一系列文章首先将对容器背后的核心技术进行观察,了解开发者目前如何使用容器,随后将分析在企业中部署容器的核心挑战,例如如何将容器技术与持续集成和持续交付管道进行集成,并对监控方式进行改进,以支持不断变化的负载,以及使用短期容器的潜在需求。本系列文章的总结部分将对容器技术的未来进行分析,并探讨无核化技术(unikernels)目前在处于技术前沿的组织中所扮演的角色。 本文是本系列...阅读全文
Go中的控制语句较精简,仅有if、for、select和switch。但使用时均比较灵活 if 在Go中条件语句*if*中如果条件部分的计算结果为**true**时将执行语句块,否则则执行else语句块(如果存在else时),此逻辑和其他语言中的if一样,但是在Go中还是有一些不同之处。 if条件表达式不能使用花括号**()**包含 if语句代码段必须使用**{}**,并且左括号必须和if在同一行 if条件表达式的前面可以包含初始化语句,支持平行赋值,但不支持多个赋值语句 赋值+条件判断 if a, b := 21, 3; a > b { fmt.Println("a>b ? true") } 在if条件表达式前面声明的的变量只能在if-else语句块中使用。 if a, b := 21, ...阅读全文
package main import ( "crypto/md5" "fmt" "io" "strconv" "time" ) func main() { crutime := time.Now().Unix() fmt.Println("crutime-->", crutime) h := md5.New() fmt.Println("h-->", h) fmt.Println("strconv.FormatInt(crutime, 10)-->", strconv.FormatInt(crutime, 10)) io.WriteString(h, strconv.FormatInt(crutime, 10)) fmt.Println("h-->", h) token := fmt.Sp...阅读全文
简介 最近在准备面试,发现一个不错的网站推荐给大家。也希望通过Go实现来把里面 剑指offer算法 的题做一下。如果觉得帮到了你,希望能为我点个赞呀。如果发现代码有错,非常希望您能够在留言中指出。https://github.com/CyC2018/CS...文章只贴自己写的代码,题目的所有内容和解题思路都在上面的网站里。一些比较简单无聊的题,就跳过。。 未完待续。 归并排序,快排,堆排序 这一节不出现在剑指offer里边,但是经常面试问到。1.归并排序 package main import ( "math/rand" "time" ) // 产生n个随机数 func CreateList(list []int, n int) []int { s1 := rand.NewSource(ti...阅读全文
退出运行中的程序,可以粗暴的kill -9 $PID,但这样会破坏业务的完整性,有可能一个正在在执行的逻辑半途而费,从而产生不正常的垃圾数据。 本文总结在go语言中,如何能优雅的退出网络应用,涉及的知识包括:signal,channel,WaitGroup等。 从这里:https://gobyexample.com/channel-synchronization 可以简单了解到,在go中如何使用channel实现goroutines同步。 在nsq中,也使用了相同的机制,不过封装更复杂了些。我们以nsqadmin中的实现为例进行简单的分析。 代码段1(来自:https://github.com/bitly/nsq/blob/master/nsqadmin/main.go): 1 2 3 4 ...阅读全文
一致性哈希算法与高可用集群代理 2017年11月30日 假定N为后台服务节点数,当前台携带关键字key发起请求时,我们通常将key进行hash后采用模运算(hash(key)%N)来将请求分发到不同的节点上。 对前台请求于后台无状态服务节点不敏感的场景而言,只要请求key具有一定的随机性,哪怕节点动态增删,该算法于后台而言已可以达到很好的负载均衡效果。 但对于分布式缓存,或者分布式数据库等场景而言,上述方式就不合适了。因后台节点的增删会引起几乎所有key的重新映射。这样,于分布式缓存而言,均发生cache miss;于分布式数据库而言发生数据错乱,其影响是灾难性的。 而一致性哈希算法的目标是,当K个请求key发起请求时。后台增减节点,只会引起K/N的key发生重新映射。即一致性哈希算法,在后...阅读全文
go语言的time包 组成 time.Duration(时长,耗时) time.Time(时间点) time.C(放时间点的管道)[ Time.C:=make(chan time.Time) ] time包里有2个东西,一个是时间点,另一个是时长 时间点的意思就是“某一刻”,比如 2000年1月1日1点1分1秒 那一刻(后台记录的是unix时间,从1970年开始计算) 时长就是某一刻与另一刻的差,也就是耗时 函数 Sleep函数 time.Sleep(time.Duration) 表示睡多少时间,睡觉时,是阻塞状态 fmt.Println("start sleeping...") time.Sleep(time.Second) fmt.Println("end sleep.") //【结果】...阅读全文
相关链接 Golang的docker尝试https://studygolang.com/articles/11427 基础命令 docker ps -a 列出所有容器 docker stop
“将一切不可能变成可能!”这正是Internet赋予这个时代的定义。在移动Internet的展开进程中,app成就了手机在智能设备中的霸主地位,手机也同样成就了app无可限制的交易价格!现现今,app已become人们日常生活中再寻常不过的一种工具,在享受app带来便利服务的同时,可能大伙并不会关注开发一款app到底有多难,但对于许多移动创业公司,怎地样让事情能快速落地,迈出产品到运营的第一步,却become许多创业者头疼的问题。那么,到底需要具备什么样的本事本领开发一款app呐?伏笔君通过本文为你逐一发表!售前工程师在大部分软体服务公司,每个项目都配有售前工程师的岗位,在立项时,需要具备一份完整的开发要求文档,初期筹划的越充分,后续问题出现的几率就越少。【具备妙技】对不一样产品的功能、技术...阅读全文
package main import "fmt" func adder() func(int) int{ //sum的值可以改变 sum:=0 return func(v int) int { sum+=v return sum } } //正统函数式 type adder1 func(int) (int,adder1) func adder2(base int) adder1{ return func(v int) (int, adder1){ return base+v, adder2(base+v) } } func main() { a:=adder() for i:=0;i<10;i++{ fmt.Println(a(i)) } b:=adder2(0) for j:=0;j<1...阅读全文
请教一个问题,SQLSERVER中时间和GOLANG查的时间差1秒,如何处理。。。   语句如下 srcData, _ := app.PLADB.DB.Query("SELECT top 1 StartTime FROM HN_NCMS.dbo.History WHERE ID...阅读全文
公众号原文地址:https://mp.weixin.qq.com/s/KmT-Mu4YQDeaQY_95waj-Q 本篇目录 本篇目录 说明 正确使用正确的资料 最权威的 Go 语言资料是? Go 语言的 map 是否是并发安全的? 扩大搜索范围 找到答案不等于结束 为什么要执着于一手资料? 参考 说明 相比于细节,更在意知识框架的构建和完善,因此有时候对一些技术细节不是很清楚,只是知道如何找答案。最近要认真编码,需要仔细考虑、敲定细节,趁此机会将 Go 语言的知识整理一下。 正确使用正确的资料 找到正确的资料、能够正确的使用、正确的理解,是最关键的一步。除非是初学者,否则不要使用二手、三手和倒了无数手的资料,长期来看使用非一手资料,就是在浪费时间和引入错误。第一手的资料常常晦涩难懂,需要经...阅读全文
golang调用MySQL数据库:使用MySQL数据库 go语言中文网 Golang Mysql笔记(二)--- CURD基础 操作 语句 创建数据库 create database dbname; 删除数据库 drop database dbname; 选择数据库 use dbname; 创建数据表 create table table_name(column_name column_type); 删除数据表 drop table table_name; 删除表全部数据,保留表结构 truncate table table_name; 删除带条件的删除,表结构不变 delete from table_name where xxx(条件); 插入数据 insert into table_na...阅读全文
在现实的分布式系统中,不能可能保证集群中的每一台机器都是100%可用可靠的,集群中的任何机器都可能发生宕机、网络连接等问题导致集群中的某个节点不可用,这样,那个节点的数据就有可能和集群不一致,所以需要有一种机制,来保证在大多数机器都存在的情况下向外提供可靠的数据服务。这里的大多数节点指的是集群半数以上的节点。 raft算法就是一种在分布式系统中解决集群中多节点之间数据一致性的算法。Golang生态圈中大名鼎鼎的etcd就是使用的raft算法来保持数据一致性的,与raft类似的一致性算法还有Paxos算法、Zab协议等。 其实,raft算法维持数据一致性的核心思想很简单,就是:“少数服从多数”。 leader选举 保证数据一致性,最好的方式就是只有唯一的一个节点,唯一的这个节点读,唯一的这个节...阅读全文
前序一般的订单流程思考瓶颈点订单队列第一种订单队列流程图:第二种订单队列流程图:总结实现队列的选择解答第二种队列的 Go 版本例子代码前序本文所要分享的思路就是电商应用中常用的订单队列。一般的订单流程电商应用中,简单直观的用户从下单到付款,最终完成整个流程的步骤可以用下图表示: 其中,订单信息持久化,就是存储数据到数据库中。而最终客户端完成支付后的更新订单状态的操作是由第三方支付平台进行回调设置好的回调链接 NotifyUrl,来进行的。补全订单状态的更新流程,如下图表示: 思考瓶颈点服务端的直接瓶颈点,首先要考虑 TPS。去除细分点,我们主要看订单信息持久化瓶颈点。在高并发业务场景中,例如 秒杀、优惠价抢购等。短时间内的下单请求数会很多,如果订单信息持久化 部分,不做优化,而是直接对数据库...阅读全文
数组的长度在定义后无法再次修改,数组是值类型,每次传递都会产生一份副本,显然这种数据结构无法满足正式开发的需求,为此golang提供了数组切片 数组切片就像是一个指向数组的指针,数组切片有自己的数据结构,而不仅是一个指针。 切片的定义 切片可以通过make()创建 格式 make([]type , 长度 ,容量),如: a := make([]int, 10, 10) 上面演示了创建一个类型为int,长度为10的切片 slice是可变长的,长度表示的是数组的出始长度,容量表示slice可以容纳的元素容量,容量未设置时,默认容量等于数组长度,slice的长度和容量分别可以使用 len() 与 cap() 获得 slice也可以使用数组来生成 格式 array[start:end] start表...阅读全文
# command-line-arguments ld: warning: text-based stub file /System/Library/Frameworks//CoreFoundation.framework/CoreFoundation.tbd and library file /System/Library/Frameworks//CoreFoundation.framework/CoreFoundation are out of sync. Falling back to library file for linking. ld: warning: text-based stub file /System/Library/Frameworks//Security.fram...阅读全文
二叉树的遍历,无论是在leetcode刷题或者面试过程中,都是十分常见,重要性无需赘述。本文将采用Golang语言来实现前/中/后/层四种遍历方式。 二叉树定义 // 二叉树节点定义 type TreeNode struct { Val int Left *TreeNode // 左子树 Right *TreeNode // 右子树 } 二叉树样例 一. 前序遍历 遍历顺序 中 -> 左 -> 右。 代码实现 // 前序遍历 func PreOrderTraversal(tree *TreeNode) { if tree == nil { return } fmt.Printf(" %d -> ", tree.Val) PreOrderTraversal(tree.Left) PreOr...阅读全文
说明 之前翻译的一个教程(没有备份原地址,梯子被封了)。原地址找到后补上 正文 使用预设的记录器可以节省时间,但如果确定要调整记录器,需要探索自定义记录器的方法 使用zap配置结构体创建记录器 可以使用配置zap.Config创建记录器,这是一个结构体,可以使用需要的值填充结构体,然后调用结构体的.Build()方法来获取记录器 cfg := zap.Config{...} logger, err := cfg.Build() 需要注意的是:zap.Config的结构体没有默认值,至少为zap需要的三个设置提供值 encoder: 只需要添加个Encoding:"XXX",使用json就会创建一个JSON的encoder,另一个值是console 可以使用结构zapcore.EncoderC...阅读全文
最近闲来无事,即将毕业,把自己卖给了杭州的招银网络,正好利用这段时间可以好好学习以下Go语言。 从高中开始接触编程,当时还是用的Pascal语言,主要是为了参加信息竞赛,后来上了大学,大二开始学习Java便开始了我的Java旅程。到现在,已经用Java用了快六年了,前段时间找工作深深体会到了Java的美妙之处——需求量大。哈哈,相比实验室中用C/C++的小伙伴们,真的是太幸福了!!! 好基友本科毕业后就去了聚美优品,两年前就和我提到过Golang,说是很有前途,当时还没什么感觉,也就没有当回事。直到前段时间,听说B站和一些公司,后台系统用Golang重构了,加上区块链的出现,感觉未来即使Golang不是最屌的,也会是主流。 说实话,重新学习一门语言,说简单也简单,说不简单也不简单。最近主要就...阅读全文
golang 的日期时间包:time 的使用方式。 time package 包含了 time.Time 时间对象 及 构建此时间对象的一些方法(time.Unix(), time.Parse()) golang 可精确到 nanosecond,故相应的函数返回值或参数都已纳秒为单位,我们可以借助time.ParseDuration(durationString string)友好的生成纳秒度量的时间跨度值 golang 的时间格式串Layout固定为 2006-01-02 15:04:05 golang 默认使用 Local 即本地时区,可以通过 time.LoadLocation(zoneName string) (*Location, error)来设定时区 时区构建/格式化模式串 /...阅读全文
译自Rust futures: an uneducated, short and hopefully not boring tutorial - Part 4 - A "real" future from scratch本文时间:2018-12-03,译者:motecshine, 简介:motecshine 欢迎向Rust中文社区投稿,投稿地址 ,好文将在以下地方直接展示 Rust中文社区首页 Rust中文社区Rust文章栏目 知乎专栏Rust语言 sf.gg专栏Rust语言 微博Rustlang-cn Intro 上三篇文章我们阐述如何处理Future的基础知识, 我们现在能组织多个Future成为一个Future chain, 执行他们,甚至创建他们.但是到现在我们的Future还没有贴...阅读全文
package main import ( "fmt" "strings" "strconv" ) type Node struct { Data int Left *Node Right *Node High int } func main() { // 根据输入构建完全二叉树, 并找出根到节点和为给定值的所有路径 // 输入 // 22 // 10,5,12,4,7 // 输出 // 10,5,7 // 10,12 // // 使用栈对树进行深度优先遍历,利用树高更方便寻找判断路径 paths, err := findPath(22, "10,5,12,4,7") fmt.Println(paths, err) } // 查找路径 func findPath(sum int, nodeV...阅读全文
一年一度的圆周率日就要到了,是的,就是3月14日,因为它与圆周率π的前几位3.14的数字一样。我们知道,传说中祖冲之计算圆周率用的是“割圆术”的改进方法,可惜我们大多数现代人的脑子已经无法理解这种方法了。使用其他的复杂公式也有,但人的脑子更不容易理解,但有一个异想天开的方法你知道吗?任何人可以简单地去计算出Pi呢(下面我们都用Pi来代替圆周率π吧,好写好认,:p)。这个方法源自概率论的基础,叫做蒙特卡洛法,形象一点的话我们也可以把它称为随机落点法,我们先说说它的原理:我们先看看下面这张图 假设有图中的一个正方形和一个刚好套在它中间的圆形,可以很直观地看出:圆形的半径如果是R的话,正方形的边长就是2R。圆形的面积根据公式是Pi乘以R的平方,也就是 Pi × R × R = PiR²正方形的面积...阅读全文
1.进程、线程、协程区别 a.各自特点 参考《详细介绍 进程、线程和协程的区别》 进程:拥有自己独立的堆和栈,既不共享堆,也不共享栈,进程由操作系统调度; 线程:拥有自己独立的栈和共享的堆,共享堆,不共享栈,标准线程由操作系统调度; 协程:拥有自己独立的栈和共享的堆,共享堆,不共享栈,协程由程序员在协程的代码里显示调度。 协程与线程:每个单位时间内,一个CPU只能处理一个线程(操作系统:thread),线程是CPU处理的单位或单元,底层资源占用中等(比进程少)。线程中程序的执行过程是:同步阻塞的(依次执行),非抢占式的(依代码编写顺序)。开发上比较清晰明了。协程是“用户级”的线程,通过把线程的分段运行:主动暂停、主动运行,切换逻辑点,针对i/o请求可以节约连接、对方处理的中间环节等待时间,一...阅读全文
Go语言正在构建的垃圾收集器(GC),似乎并不像宣传中那样的,技术上迎来了巨大突破。那么,与Java语言作对比之后,该怎么选择呢?小编整理了一些java进阶学习资料和面试题,需要资料的请加JAVA高阶学习Q群:664389243 这是小编创建的java高阶学习交流群,加群一起交流学习深造。群里也有小编整理的2019年最新最全的java高阶学习资料!写在前面最近,我读到一些大肆宣传Go语言最新垃圾回收器的文章,这些文章对垃圾回收器的描述让我感到有些厌烦。这些文章有些是来自Go项目。他们宣称GC技术正迎来巨大突破。Go团队在2015年8月发布的新垃圾回收器的启动声明:Go正在构建一个划时代垃圾回收器,2015年,甚至到2025年,或者更久……Go 1.5的GC把我们带入了一个新时代,垃圾回收停顿...阅读全文
函数func Go函数不支持嵌套、重载和默认参数 但是支持一下特性 无需声明原型、不定长度变参、多返回值、命名返回值参数 匿名函数、闭包 定义函数使用关键字func,且左大括号不能另起一行 函数也可以作为一种类型使用 1234567891011121314151617181920212223//commomfunc main() { a,b,c,d := 1,2,3,4 test(a,b,c,d)}func test(s ...int) { fmt.Println(s)}//closurefunc main() { test := test(1) fmt.Println(test(1))}func test(a int) func(int) int { return func(b int) ...阅读全文
摘要: 近日,阿里云宣布推出经典网络迁移VPC完整解决方案,帮忙云上老用户平滑迁移到VPC。 阿里云起步于经典网络,但已经全面转向VPC。专有网络VPC(Virtual Private Cloud)以其在安全、成本和网络功能方面的优势,正受到越来越多用户的欢迎,已经成为云上用户的首选网络类型,也是阿里云默认推荐的网络类型。 近日,阿里云宣布推出经典网络迁移VPC完整解决方案,帮忙云上老用户平滑迁移到VPC。 阿里云起步于经典网络,但已经全面转向VPC。专有网络VPC(Virtual Private Cloud)以其在安全、成本和网络功能方面的优势,正受到越来越多用户的欢迎,已经成为云上用户的首选网络类型,也是阿里云默认推荐的网络类型。然而,云上还有很多存量用户在使用经典网络,为了...阅读全文
本人是c++开发者,最近接触Go,非常喜欢,准备转Go。 事情是这样的,目前公司的一个C++项目要使用一个分布式数据库进行数据存储和访问,我在学,能不能用Go的框架进行开发数据库,然后通过C++进行数据库的访问?这样做是否有意义,是否能在短时间内完成呢?请各位大神帮我出点主...阅读全文
2018-10-27笔记 花了一天搭建的环境。 首先安装依赖 $ sudo apt update $ sudo apt install -y libsnappy-def zlib1g-dev libbz2-dev libltdl-dev libtool 搭建go环境,并且安装/maxbrunsfeld/counterfeiter和golang/tools 搭建docker,并且安装docker-compose 安装chaintool $ cd /usr/local/bin $ sudo wget https://github.com/hyperledger/fabric-chaintool/releases/download/v0.10.3/chaintool $ chmod +x chai...阅读全文
package main import ( "fmt" "sort" ) //type value []string type value [][]int func (p value) Len() int { return len(p) } // 二维切片排序 func (p value) Less(i, j int) bool { for k := 0; k < len(p[i]); k++ { if len(p[j]) == 0 || p[j] == nil { // 长度为空时 return true } fmt.Println(p, i, j, k) if p[i][k] > p[j][k] { // < 则正序 return true } else if p[i][k] == p[...阅读全文
项目地址:https://github.com/rakyll/hey项目简介:HTTP负载发生器,是ApacheBench(ab)替代品用法:选项:-n 运行的的请求数。默认200.-c 并发运行请求数,请求数不能小于并发级别。默认值50-q 速率限制,已每秒查询(QPS)为单位。默认没有限制。-z 发送请求的应用程序配置,当时间到了应用程序停止并退出,如果指定了持续时间,则忽略n-o 输出类型。如果没有提供就打印在终端。csv是唯一支持的替代方案,转储文件的响应以逗号分割。 -m HTTP method, one of GET, POST, PUT, DELETE, HEAD, OPTIONS.-H 自定义HTTP头,可以通过重复的标记指定所需的头。例如 F -H "Accept: tex...阅读全文
defer 匿名函数特性 执行方式类似其它语言中的析构函数,在函数体执行结束后按照调用顺序的相反顺序逐个执行 //执行顺序相反 package main import "fmt" func main() { fmt.Println("a") defer fmt.Println("b") defer fmt.Println("c") } /*输出 a c b */ 即使函数发生严重的错误也会执行,类似于try...except 常用于 资源清理,文件关闭,解锁以及记录时间等操作 支持匿名函数的调用 通过于匿名函数配合可在return之后修改函数计算的结果 -如果函数体内某个变量作为defer时匿名函数的参数,则在定义defer时即已经获得了拷贝,否则 则时引用某个变量的地址 //支持匿名函数 ...阅读全文
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiangxianghehe/article/details/78790744 map概念 Go 语言中 map 是一种特殊的数据结构:一种元素对(pair)的无序集合,pair 的一个元素是key,对应的另一个元素是value,所以这个结构也称为关联数组或字典。这是一种快速寻找值的理想结构:给定key,对应的value可以迅速定位。 map 这种数据结构在其他编程语言中也称为字典(Python)、hash 和HashTable 等。 map声明和初始化 map 是引用类型,可以使用如下声明: make(map[KeyType]ValueType, initialCapacity) make(m...阅读全文
这一篇是接上一篇文章二叉树的基本运算 二叉树的遍历 二叉树遍历分为三种:前序、中序、后序: 前序遍历:根结点 -> 左子树 -> 右子树 中序遍历:左子树 -> 根结点 -> 右子树 后序遍历:左子树 -> 右子树 -> 根结点 另外还有一种层次遍历,即每一层都从左向右遍历。譬如,对于下面的二叉树 前序遍历:abdefgc中序遍历:debgfac后序遍历:edgfbca层次遍历:abcdfeg 实现方法 因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点 中序遍历 go实现 // 中序遍历,用栈实现 f...阅读全文
Go 语言的面向对象 Go 语言的面向对象非常简单,仅支持封装,不支持继承和多态。继承和多态是在接口中实现的。 因此 Go 语言中没有 class,而是通过 struct(结构体) 对相同类型或不同类型的数据进行封装。 通过 type
摘要: 安全组规则如何批量开通常用端口?如何批量对网段授权?本篇将向您介绍ECS控制台中,针对日常维护安全组规则这个典型场景进行的优化改动。 背景 在日常维护安全组时,常见的场景有以下2种: 1.对某个端口范围批量授权多个网段,如:(如:22端口对10.0.0.1/32,10.0.0.2/32,10.0.0.3/32三个网段授权)。 2.对某个网段,批量开通多个端口,如:对10.x.x.xx/16 网段开通22、80、443等端口)。 ECS控制台针对这两个场景,分别提供了两个功能,【添加安全组规则】,解决场景1的问题;【快速创建规则】,解决场景2的问题。之所以没有将两个功能合并,是考虑到在一次操作中同时批量开通多个端口,并对多个网段进行授权,创建出的安全组规则会是一个m ...阅读全文
一、go中使用cmd /bin/bash -c "ls -l" cmd->golang->pipe pipe()创建2个文件描述符,fd[0]可读,fd[1]可写 fork() 创建子进程 fd[1]被继承到子进程 dup2() 重定向子进程 stdout/stderr到fd[1] exec() 在当前进程内,加载并执行二进制程序 例子1 模拟一下cmd调用 package main import ( "fmt" "os/exec" ) func main() { var( cmd *exec.Cmd output []byte err error ) //cmd = exec.Command("/bin/bash","-c","cd /tmp;ls -l") cmd = exec.Comm...阅读全文
title: "Let’s Encrypt证书吊销事故的思考" date: 2020-03-28T00:11:54+08:00 description: "如何保障代码的安全性?" featured_image: "" categories: "其它" tags: [] 前段时间一则新闻引爆了程序界:《一行Golang代码引发的血案——全网最详细分析2020年3月Let’s Encrypt证书吊销事故》。 这个事故的原因上文已经说得很清楚了,这里摘抄一下: 那么这个软件到底出现了什么问题才会导致如此滑稽的故障?我翻看着Let's Encrypt最近的commit,找到了一个Pull Request:#4690。看完这个Pull Request后,我马上意识到问题所在:Golang最经典的错误...阅读全文
翻译自 Go 源码文件 sync/mutex.go。 // sync 包提供了基本的 **同步原语** (synchronization primitives) 例如 **互斥锁**(mutual exclusion locks)。 // 除了 Once 和 WaitGroup 类型,很多是为了低级库的常规使用。 // 高级别的同步最好用通道(channels)和通信(communications)来做。 // // 在这个包下定义的变量或类型不应该被复制使用。 package sync import ( "internal/race" "sync/atomic" "unsafe" ) func throw(string) // 在 runtime 包下提供了此方法 // 一个 Mutex ...阅读全文
Golang: 思路:因为前序和后序是没有办法构建一个唯一的二叉树序列的,所以需要在某些方面自定规则,比如[1,2],[2,1],这里将这种序列定义为一个左子树 代码如下: func constructFromPrePost(pre []int, post []int) *TreeNode { node:=&TreeNode{Val: pre[0]} //长度至少要大于1才能构建子树 if len(pre)>1{ i:=0 for i
import "time" 类型 type Time struct { wall uint64 ext int64 loc *Location } type Month int type Weekday int type Duration int64 常用函数和方法 函数: Now() Time 当前Time Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time //返回一个设置的time类型 Since(t Time) Duration //time.Now().Sub(t) Unix(sec int64, nsec int64) Time // 时间戳转时间 1sec = 1nsec ...阅读全文
Golang: 思路:链表,这题最简单的思路是,链表存进数组,然后一次性解决。再复杂一点就是,链表从中间分开,后半部分反转,然后再和前半部分依照特定规律合并。这里给简单思路,个人觉得这题没必要追求空间复杂度。 代码如下: func reorderList(head *ListNode) { node:=head if node==nil||node.Next==nil||node.Next.Next==nil{ return } var arr []*ListNode arr=append(arr, head) length:=1 for node.Next!=nil{ length++ node=node.Next arr=append(arr, node) } for i:=0;i