docker-compose不适的地方
docker-compose会自动生成网桥,然后提供一个网段,问题就是有的时候会跟公司的网段冲...阅读全文
docker-compose会自动生成网桥,然后提供一个网段,问题就是有的时候会跟公司的网段冲...阅读全文
目前看的是 数据结构(第二版 严薇敏...阅读全文
hadoop是大数据开发学习重要知识点,也是大数据开发工作必备技能,有些人员想学习hadoop,更多的是关系培训时间和学费,那么hadoop培训到底需要多长时间呢? 首先我们要了解的是,hadoop培训的时间长短,跟以下几个因素有关。 首先培训多久跟学习者的自身基础水平有关,同样的内容,之前有过相关基础的人来学习,肯定要比没有基础的人更快,这个是正常现象。既然谈到了有没有基础这个事情,就多说一句,如果你有java的经验,那么在学习hadoop等大数据相关的内容的时候,会更容易理解,学习效率也更高。而对于什么基础都没有的,也不要担心,调整好心态,一步步来,最终结果取决于自己,而不是取决于是否有基础。 另外既然谈到培训,那么最重要的必然就是课程,目前市面上的hadoop大数据培...阅读全文
项目时间的估算对项目的成败至关重要。项目时间管理包括了项目按时完成所需的各个过程。但是,在实际项目中,经常出现项目延期,估算严重不准确的现象。 预估时间本身就很难。每个程序员的估计都会跟真正需要的时间有些差距。估计时间短了说明有些事情被忽略了(编译,测试,提交代码)。估计时间超了说明任务太大,难以理解。 对于资历较浅的程序员,这种估计误差是混乱的,他们经常会轻视一些任务,同时又对一些稍微有难度的任务过分高估。我认为,对一个有经验的程序员,一个任务的时间应该在半小时到24小时之间,超出24小时的任务都需要拆分。程序员在脑中想一想可能会认为要60小时,但实际上即使是很有经验的程序员也需要将任务分成可控的模块再来分析做决定。 还有一个很重要的需要认识到的一点是,编程上的经验并不等同于时间估计上的经...阅读全文
早上八点,上班的地铁上,我习惯性的打开工作微信查看。有一个陌生人要求加我为好友,出于猎头的直觉(又是一名求职者),我马上通过他的请求。刚一通过请求他便发来信息(我暂且用A来称呼他)。“你好,你们公司还招人吗?”A发来微信。“你好,请问是从哪里看到我的招聘信息的?”我发问到。作为一名专业的猎头,利用的渠道实在是太多了,所以会先确定一下求职者是通过哪个渠道找到我的。“某某社区”A回答到。 随后我向他说明自己是猎头,并不是甲方公司及确定他是否找我推荐职位后,就进入了职位沟通环节。我习惯性的先了解对方的背景,所以我随即便向他索要简历,这也是减少双方在没必要的环节浪费时间。他回答说没有现成的简历,我便开始询问一些常规性的却也是至关重要的问题:1.你工作几年了?答:五年2.什么学校毕业的?答:某某工学院...阅读全文
运行了好长时间的进程忽然挂了,结果打出好长的堆栈,显然是goroutine泄漏了。 逻辑很简单只是定时从指定api取值而已,怎么会泄漏呢? net/http.(*Transport).getConn //获取连接 /usr/local/go/src/net/http/transport.go:1004 created by net/http.(*Transport).getConn //建立新连接 /usr/local/go/src/net/http/transport.go:998 net.(*Resolver).LookupIPAddr //DNS查询 /usr/local/go/src/net/lookup.go:227 created by internal/singleflight...阅读全文
### 转让两张 2020 年 gopherchina 的票! 官方地址,gopherchina.org/ 我去了好几界了,这次由于时间差不开,所以便宜转让两张早鸟的票。 我购买的是在午饭的,版本。 如果大家需要,可以联系我: 一八六 0294 六九 80 微信同...阅读全文
先贴问题: Delete Operation for Two Strings Given two words word1 and word2, find the minimum number of steps required to make word1 and word2 the same, where in each step you can delete one character in either string. 说白了就是找到两个字符串非连续最大公共字符串。如果对dp算法很熟悉的很快就能想到这个问题的解法,然而我并不是很熟悉,所以用了一个很挫很慢的方法,个人理解应该是分治法,很多步骤被重复算了很多次。 写的很搓,轻喷。 下面就要介绍一下简单易懂的dp算法啦,先上代码(leetco...阅读全文
func Try(f func(), catch func(interface{}), finally func()) { defer func() { if finally != nil { finally() } }() defer func() { if err := recover(); err != nil { if catch != nil { catch(err) } else { //loglogic.PFatal(err)//改成你自己的输出代码 } } }() f() }如果想开一个新的协程来跑你的方法时func GoTry(f func(), catch func(interface{}), finally func()) { go Try(f, catch, fina...阅读全文
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.") //【结果】...阅读全文
package main import "fmt" type Album struct { music []string } func main() { a1 := Album{music: []string{"music", "music2"}} a2 := Album{music: []string{"music", "music2"}} fmt.Println(a1 == a2) } 上面这段程序无法编译,报错: invalid operation: a1 == a2 (struct containing []string cannot be compared) 是因为结构体内的切片不具有比较性。 切片类型、字典类型、函数类型的值是不具有可比性的...阅读全文
一致性算法 - Raft Raft 状态 一个 Raft 集群包含若干个服务器节点;通常是 5 个,这允许整个系统容忍 2 个节点的失效,每个节点处于以下三种状态之一: follower(跟随者) :所有结点都以 follower 的状态开始。如果没收到 leader消息则会变成 candidate状态。 candidate(候选人):会向其他结点“拉选票”,如果得到大部分的票则成为leader。这个过程就叫做Leader选举(Leader Election)。 leader(领导者):所有对系统的修改都会先经过leader。 Raft 一致性算法 Raft通过选出一个leader来简化日志副本的管理,例如,日志项(log entry)只允许从leader流向follower。 基于lead...阅读全文
本人最近新学GO,为了能够深入了解GO,于是计划使用GO实现一个高并发、IO密集操作的ETL程序。闲话不多说,今天完成了ETL中最基本的要素,定时器。首先了解到GO中的time.Ticker不适用到高精度的定时器,因为ETL任务周期设定是1分钟,故此处无需高精度的定时器(对于高精度的定时器,在网上看到有人使用时间轮实现timewheel,我也看了实现,并且也按其思路实现了一版,此处略去)。封闭的类型:TimeTicker,使用示例代码如下:func main() { var tt *timeticker.TimeTicker = timeticker.New(3*time.Second) //创建一个3秒钟执行一次任务的定时器 e := tt.AddJob(job, true) //向此定时...阅读全文
题目 题目地址https://tour.go-zh.org/moretypes/23 练习:映射 实现 WordCount。它应当返回一个映射,其中包含字符串 s 中每个“单词”的个数。函数 wc.Test 会对此函数执行一系列测试用例,并输出成功还是失败。 你会发现 strings.Fields 很有帮助。 答案 package main import ( "golang.org/x/tour/wc" "strings" ) func WordCount(s string) map[string]int { sFields := strings.Fields(s) var resMap = map[string]int{} for _,v := range sFields{ resMap[...阅读全文
#### 自己业余时间学习GO语言,参考网上文章,利用layUI+Go+MySQL写了个小网站(博客+后台管理+即将开始的进销存系统),欢迎大家提意见,多交流,有能一起开发进销存的最好了 ### [我的测试网站 http://www.haowd.top](http://www.haowd.top "我的测试网站") ### 第一次用WEB方面的程序,见笑了,大家多指导。 #### 部分代码示例: **控制器:** ``` package controllers import ( "strings" "github.com/astaxie/beego" "github.com/lwx3i/ydd/models" "github.com/lwx3i/ydd/util" ) // NextPrep...阅读全文
//当前时间 t := time.Now() fmt.Println(t.Format("2006-01-02 15:04:05")) fmt.Println(t.Year(), int(t.Local().Month()), t.Day()) //时间戳10位 秒 fmt.Println(time.Now().Unix()) //时间戳13位 毫秒 fmt.Println(time.Now().UnixNano() / 1e6) //时间戳转时间 sec := time.Now().Unix() fmt.Println(time.Unix(sec, 0).Format("2006-01-02 15:04:05")) //时间转时间戳 fmt.Println(time.Date(2020, ...阅读全文
Hello,各位小伙伴大家好,我是小栈君,今天给大家带来的分享是关于关于二叉树相关的知识点,并用go语言实现一个二叉树和对二叉树进行遍历。 我们主要针对二叉树的概念,go实战实现二叉树的前序遍历、中序遍历、后序遍历。 二叉树概念 在计算机科学领域内,二叉树代表的是具有两个节点的树形结构,通常子树被称作为“左子树”,右边的被称作为“右子树”。二叉树通常的应用于实现二叉查找树和二叉堆。 例如上述图片中,我们就制定了一个二叉树,其中d、e、f称作a树的叶子节点。 [叶子结点是离散数学中的概念。一棵树当中没有子结点(即度为0)的结点称为叶子结点,简称“叶子”。 叶子是指出度为0的结点,又称为终端结点] b和c 作为树a的孩子结点,b和a因为作为一个根a的孩子,所以他们的称呼为兄弟结点。其实总结一点就...阅读全文
这个防盗链真是烦,图片要自己一个一个上传。 时间没把握好,睡得多了点,玩的多了点,明天两篇阅读。 四月份的计划:计划尽量固定时间段 1.上午三番茄,中午13:00睡一会,下午四个番茄【主java,基础知识;副golang的区块链】 2.背单词都在傍晚,和15分钟的听力,一篇阅读连在一起 3.半小时阅读 4.晚上,听力精听课 额外:要多翻看单词本,可以看看笔记,整理下逻辑结构,补充相应的复习视频 多出来的边角时间,可以刷b站,看视频。 要知道人家有的自学的,一天学10小时,光是时间,一天就顶我好几天,以后,学习量是会慢慢增加的...阅读全文
[公司名称] 北京云联万维技术有限公司 [公司介绍] 美团云核心成员离职创业项目,团队实战经验丰富,经历了美团网从千团大战到本地生活服务第一平台的整个过程。在当今云计算普及以及混合云 /多云趋势基本确定的背景下,团队专注多云管理,期待帮助客户打造企业级全栈多云管理平台,为客户提供从资源管理到应用交付等全栈解决方案。团队组建之初,即获得真格基金徐小平老师的投资。被徐小平老师评价为:近期见到的最强的创业团队! 我们秉承:"让 IT,更简单"的使命,期待打造企业级全栈多云管理平台! 团队靠谱 /学习成长 /有激情 /有梦想 /有期权 /福利好! 加入我们,一起创造精彩! www.yunionyun.com [工作地点] 北京市朝阳区酒仙桥路甲 10 号星...阅读全文
首发于:http://blog.shajiquan.com/2015/12/golang-time-format/ 今天有人在群里问: 问一个时间格式化问题: fmt.Println(time.Now().Format("2006year 01month 02day")) 2015year 12month 18day fmt.Println(time.Now().Format("2015year 01month 01day")) 181253year 12month 12day 为什么? 困扰好久 首先,这是一个很奇葩的问题。 其次,我,以及比我对 Golang 更了解的朋友,都掉过这个坑。我们曾在这个问题上,花了很多时间,最后发现是 Golang 自己的奇怪设定导致。尤其是,一段时间不用 ...阅读全文
文:《A Step-by-Step Guide to Go Internationalization (i18n) & Localization (l10n)》 译者按:原文写得超详细,让我学习了 Go 中未曾使用到的但很有用的 i18n 知识,因而有了翻译文章的想法。 在征得原文作者同意的前提下,我开始了翻译工作。为了适应中文读者,我修改了原文中部分示例代码,还将 其中的希腊文,替换成了简体中文。 概述 Go 是静态编译的编程语言,最近很受欢迎,因为它简单、性能好而且非常适合开发云端应用。它有强大的能够 处理国际化(i18n)和本地化(l10n)的库,比如处理字符编码、文本转换还有特定地区的文本,但这个包的 文档写得不够好。让我们来看看该怎么使用这个库,并且让我们的 Go 程序能适应不同...阅读全文
描述 根据一棵树的前序遍历与中序遍历构造二叉树 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 思路 前序遍历中,第一个节点即根节点 在中序遍历中,找出第一个节点的位置,根节点前面的 L 个数据,即根节点左子树的中序遍历数据,前序遍历中根节点后面的 L 个数据即左子树的前序遍历 右子树同上 简而言之,确定了根节点,确定了左子树和右子树的数据,递归对左子树和右子树进行重建 代码实现 // 根据一棵树的前序遍历与中序遍历构造二叉树 // TreeNode Definition for a binary tree no...阅读全文
一直挺想用 go 的,但是没想到能干啥,前段时间正好有个任务导入 Excel 到后台数据库,用 Python 的话我可能分分钟就写好了,但是作死的我就想试下 go,因为 go 可以打包成可执行程序包,然后就可以不依赖 go 的环境。 直接编码 使用 flag 获取终端参数解析 path := flag.String("path", "", "excel 路径") url := flag.String("url", "**", "服务器地址") flag.Parse() 这里定义了 path 路径和服务器地址 url,唯一需要注意的是,这里变量返回都是指针。flag 有个好处,他的参数都是形如(defaultValue,$description),所以在执行 -h 的时候,都会返回 key 以...阅读全文
Ticker 最近的项目用go实现的服务器需要挂载大量的socket连接。如何判断连接是否还存活就是我们需要考虑的一个问题了。 通常情况下面,socket如果被客户端正常close,服务器是能检测到的,但是如果客户端突然拔掉网线,或者是断电,那么socket的状态在服务器看来可能仍然是established。而实际上该socket已经不可用了。 为了判断连接是否可用,通常我们会用timer机制来定时检测,在go里面,这非常容易实现,如下: ticker := time.NewTicker(60 * time.Second) for { select { case <-ticker.C: if err := ping(); err != nil { close() } } } 上面我们使用一个...阅读全文
Go commons pool是一个通用的go语言对象池,基于Java版本的Apache Commons Pool改写。Go commons pool实现了Java版本的主要功能,改写了大多数Java版本的测试用例,测试覆盖率达到90%,性能测试结果和Java版本的相近,已经可以用于生产环境,于是发布1.0版本。 Go commons pool保留了Java版本的主要功能,包括: 自定义的 PooledObjectFactory. 丰富的设置选项,可以精确控制对象的生命周期。详细参看ObjectPoolConfig。 对象池是否是 LIFO (后进先出) 或者是 FIFO (先进先出) 对象池的容量控制 对象池对象的验证配置 获取对象时是否阻塞以及最大等待时间配置 对象池对象的回收机制配置(...阅读全文
初步看了下GO语言的基本语法,只是看不写代码很快就看了后面就忘了前面了,所以还是要实战,但是只是写几个题目感觉有点浪费时间,突然间想到一直想着做算法题来着,所以这次就是用GO来实现算法题吧,一方面可以加深是用GO的语法,一方面也提高自己的算法水平,一箭双雕。 ---------------------------------------- 变量 ---------------------------------------- 1) 如果一个变量没有被用到,GO的编译会报错,而不是像JAVA这样报警。所以如果是遍历数组时使用range,不使用下标值时就使用_代替: for _, r := range result { --------------------------------------...阅读全文
好久没学习东西了, 前段时间有点过于放纵, 天天打游戏, 现在需要写点东西来减轻罪恶感. 对Rabin-Karp早有耳闻, 它可以在Golang官方库中找到, 当初粗略看了下觉得有点复杂就没仔细研究, 现在就看看它吧. 什么是Rabin-Karp算法 Rabin-Karp算法用来解决一个"简单"的问题: 在一个字符串中定位子串的位置. 同样的算法还有: KMP, BM. 关于他两可以再看看这位老哥写的文章:白话分析字符串匹配算法——KMP算法 乍一看这个问题一个for循环就能搞定, 但Rabin-Karp这个神奇的算法能让问题解决得更高效 有趣. 在了解Rabin-Karp之前,我们需要了解for暴力算法的缺点。 暴力算法的缺点 首先从头部开始匹配,如果没匹配到则向后移动一步再次匹配,如此循...阅读全文
package main import ( "fmt" ) func sum(values []int, resultChan chan int) { sum := 0 for _, value := range values { sum += value } resultChan <- sum //将运算结果写到channel中 } func main() { values := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} //定义并初始化了一个大小为10的数字数组 resultChan := make(chan int, 2) //定义大小为2的channel go sum(values[:len(values)/2], resultChan) //开启协程...阅读全文
不使用框架开发项目简直是浪费时间,好的轮子应该拿来就用,今天在安装国人开源的golang框架beego时,在安装bee工具时报错/usr/local/go/pkg/tool/darwin_amd64/link: combining dwarf failed: Unknown load command 0x32 (50),编译错误, 查了好久原来是版本问题,我的版本是1.92,降级到1.11.5解决问题,不知道beego为什么版本高了反而不支持了,,这让我对这个框架的靠谱程度产生了怀疑,而且这个bug的issue起码半年前就有了也没被修复。。。。...阅读全文
随着智能互联网的飞速发展,智能手机的普及,让网民用户对移动端的时候越来越多,浏览网页、查询资料手机浏览新闻、搜索资源、查找销售渠道、网购、订餐等等成为了一种新的生活方式。为了解决移动设备屏幕不同大小的问题,让网站适应每种设备的屏幕大小,所以响应式网站就这样出现了。  那么响应式网站怎么做?对于一般企业建站来说,他们会直接外包给建站公司或者团队进行网站开发搭建,而企业网站就如同互联网上的一张名片,定制化网站少则几千,多则上万,很多定制网站只是把界面稍加改动,实力强一点的企业可能稍好一些,其实目前企业想要建设...阅读全文
今天开始进入golang语言的学习,golang语言的安装和测试就不再这里讲解了。网络上有不少资料可以参考。 学习Golang语言(1): Hello World 学习Golang语言(2): 变量 学习Golang语言(3):类型--布尔型和数值类型 学习Golang语言(4):类型--字符串 学习Golang语言(5):类型--数组 学习任何编程语言的第一个程序都是Hello world,我就不打破这个传统了。看看Go的"Hello World"吧。 package main import "fmt" //引入fmt库 func main() { fmt.Println("Hello World!") } 逐行分析这段程序: 第一行是必须的。所有Go语言编写的文件都以package <*...阅读全文
程序员是一个高薪的行业,也是一个门槛比较高的职业,能进入这行是好多人的愿望,近几年来这行的人也是越来越多,每年都在持续增长,那么怎么才能保持持久的竞争力而不被淘汰了,除了一些精神品质上下功夫外,如耐心,勤奋,能吃苦之外,再加一些学习的技巧是十分有必要的。下面我就从以下几方面来说起。不断的巩固基础首先技术是一个熟练工种,没有不断的实践,不断的巩固基本功很难在这方面出人头地的,做为一名程序员,要想优秀,比需有一定代码量的积累才是可以的,如果平时有项目,就积极的参与项目,增加自己的实战机会,项目不紧的时候,可以看一些书籍,敲一些各种形式的代码,争取自己的代码量远远高于其他人,这样在基本功上时间久了,你就会高于其他人,这是硬功夫,其他人就很难超越,要想超越,就要花同等时间去超越,这样你和其他人之间...阅读全文
package main import ( "fmt" "runtime" "strings" ) func main() { myTest() } func myTest() { str := "hello , i am error" myLog(str) } func myLog(str string) { //func Caller(skip int) (pc uintptr, file string, line int, ok bool) pc, file, line, ok := runtime.Caller(1) names := strings.Split(file, "/") if ok { fun := runtime.FuncForPC(pc) fmt.Println("...阅读全文
课程介绍 专有网络VPC可以帮助您基于阿里云构建出一个隔离的网络环境,并可以自定义IP 地址范围、网段、路由表和网关等;此外,也可以通过专线/VPN/GRE等连接方式实现云上VPC与传统IDC的互联,构建混合云业务。 产品详情:https://www.aliyun.com/product/vpc 课时列表 • 课时1:专有网络介绍 • 课时2:创建专有网络 • 课时3:创建交换机 • 课时4:在交换机中创建云产品实例 • 课时5:添加自定义路由 开始学习:http://click.aliyun.com/m/27843/ ...阅读全文
缓存模式 基于内存buffer的发号器架构如图,这也是目前我在维护的发号器之一 优点:1.水平扩展方便2.对高并发支持良好3.数据库依赖较低,只在buffer耗尽时需请求数据库,连接失败情况下仍可实现较长时间发号4.该服务目前支持step发号返回的id格式符合 id=startID+idStep*n5.该服务支持一次获取多号,性能与单个发号相近缺点:1.集群情况下,发号为趋势递增而非严格递增(趋势递增指ID整体上是增加且唯一的,但不是严格两次发号都差1,比如两台服务器A持有1001-2000 B持有2001-3000 两次发号请求分别到了AB两个机器,得到1001 和2001)2.重启服务后未用完的号段作废 实现: 服务以worker方式工作,一个serviceID对应一个worker,以服...阅读全文
**摘要**: 2017年中国大数据技术大会于12月7-9日在北京新云南皇冠假日酒店隆重举行, 大会就大数据时代社会各行业的智能化进程和行业实践展开深入讨论。 在12月8日的“大数据分析与生态系统”分论坛上,来自阿里巴巴计算平台事业部的高级技术专家少杰,以“MaxCompute 复杂数据分布的查询优化实践”为题,为现场来宾分享了阿里云MaxCompute最新技术与实践的洞察与经验。 2017年中国大数据技术大会于12月7-9日在北京新云南皇冠假日酒店隆重举行, 大会就大数据时代社会各行业的智能化进程和行业实践展开深入讨论。 在12月8日的“大数据分析与生态系统”分论坛上,来自阿里巴巴计算平台事业部的高级技术专家少杰,以“MaxCompute 复杂数据分布的查询优化实践”为题,为现...阅读全文
func main(){ arr := []interface{}{true,int16(1),uint8(2),"a",uint16(3),4,int8(5),"c",1.1} for _,v := range arr { fmt.Print(v) fmt.Print(" print type ") switch v.(type){ case bool: fmt.Println("bool") continue case string: fmt.Println("string") break case uint8: case uint16: fmt.Println("uint") case int,int8,int16: fmt.Println("int") default: fmt.Pr...阅读全文
package zip import ( "archive/zip" "io" "os" "path/filepath" "time" ) const zone int64 = +8 func Zip(source, target string) error { zipfile, err := os.Create(target) if err != nil { return err } defer zipfile.Close() archive := zip.NewWriter(zipfile) defer archive.Close() return filepath.Walk(source, func(path string, info os.FileInfo, err error) e...阅读全文
当初之所以学习Go语言,就是因为一句话:Golang天生支持并发。Java中的并发是一个比较复杂的系统,前段时间面试的时候,对于我这种CRUD Boy来说,理解并能应付并发方面的问题着实有些难度。各种概念背了一遍又一遍,current包下的东西来回练习,理解各种并发系统的设计理念,才能勉强应付一些比较水的面试。 经过几天的学习,终于跟着Go指南,学到了并发一节。在这一节中,遇到的第一个练习是判断等价二叉树。 初始代码如下 package main import "golang.org/x/tour/tree" // Walk 步进 tree t 将所有的值从 tree 发送到 channel ch。 func Walk(t *tree.Tree, ch chan int) // Same 检...阅读全文
钱多少不重要,只希望在业余时间能有点事做,有需要的留下联系方...阅读全文
golang 时间处理 package main import ( "fmt" "time" ) const ( date = "2006-01-02" shortdate = "06-01-02" times = "15:04:02" shorttime = "15:04" datetime = "2006-01-02 15:04:02" newdatetime = "2006/01/02 15~04~02" newtime = "15~04~02" ) func main() { thisdate := "2014-03-17 14:55:06" timeformatdate, _ := time.Parse(datetime, thisdate) fmt.Println(timefor...阅读全文
遇到的问题 异步对于绝大多数的开发而言并不陌生,在go语言中异步的实现变得异常方便。只要在执行的方法前加一个go关键字就可以实现异步操作。但是如果需求是,按照调用的先后顺序(FIFO)来返回值我们应该怎么办。大家都知道,一系列的方法调用如果使用了异步执行那么就并不能保证返回的先后顺序,返回的先后顺序取决于每个函数耗时的长短,耗时短的则会先返回。当然解决这个问题的办法有很多,在最近看的一本书中发现了chan嵌套chan可以很巧妙的实现这个需求。 没解决之前 先看一下没有使用嵌套chan的情况。代码很简单,方法operation1 内部sleep 1秒 方法operation2 内部sleep 2秒。5次调用都在goroutine中执行,结果可以看到 5个方法大约耗时2秒。 package ma...阅读全文
基础使用 //获取秒级时间戳 time.Now().Unix() //获取毫秒级时间戳 time.Now().UnixNano()/1e6 //格式化时间 time.Now().Format("2006-01-02 15:04") //字符串转时间格式 t, err := time.Parse("2006-01-02 15:04:05", "2019-05-20 18:30:50") //时间戳转为字符串 t := time.Unix("1558348250", 0).Format("2006-01-02 15:04") 设置时区(中国) //在windows系统上,没有安装go语言环境的情况下,time.LoadLocation会加载失败。 var sh, _ = time.LoadLoc...阅读全文
OAuth Middleware 是一款 OAuth 2.0 授权服务器和 Gin-Gonic 授权中间件。这个库提供了一个基于 Gin-Gonic 的 OAuth 2.0 授权服务器和一个在使用 Gin-Gonic 开发的资源服务器中可用的授权中间件。 **授权服务器使用示例** 此代码段显示如何创建授权服务器...阅读全文
SwarmKit 是Docker公司开源的Docker集群管理和容器编排工具,其主要功能包括节点发现、基于[raft算法](https://en.wikipedia.org/wiki/Raft_%28computer_science%29)的一致性和任务调度等。 ### 基本概念 服务器上运行SwarmKit工具的swarmd命令后,即可将其加入到服务器集群中,该服务器就成为集群中的一个 节点 。SwarmKit将节点分为两类: * 工作节点 负责通过执行器运行任务。SwarmKit的默认执行器为Docker容器执行器(Docker Container Executor); * 管理节点 负责接收和响应用户的请求,将集群状态调节成最终状态。 用户可以动态调整节点的角色。 ...阅读全文
Go语言函数的基本用法! package main import ( "fmt" ) /* 函数function -Go函数不支持嵌套、重载、默认参数 -但支持以下特性: 无序声明原型,不定长度变参,多返回值,命名返回值参数 匿名函数,闭包 -定义函数使用关键字func,且左大括号不能另起一行 -函数也可以作为一种类型使用 */ func A(a int, b string, c int) int { //代表参数有三个,返回值是一个int型 return 1 } func B(a, b, c int) { //参数也可以这样写 } func C() (a, b, c int) { a = 1 b = 1 c = 1 //代表返回值a,b,c,注意在此处abc已经是局部变量 return /...阅读全文
一直想将前段时间研究fabric1.0源码的一些心得体会分享出来,一是在写的过程中自己可以加深理解,二是有些地方代码是看过了,但是总感觉看得不到位,没到火候。 看过1.0的同学应该知道,shim与cc与peer之间千丝万缕的关系,剪不断理还乱。写了这么多年的Java,确实觉得Golang代码别扭,而且goroutine+channel的组合简直是阅读者大杀器。但是Golang的好处显而易见,如果fabric用Java实现,一倍的代码量都不止,而且性能差很多。扯远了,总之习惯成自然。 鉴于fabric已经出到1.4了,更新不可谓不快,改动不可谓不大,再来讲解1.0的实现估计大家都没什么兴趣,我就基于新版做一个系列吧,希望能坚持下来。请大家监督...阅读全文
先看一段程序 package main import ( "fmt" ) func main() { a := []int{1, 2, 3} for _, i := range a { fmt.Println(i) defer p(i) } } func p(i int) { fmt.Println(i) } 运行这段程序,输出结果为 1 2 3 3 2 1 这里就是普通的函数调用,每次调用func p时,完成 i 的值复制,然后打印,此时 i 值复制了3次,分别是1,2,3。由于defer是后进先出,所以执行变成3,2,1 下面我我们用闭包改写下程序: package main import ( "fmt" ) func main() { a := []int{1, 2, 3} for _...阅读全文
前段时间在写代码的时候,遇到一个奇怪的问题,即返回的 nil 值,不为 nil。 导致这个问题的原因是对 Go 中的 nil 理解不全面导致的,直接上测试代码如下: package main import ( "fmt" ) // 定义我们自己的 Error 类型 type NilErr struct { Code int Msg string } // 实现 error 接口的 Error 方法 func (e *NilErr) Error() string { return fmt.Sprintf("Code:%d, Msg:%s", e.Code, e.Msg) } func returnNil() *NilErr { return nil } func main() { fmt.Pr...阅读全文