Go语言中文网 为您找到相关结果 234

Go调度器系列(3)图解调度原理

如果你已经阅读了前2篇文章:《调度起源》和《宏观看调度器》,你对G、P、M肯定已经不再陌生,我们这篇文章就介绍Go调度器的基本原理,本文总结了12个主要的场景,覆盖了以下内容: G的创建和分配。 P的本地队列和全局队列的负载均衡。 M如何寻找G。 M如何从G1切换到G2。 work stealing,M如何去偷G。 为何需要自旋线程。 G进行系统调用,如何保证P的其他G'可以被执行,而不是饿死。 Go调度器的抢占。 12场景 提示:图在前,场景描述在后。 上图中三角形、正方形、圆形分别代表了M、P、G,正方形连接的绿色长方形代表了P的本地队列。 场景1:p1拥有g1,m1获取p1后开始运行g1,g1使用go func()创建了g2,为了局部性g2优先加入到p1的本地队列。 场景2:g1运行完...阅读全文

博文 2019-04-06 13:34:38 大彬

golang中的 struct & interface 嵌入(Embedding)

参考这篇文章 https://studygolang.com/articles/6934 package main import "fmt" type Printer interface{ Print() } type CanonPrinter struct{ Printname string } // 若不实现此方法则下面的赋值会报错 func (printer CanonPrinter) Print(){ fmt.Println("AAA") } type PrintWorker struct{ Printer // 内嵌了一个接口 name string age int } // 实现 xxx func (printworker PrintWorker) Print(){ fmt.Pr...阅读全文

博文 2018-12-21 15:34:42 个00个

Golang模仿七牛图片处理API

之前一直在用qiniu的存储服务,生成图片的缩略图,模糊图,视频的webp,现在需要把存储移到s3上,那么这些图片,视频处理就要自己动手写了,本文梳理一下大致的思路。 分析需求 先看一下qiniu的接口是如何处理图片的,例如先截取视频第一秒的图片,再把图片缩略,最后存储到一个新的key,命令可以这么写 vframe/jpg/offset/1|imageMogr2/thumbnail/400x|saveas/xxx, 可以看到三个操作之间用 | 符号分割,类似unix 的 pipe 操作。 上面的操作算作一个cmd, 一次API请求可以同时处理多个cmd,cmd之间用分号分割, 处理完毕后,在回调中把处理结果返回,例如 { "id": "xxxxx", "pipeline": "xxx", "...阅读全文

博文 2017-02-09 08:29:46 一堆好人卡

【MMORPG开发日志010】漫谈一些有的没的

【MMORPG开发日志010】漫谈一些有的没的 写在前面 首先是祝愿所有看到这篇文章的小伙伴新年快乐健康! 目前关于这个项目的文字版开发日志已经很久没更新了,这段时间我更新了很多视频形式的开发日志,感兴趣的可以访问我的B站主页:玩物不丧志的老李 游戏研发过程中,总是产生各种想法,这些想法纠结着我。 这篇文章可能很乱,因为我在打算写这篇文章的时候依然没有清晰的中心思想 换句话说,这篇文章只是我自言自语的对于这段时间独立开发的一个复盘 如果能对你有帮助,自然是最好的了。 这个项目的意义 事到如今,我不得不重新思考这个项目存在的意义。 诚然,在最开始,这个项目的存在仅仅是为了“学习”,学习什么?学习网络游戏的开发,特别是MMORPG游戏的开发。 所以我们的目标自然不是“创新”,而应该是“复刻”。 ...阅读全文

博文 2020-02-01 03:32:52 李维民0512

一步一步教你写BT种子嗅探器之二---DHT篇

之前写了原理篇,在原理篇里简单的介绍了一下DHT,但是还不够详细。今天我们就专门详细的讲一下嗅探器的核心-DHT,这里默认原理篇你已经读了。 背景知识 DHT全称 Distributed Hash Table,中文翻译过来就是分布式哈希表。它是一种去中心化的分布式系统,特点主要有自动去中心化,强大的容错能力,支持扩展。另外它规定了自己的架构,包括keyspace和overlay network(覆盖网络)两部分。但是他没有规定具体的算法细节,所以出现了很多不同的实现方式,比如Chord,Pastry,Kademlia等。BitTorrent中的DHT是基于Kademlia的一种变形,它的官方名称叫做 Mainline DHT。 DHT人如其名,把它看成一个整体,从远处看它,它就是一张哈希表,...阅读全文

博文 2017-02-09 08:32:47 shiyanhui

阿里云专家风移“出诊”记录:SQL Server 疑难杂症解决之道(上篇)

授人予鱼而不如授人予渔,本系列专题(上篇)为大家推荐了31篇好文,希望可以帮到大家! “出诊”:RDS SQL Server死锁(Deadlock) 1. RDS SQL Server死锁(Deadlock)系列之一使用DBCC捕获死锁 经常会被客户问道:“应用程序被死锁报错啦?影响很大,到底是哪个进程导致了死锁发生的啊?怎么解决啊?怎么办呀?”。如何解决呢? 点击阅读详情 https://yq.aliyun.com/articles/73856?utm_content=m_28061 2. RDS SQL Server死锁(Deadlock)系列之二使用Profiler捕获死锁 不管是RDS SQL Server还是自建,死锁的确是一个非常头疼的问题。这...阅读全文

Go基础学习记录之Session存储

Session存储 我们在上篇文章中介绍了一个简单的Session管理器的工作原理,除此之外,我们还定义了一个Session存储接口。在本次分享中,我将展示一个实现此接口的基于内存的会话存储引擎的示例。您也可以将其定制为其他形式的Session存储。 package memory import ( "container/list" "sync" "time" "github.com/durban89/wiki/session" ) // Store 存储 type Store struct { sid string // unique session is lastTime time.Time // last save time value map[interface{}]interface...阅读全文

博文 2018-10-31 10:34:44 DurbanZhang

go-callvis 代码分析工具

go-callvis 发现这个不错的工具,然后尝试用了一下,还有很多的问题,这篇文章,主要是讲解怎么使用。 go-callvis 是一个开发工具,其目的是通过使用来自函数调用关系图的数据及其与包和类型的关系来对程序进行可视概览。 这在你只是试图理解别人的代码结构,或在代码复杂性增加的大型项目中特别有用。 [TOC] 缺点 github项目上的文档写的不是很清晰,我尝试了一下,没用 图画的很乱,有时候完全摸不到头绪 官方示例 用法 github上的图例 三个例子 docker 使用 go-callvis github.com/项目具体路径 | dot -Tpng -o syncthing.png 解析的是main包 go-callvis -group pkg,type -focus [想要分析...阅读全文

博文 2019-01-26 20:34:41 sixgo

[系列] - go-gin-api 路由中间件 - 日志记录(三)

概述 首先同步下项目概况: 上篇文章分享了,规划项目目录和参数验证,其中参数验证使用的是 validator.v8 版本,现已更新到 validator.v9 版本,最新代码查看 github 即可。 这篇文章咱们分享:路由中间件 - 日志记录。 日志是特别重要的一个东西,方便我们对问题进行排查,这篇文章我们实现将日志记录到文本文件中。 这是我规划的,需要记录的参数: - request 请求数据 - request_time - request_method - request_uri - request_proto - request_ua - request_referer - request_post_data - request_client_ip - response 返回数据 ...阅读全文

博文 2019-09-05 22:34:22 訢亮

Golang recover return defer

最近在学习golang 发现程序panic使用recover捕获,返回值被坑了。 在网上看到篇文章:https://studygolang.com/articles/4809 两个结论: 多个defer的执行顺序为“后进先出”; defer、return、返回值三者的执行逻辑应该是:return最先执行,return负责将结果写入返回值中;接着defer开始执行一些收尾工作;最后函数携带当前返回值退出...阅读全文

博文 2017-11-15 04:03:25 我爱吃葱花

[系列] - go-gin-api 路由中间件 - Jaeger 链路追踪(五)

概述 首先同步下项目概况: 上篇文章分享了,路由中间件 - 捕获异常,这篇文章咱们分享:路由中间件 - Jaeger 链路追踪。 啥是链路追踪? 我理解链路追踪其实是为微服务架构提供服务的,当一个请求中,请求了多个服务单元,如果请求出现了错误或异常,很难去定位是哪个服务出了问题,这时就需要链路追踪。 咱们先看一张图: 这张图的调用链还比较清晰,咱们想象一下,随着服务的越来越多,服务与服务之间调用关系也越来越多,可能就会发展成下图的情况。 这调用关系真的是... 看到这,我的内心是崩溃的。 那么问题来了,这种情况下怎么快速定位问题? 如何设计日志记录? 我们自己也可以设计一个链路追踪,比如当发生一个请求,咱们记录它的: 请求的唯一标识 请求了哪些服务? 请求的服务依次顺序? 请求的 Reque...阅读全文

博文 2019-09-17 00:04:19 訢亮

golang使用redis对文章进行投票

最近在学redis,本人菜鸟.代码是过程式的,没考虑优化.就是发篇文章记录一下.感觉redis还是很强大的. 规则 评分 = 支持票数*(86400/200)+时间戳, 文章获得为200票就可以在首页展示一天,随着时间的流逝,当分数小于当前时间戳的时候,就从首页撤下. 使用hash记录文章的标题,链接,作者,文章发布时间,文章得到的投票数量. 使用两个有序集合来有序的存储文章:第一个有序集合的成员为文章ID,分值为文章的发布时间;第二个有序集合的成员同样为文章ID,分值为文章的评分.通过这两个有序集合,网站既可以根据文章发布的时间来展示文章,也可以根据文章评分的高低来展示文章. 为了防止用户对同一篇文章进行多次投票,网站需要为每篇文章记录一个已投票用户名单,为此,程序将为每篇文章创建一个集合...阅读全文

博文 2018-08-07 11:35:01 键盘侠

为什么我不会舍弃 Python 投奔 Go 语言

本文的作者:Russ Cox Russ Cox毕业于麻省理工和哈佛大学,曾在贝尔实验室参与过Plan 9 和 Unix操作系统的开发,最近在google,主要开发Go语言。 最近关于Go语言的话题很多,本月刚好是Go语言诞生3周年。这个语言在谷歌巨人的推动下最终很可能成为今后的主流语言。如果你想简单了解一下Go语言,这里有Go语言官方网站提供的一个很简单的中文版的“Go语言半小时速成教程”,不妨一看。 下面是译文内容: 最近,由于一篇“为什么我不会舍弃Python投奔Go语言(英文)”的博客,我收到了大量的邮件,这篇文章中,作者说Go语言除了“用返回值来处理异常错误”这点外,其它的都非常好。我想写出一点东西,解释一下Go语言为什么这样做,这会对大家都有用。 在Go语言中,规定的方式是,函数返...阅读全文

博文 2015-06-17 23:00:23 cometwo

ETCD探索

ETCD探索 梗概 这篇文章旨在从源码角度分析ETCD MVCC、Lease、Watch的实现,帮助我们更好的使用ETCD。 ETCD是什么? 这是ETCD官网给出的解释,ETCD是一个KV存储。现在有太多的KV存储中间件,我们为什么要选择ETCD呢?原因就是这句话:"distributed", "reliable",ETCD是一个分布式的、可靠的KV存储。相比于Redis,ETDC不够快,但足够安全,可靠。每一个中间件都有自己的特点,我选择ETCD有两个原因: ETCD是GO写的,所以GO用起来很方便。(不用ZK的原因) 扩容方便。 在讨论之前,我们先看下ETCD的目录结构 auth 访问权限 client/clientv3 GO客户端SDK contrib 里面放着raftexample...阅读全文

博文 2020-02-19 17:32:49 HammerMax

理解 Docker 中的 Volumes

理解 Docker 中的 Volumes Why 本文翻译自 Understanding Volumes in Docker,和原文作者一样,我在刚接触 Docker 的时候,对 Docker 中 Volumes 的概念也有些困惑,docker run -it -v /some/dir:/another/dir someImage:someTag 中的 -v 选项和 Dockerfile 中定义的 VOLUME 能达到相同的效果吗?看完这篇文章后才豁然开朗,所以翻译过来一方面巩固理解,另一方面分享一下。 译文 从 Docker IRC Channel (Ross:用了一下这里提到的 Docker IRC Channel,顺便看了关于 Python 和 C++ 的聊天室,原来网络上还有一群人在...阅读全文

博文 2017-02-10 13:44:09 Xiaohui Wang

Go:指针能优化性能吗?【译】

趁着元旦休假+春节,尝试把2018年期间让我受益的一些文章、问答,翻译一下。欢迎指正、讨论,希望对你也有所帮助。原文链接:Go: Are pointers a performance optimization? 以下,开始正文 过去几周时间,我回答了许多关于使用指针优化性能的问题。似乎很多人在这方面都感到困惑。这也可以理解,指针确实是个复杂的话题。 希望这篇文章对你有所帮助。 简而言之:不是使用指针就一定代表着性能优化。 如果要彻底解释这篇文章涉及的所有细节,那篇幅可能会长到没人愿意看。所以,我精简了一下,试图用中等篇幅也能涵盖想说明的高级概念。 阅读时需要说明一点:本文讨论的是微优化,性能优化都是极其细微的。在进行微优化之前,需先进行基准测试,否则很可能看不到明显的效果。代码易读性才是第一...阅读全文

博文 2019-01-21 19:34:44 alphali

[译] Go:方法接收者应该使用 T 还是 *T

文地址:dave.cheney.net/2016/03/19/… 原文作者:Dave Cheney 译文地址:github.com/watermelo/d… 译者:咔叽咔叽 译者水平有限,如有翻译或理解谬误,烦请帮忙指出 这篇文章是我几天前在 Twitter 上提出的建议的延续。 在 Go 中,对于任何类型 T 都存在类型 *T,表示获取 T 类型(T 表示你声明的类型)变量的地址。例如: type T struct { a int; b bool } var t T // t's type is T var p = &t // p's type is *T 复制代码这两种类型,T 和 *T 是不同的,*T 不能替代 T(此规则是递归的,**T 会返回 *T 地址指向的值)。 你可以在任何类...阅读全文

博文 2019-08-21 13:04:16 咔叽咔叽

Golang并发模型:select进阶

最近公司工作有点多,Golang的select进阶就这样被拖沓啦,今天坚持把时间挤一挤,把吹的牛皮补上。 前一篇文章《Golang并发模型:轻松入门select》介绍了select的作用和它的基本用法,这次介绍它的3个进阶特性。 nil的通道永远阻塞 如何跳出for-select select{}阻塞 nil的通道永远阻塞 当case上读一个通道时,如果这个通道是nil,则该case永远阻塞。这个功能有1个妙用,select通常处理的是多个通道,当某个读通道关闭了,但不想select再继续关注此case,继续处理其他case,把该通道设置为nil即可。下面是一个合并程序等待两个输入通道都关闭后才退出的例子,就使用了这个特性。 func combine(inCh1, inCh2 <-chan ...阅读全文

博文 2018-12-18 09:34:44 大彬

用golang写一个简单的游戏(三)

上篇文章中,留下了一些问题。尽管我已经添加了一个设定“炸弹”,在炸弹周围的位置是不能经过的,但是炸弹的数量还是太少,所以有些单调。我想要让游戏变得丰富些,就要增加炸弹的数量。这里就有个问题,炸弹的位置是随机的话,那就可能出现炸弹堵住了去路,造成死局,上篇文章中提到的m×n的画布上最多能有多少个炸弹这个问题不是很有意义,比如下图: max-booms.png 这种排列是最多个炸弹的情况,但它没啥用处。我们的问题应该是最少有多少个炸弹就能造成死局。最少是2颗炸弹就可以造成死局,但这种特殊情况,我们已经做了处理--不能在起点和终点的周围有炸弹。除去这种特殊情况外的其他情况,最少有几个炸弹就能造成死局,不难想到是以下的情况: min-booms.png min-booms2.png 把规律描述一下就...阅读全文

博文 2020-05-25 03:32:58 onepunchgo

Go 方法(第二部分)

这篇文章介绍了关于 Go 语言中方法的剩余部分。强烈建议先阅读[第一部分](https://studygolang.com/articles/14061) 的介绍部分。 ## 方法表达式 如果有这样一个类型 T,它的方法集中包含方法 M,则 T.M 会生成一个与方法 M 几乎相同且带有签名的方法,这称为 *方法表达式*。不同之处在于,它额外附带的第一个参数与 M 的接收者类型相等。 ```go package main import ( "fmt" "reflect" ) func PrintFunction(val interface{}) { t := reflect.TypeOf(val) fmt.Printf("Is variadic: %v\n", t.IsVariadic()) ...阅读全文

Functional Go: Transient 及持久化

在之前的文章中,我们介绍了一些持久化数据结构实现的基本原理和 Vector Trie 这一数据结构在 Golang 下的实现过程。 这篇文章终于来到了实现持久化 List 的最后一步: 实现 Transient 和持久化的功能。 这篇文章是系列文章的一部分,如果还没有浏览过文章的其它部分请参考: 持久化数据结构简介 Vector Trie 的实现 Transient 及持久化 (本文) 在之前的文章中,我们已经看到了如何实现一个 Vector Trie,也知道如何使用 Vector Trie 来实现共享数据结构的持久化 List: 在每次修改时,我们复制从根节点到被修改节点路径上的所有节点,并使用得到的新的 Root 节点构造一个新的 List 的 HEAD 数据结构。这样通过新的 HEAD...阅读全文

博文 2017-09-26 22:36:33 meter

Angular2+ 使用 Protocol Buffers

just do it 最近在写一个web IM 项目,虽然本人主打golang后端,但是部分前端还是需要自己解决。因为这是一个IM系统,所以不考虑使用json来传送数据,改用protocol buffers ,优点见官网。由于前端不太熟练,经常被Angular坑,包括这次,花费我一个下午时间来解决Angular2+ 使用 Protocol Buffers的问题。 灵感来源:Using protocol buffers with Node.js + Swagger + Angular 进入正题,本机环境 Linux ubuntu 1. 定义一个简单的 .proto 文件 具体的protocol buffers 的.proto文件定义见官网,下面展现一个简单的小例子: // Protocol.p...阅读全文

博文 2019-01-24 02:34:40 旅行时序

比特币地址生成全步骤(golang实现)

通过椭圆曲线算法生成公钥 对公钥进行sha256散列和ripemd160散列,获得publickeyHash 在publickeyHash前面加上version(版本)字节数组获得versionPublickeyHash 对versionPublickeyHash进行两次sha256散列并取前4位字节,获得tailfHash 将tailfHash拼接到versionPublickeyHash后面,获得公钥的最终Hash即finalHash 最后将finalHash进行Base58编码(一种可视化工具)得到比特币地址 曾经有个疑问,为何比特币生成地址要这么麻烦,既然非对称加密只拥有公钥是无法倒推出私钥的,为何不直接使用公钥当地址,而是对公钥进行hash多次来取得地址,直到最近看了篇文章才明白,...阅读全文

大白话讲述Golang-Web开发入门篇-1

BestGolanger 一.开篇: 首先现在Web端大多数都是采用前后端分离,包括移动端更是不必多用说,网站弄个Vue或者Angular,后端使用Java或者Go或者是Nodejs或者Python等等 前端呢就是展示数据渲染出一个效果,可以理解为后端是盖楼,前端就是装修,对于用户来说,都是必要的二者也是密不可分,后端呢如果往白话来讲,就是数据的存取、计算、应对前端传过来的指令进行相应的存取、计算等作出回馈返还给前端。后端最基本的构造是什么呢,首先后端服务就像一个饭店,里面都是服务员,时刻等待着接收指令,前端就是顾客,前端说,服务员给我注册个账号,服务员说马上到,卡卡几下就告诉顾客,先生您要注册的账号注册好了,吧啦吧啦...二.翠花上酸菜 说点干货最基本的web服务需要具备以下东西:1.Ro...阅读全文

博文 2019-12-27 16:32:45 简书的王布斯

总结了才知道,原来channel有这么多用法!

这篇文章总结了channel的10种常用操作,以一个更高的视角看待channel,会给大家带来对channel更全面的认识。 在介绍10种操作前,先简要介绍下channel的使用场景、基本操作和注意事项。 channel的使用场景 把channel用在数据流动的地方: 消息传递、消息过滤 信号广播 事件订阅与广播 请求、响应转发 任务分发 结果汇总 并发控制 同步与异步 ... channel的基本操作和注意事项 channel存在3种状态: nil,未初始化的状态,只进行了声明,或者手动赋值为nil active,正常的channel,可读或者可写 closed,已关闭,千万不要误认为关闭channel后,channel的值是nil channel可进行3种操作: 读 写 关闭 把这3种操...阅读全文

博文 2019-01-21 20:34:45 shitaibin

golang Interface 泛型编程

严格来说,在 Golang 中并不支持泛型编程。在 C++ 等高级语言中使用泛型编程非常的简单,所以泛型编程一直是 Golang 诟病最多的地方。但是使用 interface 我们可以实现泛型编程,我这里简单说一下,具体可以参考我前面给出来的那篇文章。比如我们现在要写一个泛型算法,形参定义采用 interface 就可以了,以标准库的 sort 为例。 package sort // A type, typically a collection, that satisfies sort.Interface can be // sorted by the routines in this package. The methods require that the // elements of ...阅读全文

博文 2019-06-18 23:32:46 jaydenZou1228

gRPC负载均衡(自定义负载均衡策略)

### 前言 上篇文章介绍了如何实现gRPC负载均衡,但目前官方只提供了`pick_first`和`round_robin`两种负载均衡策略,轮询法`round_robin`不能满足因服务器配置不同而承担不同负载量,这篇文章将介绍如何实现自定义负载均衡策略--`加权随机法`。 `加权随机法`可以根据服务器的处理能力而分配不同的权重,从而实现处理能力高的服务器可承担更多的请求,处理能力低的服务器少承担请求。 ### 自定义负载均衡策略 gRPC提供了`V2PickerBuilder`和`V2Picker`接口让我们实现自己的负载均衡策略。 ```go type V2PickerBuilder interface { Build(info PickerBuildInfo) balancer.V2...阅读全文

博文 2020-05-20 17:12:40 939496716

用golang写一个简单的游戏(三)

上篇文章中,留下了一些问题。尽管我已经添加了一个设定“炸弹”,在炸弹周围的位置是不能经过的,但是炸弹的数量还是太少,所以有些单调。我想要让游戏变得丰富些,就要增加炸弹的数量。这里就有个问题,炸弹的位置是随机的话,那就可能出现炸弹堵住了去路,造成死局,上篇文章中提到的m×n的画布上最多能有多少个炸弹这个问题不是很有意义,比如下图: 这种排列是最多个炸弹的情况,但它没啥用处。我们的问题应该是最少有多少个炸弹就能造成死局。最少是2颗炸弹就可以造成死局,但这种特色情况,我们已经做了处理--不能在起点和终点的周围有炸弹。除去这种特殊情况外的其他情况,最少有几个炸弹就能造成死局,不难想到是以下的情况: 把规律描述一下就是,取出m和n之中的最小数min,min除以3,如果整除则是min/3,如果有余数,则...阅读全文

博文 2020-05-25 17:34:13 wx5e1abbbb0a5e5

关于写文章的反思

看了一下我之前写的文章,有多少是水篇数?复制别人的列子有多少? 自已真正有心得的,又写了多少? 我过了需要用数量来证明自己的时候了 从今天开始,删掉那些水文,质量不高的,尽可能完善。 我可能写不了多好,但是我要求我写的东西能拿得出手。 补: session及JWT及Oath的使用。 MySql的sql语句优化。 Git遇到的问题及解决方案。 Golang的使用及避坑。 用心点...阅读全文

博文 2018-07-27 09:34:48 送你一碗大麦茶

软件开发技术经验总结

众所周知,软件项目成功必要因素很多,泛泛来说,下面几条也缺一不可。 1. 完备调研,项目需求分析完美契合用户或者客户所需所想 2. 开发实施:设计、Coding、测试、部署、运维,每一流程都达到或者超出预期目标 3. 市场推广:销售或市场人员对产品合理推广这篇文章将更多的集中在第二条开发实施这块,做一些常见的技术经验,希望对大家有一些借鉴。设计这块,请参考 “产品开发技术文档模板”这篇文章。Coding泛泛的模块化,SOA等等这些概念,这里不想赘述,这儿更多分享一些实战经验,不限开发语言。 1. 线程安全:Coding简单来说就是逻辑性的调用基本库API /开源库的API 及语言基本组成部分(语法、结构、变量、常量、语句、函数等),给定输入,输出预期输出,因此,编码者应本着对程序负责的态度,...阅读全文

博文 2019-01-31 16:34:44 cli1871

k8s使用Job执行任务失败了怎么办

Kubernetes 中使用 Job 和 CronJob 两个资源分别提供了一次性任务和定时任务的特性,这两种对象也使用控制器模型来实现资源的管理,我们在这篇文章来介绍Job执行如果失败了会怎么样呢? 修改job-fail.yaml,故意引入一个错误: Never 如果将 restartPolicy 设置为 Never 会怎么样?下面我们实践一下,修改job-fail.yaml后重新启动。 运行 Job 并查看状态,可以看到Never策略的job,pod失败后,重新创建: 直到重新创建7个(spec.backoffLimit默认为6,即重试6次,共7个pod)pod都失败后,认为失败,job的status里会更新为Failed 当前 Completion 的数量为 0 查看 Pod 的状态:...阅读全文

博文 2019-10-16 10:33:20 小碗汤

剥开比原看代码16:比原是如何通过/list-transactions显示交易信息的?

作者:freewind 比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 在前一篇文章中,我们试图理解比原是如何交易的,但是由于内容太多,我们把它分成了几个小问题,并在前一篇解决了“在dashboard中如何提交交易信息”,以及“比原后台是如何操作的”。 在本文我们继续研究下一个问题:在提交的交易成功完成后,前端会以列表的方式显示交易信息,它是如何拿到后台的数据的?也就是下图是如何实现的: 由于它同时涉及到了前端和后端,所以我们同样把它分成了两个小问题: 前端是如何获取交易数据并显示出来的? 后端是如何找到交易数据的? 下面依次解决。 前端是如何获取交易数据并显示出...阅读全文

博文 2018-07-23 16:34:48 比原链Bytom

Docker 使用中的一些最佳实践

Docker 使用中的一些最佳实践 本文将记录: 在使用 Docker 的过程中整理出来的最佳实践。 其他 Docker 使用者发布的(可能会是翻译过来的,全部附带原始链接)经过验证的最佳实践。 所以,本文将长期更新。 Docker 安装相关 如果安装完成后使用 docker 时出现下面的错误: > Cannot connect to the Docker daemon. Is 'docker -d' running on this host? 参考这里的内容,我们需要执行下面的命令来安装 apparmor: sudo apt-get install apparmor Docker 使用相关 使用 Bash Aliases 简化 Docker 使用命令,灵感来自于一篇很好的文章(发布这篇文章...阅读全文

博文 2017-02-10 13:43:59 Xiaohui Wang

用golang写一个简单的游戏(二)

上篇文章写到了,我已经打印出了一个从起点到终点的路径,并且这是受键盘事件控制的。今天我会继续给这个游戏添加一些东西,让它看起来像个“游戏”。 现在我要加上一个障碍,不是随便一条路径都可以从起点到终点,这个障碍就姑且叫它“炸弹”,我赋给它的规则是,它的上下左右(称之为陷阱)及它本身不能经过,必须绕着走。即如图: boom.png 添加这个道具,我有几个改动的地方,如下: 获取每个关卡的参数,增加了炸弹的位置和周围陷阱的位置,结构体变成了这样子: type RoundParams struct { Height int //画布高度 Width int //画布宽度 BoomNum int //炸弹数量 BoomPosition [][]int //炸弹位置,坐标数组 TrapPosition ...阅读全文

博文 2020-05-16 11:32:45 onepunchgo

[译]参考资料: 地道的GO代码

目录 [−] Accept interfaces, return concrete typesCode Review CommentsEffective GoGo PatternsGo ProverbsGo and the Zen of PythonGo by ExampleIdiomatic Doc Comments: Document Your Function, Not Your Function SignatureIdiomatic GoIdiomatic Go ReadabilityIdiomatic Go TestsIdiomatic Go Trickshttps://medium.com/@matryer/idiomatic-go-tricks-62abea5c50fbItty...阅读全文

博文 2017-07-08 10:18:12 smallnest

[go]channel和select

channel channel用于协程(goroutine)间的通信,对channel进行发送(send)或接收(receive)操作可能会阻塞当前协程。 用make创建一个channel 可以用make(chan Type, BufferSize)来创建一个新的channel,Type表示channel中元素的类型,BufferSize(可选)为缓冲区大小,缓冲区过大溢出会处理成无缓冲区。 c := make(chan int) //c := make(chan int, 0) 与上面相等,没有缓冲区 缓冲区 channel有缓冲区,且缓冲区没有被填满的时候,发送操作不会阻塞goroutine, 反之没有缓冲区或缓冲区被填满的channel,发送操作会阻塞goroutine。 单向chan...阅读全文

博文 2020-01-09 14:32:53 onequid

用golang写一个简单的游戏(二)

上篇文章写到了,我已经打印出了一个从起点到终点的路径,并且这是受键盘事件控制的。今天我会继续给这个游戏添加一些东西,让它看起来像个“游戏”。 现在我要加上一个障碍,不是随便一条路径都可以从起点到终点,这个障碍就姑且叫它“炸弹”,我赋给它的规则是,它的上下左右(称之为陷阱)及它本身不能经过,必须绕着走。即如图: 添加这个道具,我有几个改动的地方,如下: 获取每个关卡的参数,增加了炸弹的位置和周围陷阱的位置,结构体变成了这样子: type RoundParams struct { Height int //画布高度 Width int //画布宽度 BoomNum int //炸弹数量 BoomPosition [][]int //炸弹位置,坐标数组 TrapPosition [][]int /...阅读全文

博文 2020-05-17 14:33:51 wx5e1abbbb0a5e5

Let US sort

## 在这篇文章里,我尝试发掘 [Go](https://golang.org/) 语言的所有特性,以便用最优的、利用多核处理器的方式来实现 [归并排序](https://en.wikipedia.org/wiki/Merge_sort)。 时间复杂度为 `O(nlogn)` 的最优排序算法中,归并排序是其中之一。它的原理为将数组分为两部分,分别进行排序,最后再归并,这种做法的开销没那么大。 ![红色表示分割和排序,绿色表示归并](https://raw.githubusercontent.com/studygolang/gctt-images/master/let-us-sort/1_I9QJGWEgHtoo9H_hgVOg4g.png) *颜色说明:红色表示分割和排序,绿色表示归并* 让...阅读全文

无脑for在程序被终止的时候协程会终止吗

func main(){ go func(){ for{ time.Sleep(1 * time.Second) fmt.Println("something") } } //此处不让程序退出 for{ time.Sleep(1*time.Second) } }以上代码。运行起来后,如果直接kill进程将他杀掉的话,内存是怎么样的情况,是不是包括起的所有协程都会被终止,若是不会,是不是会造成内存泄漏?早上看了篇文章后还是不懂。请各位指教...阅读全文

博文 2019-01-02 13:55:11 UYAD

好程序员web前端培训分享Javascript中原型属性

好程序员web前端培训分享Javascript中原型属性 本文将从以下三个方面讲解原型属性 1、 理解指针 2、 理解原型 3、 用原型的方式完成继承 以下为详细内容: 1、 理解指针 要理解JAVASCRIPT中的原型,先理解指针,在C/C++中,会提到指针,其实,指针不应该属于C/C++的专利,上篇文章中,提到的引用类型(也是很多面向对象语言中的数据类型的叫法),就是指针。 C/C++中对指针的解释:指针就是地址。地址为何物? 地址:是计算机对内存每个存储单元的管理方式。在计算机的内存中,存储着若干数据,计算机的CPU是如何读取内存中的数据的? 计算机的每个存储单元都有一个编号,就像到超市存包时,每个存包的格子都有一个编号,这个编号就是地址,内存的地址。超市每个格子为什么要有编号,目的就...阅读全文

博文 2019-04-01 15:29:12 hcxy

Golang 性能提高技术----低级优化

前言 自上篇文章写了 基础编码原则(https://www.jianshu.com/p/0dafe1059fdc ),已经过了一段时间了,此处是对上篇文章中提到的低级优化做个说明。 了解现代处理器 在单个处理器中,为了提高指令的吞吐量,实现了流水线系统。即原本一条指令的执行,需要经过取指(IF)、译码(ID)、执行(EX)、访存(MEM)、写回(WB)等一系列阶段。如执行一条指令需要等待上一条指令执行,那这个等待是对处理器来讲是一种浪费的行为。于是将一条执令的执行过程划分为许多的周期,在同一个周期内,多条指令处于不同阶段,比如下图:指令i做完了取指阶段,到周期2时,则会进入到了译码阶段,同时会立即让下一条指令i+1进入取指阶段,这样指令i和i+1在周期2并行执行。 本图来源:https://...阅读全文

博文 2019-06-23 01:32:43 wp_nine

GORM many2many关系表的创建和查询

最近在用golang搭建个人博客的后台,数据库选用了gorm + mySQL的组合,其中文章(articles)和标签(tags)两个表是多对多的关系,由于对数据库不是很熟悉,外加gorm的文档较为简略,在这里踩了很多的坑。现在在这篇文章中总结下实现的方法。 第一步:定义gorm表的struct type Article struct { gorm.Model Title string `gorm:"not null"` Content string `gorm:"not null"` Tags []Tag `gorm:"many2many:tag_articles"` } type Tag struct { TagId string `gorm:"primary_key"` TagName...阅读全文

博文 2020-03-28 03:32:49 _敏讷

写 Golang 程序的三条建议

写 Golang 程序的三条建议 写在前面:其实写这篇文章初衷很简单,有人质疑我的上篇文章是抄袭的,就想再写点个人心得。刚看到时有点不忿,不过转头想了想,这难道不是对文章的肯定吗?????秉着不要把写文章当作一个负担的原则,我接下来还是以 想聊什么,就写什么 的心态来面对,以免出现 "挤牙膏" 的文章。 可读性第一 优秀的代码必须保证可读性,没有可读性的代码就是 一次性产品。代码的可读性,再怎么强调也不为过。 可能会有不少朋友认为,代码最核心是为了 实现业务 。从公司角度来说,这个说法完全正确。我们作为开发者,如果以业务为第一导向,那么只会成为 码农,而 程序员 需要有技术上的思考。 程序员入门时,往往把开发认为是 实现业务需求的一次性工作。但实际情况却复杂很多:在一个软件生命周期内,你会遇...阅读全文

博文 2019-03-26 16:34:44 Junes

Golang的WaitGroup陷阱

sync.WaitGroup是并发环境中,一个相当常用的数据结构,用来等待所有协程的结束,在写代码的时候都是按着例子的样子写的,也没用深究过它的使用。前几日想着能不能在协程中执行Add()函数,答案是不能,这里介绍下。 陷阱在WaitGroup的3个函数的调用顺序上。先回顾下3个函数的功能: Add(delta int):给计数器增加delta,比如启动1个协程就增加1。 Done():协程退出前执行,把计数器减1。 Wait():阻塞等待计数器为0。 考一考 下面的程序是创建了协程father,然后father协程创建了10个子协程,main函数等待所有协程结束后退出,看看下面代码有没有什么问题? package main import ( "fmt" "sync" ) func fath...阅读全文

使用 JS 建立一个 Mixin 机器人

官方推荐使用 golang ,对于前端人员的学习门槛还是有一些。所以在这里发布一个 js 写的教程。 读完此篇文章您将获得: 一个收到消息会自动回复 hello mixin 的机器人。 1. 开发基础 node 环境,笔者目前使用v10.15.1,更高亦可。 JavaScript 语法基础 Mixin 机器人 session 及 secret 2. 开发之前 能够找到并读到这篇文章,想必对 Mixin 以及 Mixin Messenger 都比较熟知。所以申请 Mixin 机器人的 session 和 secret 并不是本文的主要内容。如有需要请进传送门 Mixin Messenger 机器人接入指南 这个时候,你应该已经获取到了 Mixin 的 session 文件 和 secret 信...阅读全文

博文 2020-02-24 21:32:59 刘泽美Neo

一文带你读懂结构体内存分配

一个博客引发的血案 一个比较牛逼的博客,介绍了如何优化字符串到字节数组的过程,避免了数据复制过程对程序性能的影响。 对此,我深感佩服。因为代码非常简单,简单到我根本看不懂! package main import ( "fmt" "strings" "unsafe" ) func str2bytes(s string) []byte { x := (*[2]uintptr)(unsafe.Pointer(&s)) h := [3]uintptr{x[0], x[1], x[1]} return *(*[]byte)(unsafe.Pointer(&h)) } func bytes2str(b []byte) string { return *(*string)(unsafe.Pointer(...阅读全文

博文 2020-04-19 20:34:20 胡大海

How To Gracefully Close Channels?(如何优雅地关闭Go channel? )

几天前,我写了一篇文章来说明golang中channel的使用规范。在reddit和HN,那篇文章收到了很多赞同,但是我也收到了下面几个关于Go channel设计和规范的批评: 在不能更改channel状态的情况下,没有简单普遍的方式来检查channel是否已经关闭了 关闭已经关闭的channel会导致panic,所以在closer(关闭者)不知道channel是否已经关闭的情况下去关闭channel是很危险的 发送值到已经关闭的channel会导致panic,所以如果sender(发送者)在不知道channel是否已经关闭的情况下去向channel发送值是很危险的 那些批评看起来都很有道理(实际上并没有)。是的,没有一个内置函数可以检查一个channel是否已经关闭。如果你能确定不会向c...阅读全文

博文 2018-08-21 15:35:16 豆瓣奶茶

golang中goroutine的调度

基础的参考这篇文章 https://www.zhihu.com/question/20862617 线程 Machine (M) 处理器 Process (P) 协程 Goroutine (G) 要点 P为固定个数. 一般等于cpu核数 M > P. M为线程池中. G 有全局队列 和 P下的队列. 协作式 还是 抢占式 协程的意思大概就是协作式的线程的意思? 一开始的golang是协作式的. 就是说如果一个goroutine一直在执行.. 就让他执行下去吧 . 但是这会有一个问题. golang的gc是需要stop world的. 必须所有的goroutine都停下.. so... 没办法了. 而且也不能让一个goroutine一直占用P. 会把其他goroutine饿死... 所以 1....阅读全文

博文 2019-03-11 16:34:51 个00个

Go依赖包管理工具,3分钟掌握govendor

网上写govendor的博文不少,但从安装到介绍,总看上去有些沉重,下面奉上一篇简单的教程,3分钟入门。 第1部分 简明教程 2步走,3分钟轻松搞定Go项目的依赖。 第1步 安装 go get -u github.com/kardianos/govendor 第2步 为项目增加依赖 进入到项目目录 使用govendor init命令初始化项目的依赖 运行govendor fetch命令增加依赖 打开./vendor/vendor.json查看依赖的包 步骤: cd path/to/project govendor init govendor fetch project_url_with_out_http cat vendor/vendor.json 举个例子:项目awesome依赖githu...阅读全文

博文 2018-11-17 01:34:39 大彬

你知道defer的坑吗?

你是不是觉得defer很简单、很好用,但也许你掉坑里了都不知道! 这篇文章不介绍defer的常用功能,而是介绍你在用defer时,也许会踩的坑。 defer允许我们进行一些函数执行完成后的收尾工作,并且代码更加简洁,例如: 关闭文件流: // open a file defer file.Close() 解锁一个加锁的资源 mu.Lock() defer mu.Unlock() 打印最终报告 printHeader() defer printFooter() 关闭数据库链接 // open a database connection defer disconnectFromDB() 但是: 你知道defer和defer后的函数什么时候执行吗? 你知道defer后函数里的变量值是什么时候计算的...阅读全文

博文 2018-11-16 20:34:38 大彬