我平常有一个习惯,就是不断看以前写的代码,想着有没有哪些方面可以改进,如果每天能把代码可读性量变 1%,那么日积月累就是质变:前些天我们写过一次对 Makefile 的重构,去掉了一处重复代码的坏味道...,没过多久我便又发现了一处重复代码的坏味道,本文就让我们看看如何消灭它!..." _ "google.golang.org/protobuf/cmd/protoc-gen-go" ) 如此一来,当执行「go mod tidy」的时候,依赖工具的版本信息就会记录到 go.mod,.../dasel/cmd/dasel \ google.golang.org/grpc/cmd/protoc-gen-go-grpc \ google.golang.org/protobuf/cmd...下面让我们看看如何重构:tools.go 和 Makefile 比起来,肯定 tools.go 更重要,它是不能改的,所以我们要去掉 Makefile 里的重复代码,更具体点来说是最好能在 Makefile
当Dockerfile超出合理范围时,会出现以下问题: 很难理解和维护-我们需要阅读数百行以了解所有依赖关系 在这么多行之间可能忽略一个明显的安全问题 当每个人都在更改同一文件时,Git将引发更多冲突...例如:我需要使用terraform没必要再重新apt-get安装了,可以直接使用带有terraform的官方镜像。...我总是觉得拥有三种类型的标签非常有用: 分支名称:标识特定分支的镜像的最新版本 注意:为什么不使用latest?使用时latest,我永远不知道它是表示整个存储库中的最新稳定版本还是最新版本。...我建议使用语义版本控制(major.minor.patch)。 提交:我一直想知道标签所指向的提交。现在,您可以通过在存储库中创建版本标记来执行此操作。...但是,当这不可能时,只需使用其Commit SHA标记镜像即可。 ---- 谢谢阅读,希望您可以更轻松地维护Dockerfile。
Moving executable to /home/baxiang/go/bin/dep MacOS 使用 Homebrew安装 $ brew install dep $ brew upgrade dep...除了go.mod之外,go命令还维护一个名为go.sum的文件,其中包含特定模块版本内容的预期加密哈希,go.sum 文件不需要手工维护。...go mod使用vendor目录 如果你不喜欢 go mod 的缓存方式,你可以使用vendor命令回到 godep 或 govendor 使用的 vendor 目录进行包管理的方式。...当发布时也只需要和使用 godep 一样将 vendor 目录带上即可 依赖包的版本管理 :gin-gonic baxiang$ tree -L 1 . ├── gin@v0.0.0-20190328061400...如果,在go.mod用require语句指定包和版本 ,go命令会根据指定的路径和版本下载包, 指定版本时可以用latest,这样它会自动下载指定包的最新版本;如果包的作者还没有标记版本,默认为 v0.0.0
一般来说,GOPATH 目录下会包含 pkg、src 和 bin 三个子目录,这三个目录各有用处。...src 目录用来放置代码源文件,在进行 import 时,是使用这个位置作为根目录的。自己编写的代码也应该放在这下面,不同的项目放在不同的目录下进行管理。...当项目在 src 目录下管理时,多个项目可能都会使用相同的依赖,如果每个项目都存一份依赖显然会带来大量的冗余,这里我们推荐一个设置 GOPATH 环境变量时的小技巧。...dep 是一个开源项目, 大家可以在 https://github.com/golang/dep 了解详细信息,其安装方式大家可以参考官方说明,这里我们主要介绍其使用。...关于 dep 更多深入内容,可以参考 https://golang.github.io/dep/docs/introduction.html 总结 Go dep 目前是一款比较好用的依赖管理工具,很多比较大型的项目都在使用
,上一篇文章 使用 Jenkins 执行 Go 工程构建镜像 中,提到使用 go get 命令时,出现的一些列问题,让人很是抓狂,所以迫切需要一款可以很好管理 Go 依赖的工具。...,因为网络问题,我执行升级 Dep 时失败了。。。...答案是肯定的,Dep 可以配置私有库依赖。在这之前,我们先来演示一下,如何在项目中依赖自己在 Github 上的开源库。...注意:这里我不使用上边 dep ensure -add 方式添加依赖,来演示一下 Dep 自动增加依赖配置方式。...6.2 使用 Dep 配置私有库 (Gitlab) 依赖 接下来,继续演示如何使用 Dep 配置私有库依赖。
默认会使用 https 协议下载代码仓库 ,可以使用 -insecure 参数切换到 http 协议。...当其它项目导入这个包时,import 语句后面的路径是 mongo 包的目录路径,而使用的包名却是这个目录下面代码中 package 语句声明的包名 mgo。...讲到这里还有一个很重要的问题没有解决,github 上有很多开源项目,这些项目都有多个版本号,我如何引入具体某一个版本呢?...使用它之前我们需要将 dep 工具安装到 GOPATH 下面 $ go get github.com/golang/dep 同时需要将 ~/go/bin 目录加入到环境变量 PATH 中,因为 dep...但是令人意外的是 dep 居然表示不能直接解决「钻石型」依赖,这让我感受到了它的危机,在 dep 中依赖包是扁平化的,vendor 不允许嵌套。如果出现了版本冲突,需要使用某种特殊手段来解决。
以前写过一篇关于go管理依赖包工具 dep的文章,当时认为dep将会成为官方依赖工具,现在看来是自己图样图斯内幕破了,正如官方一直提到dep是“official experiment”官方实验项目的那样...当然现在 随着模块一起推出的还有模块代理协议(Module proxy protocol),通过这个协议我们可以实现 Go 模块代理(Go module proxy),也就是依赖镜像。...GO111MODULE: 这个环境变量主要是 Go modules 的开关,主要有以下参数: auto:只在项目包含了 go.mod 文件时启用 Go modules,在 Go 1.13 中仍然是默认值...,Go 自动尝试列表中的下一个,遇见 “direct” 时回源,遇见 EOF 时终止并抛出类似 “invalid version: unknown revision...”...那什么情况下会不存在 zip hash 呢,就是当 Go 认为肯定用不到某个模块版本的时候就会省略它的 zip hash,就会出现不存在 zip hash,只存在 go.mod hash 的情况。
于是,我也花了一些时间研究了下。期间,遇到了一个需求,如何清晰地识别模块中依赖项之间的关系。一番了解后,发现了 go mod graph。...二是我之前手里有一个项目,包管理一直用的是 dep。于是,我也了解了下它,把官方文档仔细读了一遍。其中的某个章节介绍了依赖项可视化展示的方法。...再看下它的使用,发现都是通过管道命令组合的方式,而且前面的部分基本相同,都是 dep status -dot | dot -T png。...接收管道的输入 先要检查数据输入管道是否正常。 我们的目标是使用类似 dep 中作图的方式,go mod graph 通过管道将数据传递给 modv。...接下来就是使用了。 使用体验 开始体验下吧。补充一句,这个工具,我现在只测试了 Mac 下的使用,如有问题,欢迎提出来。
概述 看下 Gin 框架的官方介绍: Gin 是一个用 Go (Golang) 编写的 web 框架。...这篇文章分享 Gin 的安装和Gin 的路由配置。 路由配置包含的功能点如下: 实现了,路由分组 v1版本、v2版本。 实现了,生成签名和验证验证。 实现了,在配置文件中读取配置。...框架安装可以参考官网: https://gin-gonic.com/zh-cn/docs/quickstart/ 我在安装时,用的是 dep 安装,给大家分享下。 dep 是啥 ?...我本机是 Mac,安装只需一个命令: brew install dep 咱们接下来创建一个新项目:ginDemo。...对了,还有一个点没说,就是如何读取配置文件中的配置,我是这样做的: package config const ( PORT = ":8080" APP_NAME = "ginDemo
在编译时(godep go build)godep通过临时修改GOPATH环境变量的方法让go编译器使用缓存在Godeps/_workspace下的项目依赖的特定版本的第三方包,这样保证了项目不再受制于依赖的第三方包的...下的第三方包如何进行管理的问题:依赖包的分析、记录和获取等,进而实现项目的reproducible build。...这里也让我比较困惑! 三、dep探索 上面的dep使用基本工作流完全可以满足日常包管理的需求了。但对于喜欢求甚解的我来说,必要要探索一下dep背后的行为和原理。...但目前我所使用的dep版本还没有实现这个功能,其默认工作方式依旧是先GOPATH mode,如果没有找到依赖包的存在,则针对该包实施network mode。...但失败背后还有一层原因,那就是dep的设计要求flatten vendor,即使用dep的项目只能有一个root vendor,所以直接依赖或传递依赖的包中包含vendor的,vendor目录也都会被strip
在使用Cobra之前,需要安装Go的依赖管理工具dep,使用下面的命令来安装或者升级。...brew install dep brew upgrade dep 如果你用的不是MacOS或者brew命令 ,你也可以通过 go get的方式来安装,执行go get -u github.com/golang...对你的项目的根目录的初始化命令是dep Init接下来会详细说明。 首先,我使用Cobra CLI为我自己的CLI生成初始代码。...接下来,我使用了dep(包括dep init命令)来设置项目,第一次拉取时依赖关系如下: 当我执行这个命令时,dep完成了以下的操作。 查找已经存在的管理依赖关系文件进行转换。...有关dep更多信息,请查看github上的项目README。 我下一个添加依赖项是faker,使用的dep命令如下。
而在前两步会有大量的镜像体积冗余,使用多阶段构建可以避免这一问题 这是构建 Go 应用的一个示例 FROM golang:1.11-alpine AS build # Install tools required.../dep/cmd/dep # List project dependencies with Gopkg.toml and Gopkg.lock # These layers are only re-built...,可以参考 如何使用 docker 高效部署前端应用[2] FROM node:10-alpine as builder ENV PROJECT_ENV production ENV NODE_ENV...如前端应用使用 npm install --production 只装生产环境所依赖的包。 一个容器只做一件事 如一个 web 应用将会包含三个部分,web 服务,数据库与缓存。...如在我的个人服务器中,我使用 traefik 做负载均衡与服务发现,所有应用及数据库都在 traefik_default 网络下,详情参考 使用 traefik 做负载均衡与服务发现 version:
Protocol Buffers Protocol Buffers 是一个与编程语言无关、与平台无关的可拓展机制,用于序列化结构数据,是一种数据交换格式,gRPC 使用 protoc 作为协议处理工具。...,test.pb.go 使用的包名是 main,所以在编译时,需要把多个 go 文件一起编译: go build ....一个 message 中,每个字段都有唯一的编号,这些数字用于标识二进制格式的字段(数据传输时会被压缩等),当编号范围是 1-15 时,存储编号需要一个字节,也就是说 message 中的字段尽量不超过...例如: repeated int32 samples = 4 [packed=true]; 在可选字段中 optional 中,我们可以为其设置一个默认值,当传递消息时如果没有填写此字段,则使用其默认值...前面提到了 protoc,可以将协议文件转为为具体的代码。 为了兼容各种编程语言,我们协议设置 _package,这样可以支持生成不同语言代码时设置包/库名称。
我们今天来看源码的流程 首先,响应式更新,分为两步,依赖收集和依赖更新 今天讲的是依赖收集,如何去收集 使用了数据的地方 依赖收集,又分为两个流程 1、数据初始化流程 2、依赖收集流程 当前篇,先以基本数据类型为例讲解...(obj, key) { // dep 用于中收集所有 依赖我的 东西 var dep = new Dep(); var val = obj[key]...正在使用数据,数据就要收集这个watcher 你可以先不用管 Dep.target 到底是怎么指向,你只用记住 在 watcher 比如当前页面开始渲染时,Dep.target 会提前指向当前页面的...watcher,就可以调用 watcher 去更新了 watcher 在 依赖收集中只起到被收集的作用,所以不会在这里详细解释 2、Dep Dep 是一个构造函数,用于创建实例,并带有很多方法 实例会包含一个属性...当东西发售时,就会打你的电话通知你,让你来领取(完成更新)。
如果说 Go 1.11 和 Go 1.12 时由于模块的不完善你不愿意切入,那么 Go 1.13 你则可以大胆地开始放心使用。...本次分享将讨论如何使用模块和模块代理,以及在它们的使用中会常遇见的坑,还会讲解如何快速搭建自己的私有模块代理,并简单地介绍一下七牛云推出的 goproxy.cn 以及它的出现对于中国 Go 语言开发者来说重要在何处...GO111MODULE 这个环境变量主要是 Go modules 的开关,主要有以下参数: auto:只在项目包含了 go.mod 文件时启用 Go modules,在 Go 1.13 中仍然是默认值,...Q&A Q:如何解决 Go 1.13 在从 GitLab 拉取模块版本时遇到的,Go 错误地按照非期望值的路径寻找目标模块版本结果致使最终目标模块拉取失败的问题?...Q:使用 Go modules 时可以同时依赖同一个模块的不同的两个或者多个小版本(修订版本号不同)吗?
大家好,又见面了,我是你们的朋友全栈君。 Vue 最独特的特性之一,是其非侵入性的响应式系统。数据模型仅仅是普通的 JavaScript 对象。而当你修改它们时,视图会进行更新。...本文整理的较为粗糙,大体的说明了一下响应式的实现过程,很多地方直接使用模拟数据,不过整体的流程还是比较清晰。 ---- 数据劫持 听起来这个词挺唬人的,换句话讲就是如何对监听一个对象的改变?...即可 因为指向的就是watcher本身,Dep.target主要的作用就是代指某个watcher,当添加完之后设置Dep.target = null。...比如说{ {message}}这个变量 在头部、尾部、导航中都有用到,那{ {message}}改变的时候如何同时所有调用它的地方呢?...watcher是每个{ {message}} Dep包含所有watcher的集合。
go version这个命令相信大家已经非常熟悉了,使用它可以查看我们自己电脑上的Go SDK版本。...显示的帮助内容比较多,我截取一部分。从该命令的用法来看,它可以接受多个文件,用于打印这些文件的构建版本信息。现在我来通过一些例子演示该命令的高级用法。...,从结果看,我电脑里的goimports是使用go1.13版本构建的。...小提示:传递给go version的文件要是绝对路径,以上示例是因为我正好在$GOBIN目录下,所以可以省略路径,直接使用文件名。...比如gocode的,可以看出它的github地址是github.com/mdempsky/gocode,模块名也一样,并且依赖了golang.org/x/tools库,并且还显示了库的版本。
就形成不了自身的技术竞争力。在解决关键问题时还得靠大神同事。这就是技术壁垒。 本节将尝试手撸一个核心的vue代码。不妨称之为Due,因为这是同事的口头禅。也是我火大时唾上最狠的一句。...当编译生成的函数被实际渲染的时候,会触发getter进行依赖收集,数据变化时,触发setter进行更新。 看一下原理。...当你打印出obj.name时,执行get。因为我们的设置,get还顺便返回了div#name内的值。 那么,一个响应式雏形就有了。我就不用去做dom操作了。...$data可能包含深层次的数据对象,因此需要递归调用this.observe // 执行深层次的数据劫持 defineReactive(obj,key,val){ Object.defineProperty...接到这个需求应如何实现呢?
今天字节笔试的第二题,详情由于保密协议不能上网,但是大意就是给一大堆节点,去求LCA。...递归直接爆栈,用stack写递归有一个点,改进优化了一下有两个点…… 我印象中这个算法挺简单的,就搜了一下,果然找到了。不是,现在校招算法题都这么丧病了吗。 由于保密协议,不能放代码。...LCA问题参考资料, Tarjan的时间复杂度为O((n+q)× 并查集的复杂度 ),而使用路径压缩和按秩合并的并查集复杂度为O(Alpha(n))。所以作为离线算法,Tarjan比倍增算法快很多。...top && head[Stack[top]] == 0) top--;//清理叶子节点 } void swim(int &x,int H){ //目标是让x向上跳H步,使用二进制方式...for(int i=0;H>0;i++){ if(H&1) x = anc[x][i];//i相当于现在跳2^i步,当H%2==1时 x
其次,Computed 相关原理需要一些 Effect 相关的原理。如果你不是很清楚 Effect 是什么,推荐你优先阅读我的这篇 Vue3中的响应式是如何被JavaScript实现的。...只有当计算属性(fullName)中依赖的响应式数据 发生改变时,计算属性才会重新执行从而计算出最新的值。 支持任意值 大多数小伙伴利用 Computed 时,无非是使用了它的计算以及缓存两个特点。...当传入第二个函数时,当第一个参数中依赖的响应式数据变化并不会执行传入的 getter 而是回执行对应的第二个参数 scheduler。 在 scheduler 中,我们进行了处理。...Effect 我已经在前置文章 Vue3中的响应式是如何被JavaScript实现的 中介绍过它的实现,有兴趣深入了解的同学可以移步查阅。 同理,当我们首次访问该计算属性时。...当我们使用了该 computed 时,访问 computed 的 getter 属性。
领取专属 10元无门槛券
手把手带您无忧上云