每年营收翻倍的 AfterShip 是如何体系化做新员工培训(下)

### AfterShip 自 2012 年成立以来,每年业务都可实现 100% 的复合增长。对于这家公司来说,组建团队是一件更重要的事情,并且尤为重视工程师团队文化的建设,他们推崇团队文化多元化及相互包容性,并要求团队每个人都要懂产品以及客户。 因此对于 AfterShip 来说,做好新员工培训成为了一场重要的“战役”。今天,AfterShip CTO & TGO 鲲鹏会会员洪小军,及其 AfterShip 的廖国添将分享每年营收翻倍的全球化 SaaS 公司 AfterShip 是如...阅读全文

Go语言中文网 2020-03-30 08:54:48 wangxihua916

HTTPS原理以及GOLANG指定HTTPS密码套件

文章来源 最近跟菊厂合作,我司向他们提供SAAS服务。但由于他们对服务安全管控比较严格,内部有专门部门去审核上线的服务。因此菊厂派人来我司专门对安全这块做全面排查,期间加了不少班。其中他们提到了对HTTPS密码套件做配置,当初只知道HTTPS握手后需要非对称加密的算法,后面查询了才知道原来还有这一系列的通讯过程中使用的密码算法。特此写下文章作为学习记录。 HTTPS简介 HTTPS是Hyper Text Transfer Protocol Secure的缩写。是一个计算机系统间进行安全通信的协议...阅读全文

Segmentfault 2020-04-02 01:32:34 liaoyizhe

疫情期间的Go面经

前序 Hello,大家好~ 由于新冠状病毒的原因、现场面试全部改为视频面试。下面来分享下疫情期间的一些面试经验和反思哦。 中序 switch "company" { case "某未来": process:=` 1-2面 -120分钟 1. mysql .索引相关.select * from table where id=1 或 where a=1 数据是怎么查出来的。(id 主键 a是普通索引或者a 无索引) 2. update set a=1 from table where a=2 会加锁...阅读全文

Segmentfault 2020-04-01 23:32:35 xiaowei520

学习golang的条件编译

昨天学习了go generate,今天学习另外一个知识点,一样是跟注释有关的知识点。golang的条件编译,也叫编译约束(build constraints)。 应用场景 条件编译可以在适应不同平台操作系统的代码上体现。不同的操作系统平台,对某些特性的支持不太一样,但是往往在业务层面上的代码不会去关注,所以需要对底层的代码进行一些封装。比如,Windows和Linux的home目录是不一样的,而我们的业务需要读取home目录,那此时我们就可以用条件编译来达到效果。 条件编译的两种形式 条件编译可...阅读全文

51CTO博客 2020-03-29 12:35:40 wx5e1abbbb0a5e5

4.微服务-go-micro

1.介绍 1.1go-micro 简介 ⚫ Go Micro 是一个插件化的基础框架,基于此可以构建微服务,Micro 的设计哲学是可插拔的插件化架构 ⚫ 在架构之外,它默认实现了 consul 作为服务发现(2019 年源码修改了默认使用mdns),通过 http 进行通信,通过 protobuf 和 json 进行编解码 1.2 go-micro 的主要功能 服务发现: 负载均衡: 消息编码: 请求/响应: Async Messaging: 可插拔接口: 插件地址:https://githu...阅读全文

51CTO博客 2020-03-29 21:16:07 DevOperater

Go是面向对象的语言吗?

该篇文章首发于boyn.top,转载请声明 Go语言是面向对象的语言吗? 如果某个开发人员在学习Go之前,对于Java,C#那套面向对象设计方法很熟悉的人员,在学习Go的时候,面对Go中的结构体struct,接口interface等概念,也许会产生疑问:Go语言是一门面向对象的语言吗.这个问题的答案是:Yes and No. 我们来看看官方是怎么说的 Yes and no. Although Go has types and methods and allows an object-orient...阅读全文

Segmentfault 2020-04-01 22:32:35 Boyn

Go指南-数组与切片

在Golang中,数组与切片是两个概念,数组用的比较少,切片用的比较多,也更为常见,理解了它们之间的关系,能够帮助我们减少一些奇奇怪怪的问题。 一切还要从这张图讲起.. 这张图中说明了数组和切片的核心区别,同时也是本文讲解的重点: 1.数组的声明需要指定长度,而切片可指定也可不指定。 2.切片本质是对数组一个引用,切片改变,数组也会改变。 3.切片包含三个部分:数组引用、长度属性、容量属性。长度属性指的是切片的元素数量,决定了可读取数据的上限;而容量属性指的切片的最大元素数量,决定切片了扩展的上...阅读全文

掘金 2020年03月29日 言淦

【Go语言踩坑系列(六)】面向对象

声明 本系列文章并不会停留在Go语言的语法层面,更关注语言特性、学习和使用中出现的问题以及引起的一些思考。 问题思考 为什么有结构体? 首先,我们需要明确面向对象的思想是包含各种独立而又互相调用,这就需要一个承载的数据结构,那么这个结构是什么呢?很显然,在GO语言中就是结构体。其次,结构体作为一种数据结构,无论是在C还是C++还是Go都发挥了极其重要的作用。另外,在Go语言中其实并没有明确的面向对象的说法,实在要扯上的话,我们可以将struct比作其它语言中的class。至于为什么不用class...阅读全文

Segmentfault 2020-04-01 13:32:36 NoSay

图解kubernetes控制器StatefulSet核心实现原理

StatefulSet是k8s中有状态应用管理的标准实现,今天就一起来了解下其背后设计的场景与原理,从而了解其适用范围与场景 1. 基础概念 首先介绍有状态应用里面的需要考虑的一些基础的事情,然后在下一章我们再去看statefulSet的关键实现 1.1 有状态与无状态 在日常开发的应用中,通常可以分为两大类:有状态与无状态,比如web服务通常都是无状态的,web应用数据主要来自后端存储、缓存等中间件,而本身并不保存数; 而诸如redis、es等其数据也是应用自身的一部分,由此可以看出有状态应用...阅读全文

Segmentfault 2020-04-01 13:32:36 仔仔

通过http tunnel连接mysql

背景 (1) 公司为了降低工作效率, 连接mysql必须通过特定的代理才能连接 (2) 产线这个模式可以理解, 但是测试环境你也搞个这个,那我就要哭了 (3) 在公司用wifi可以连接,但是在家无法直接连接mysql,只能通过垃圾的网页版mysql进行数据库操作 (4) 可以通过网页访问docker的权限,并没有任何服务器权限 解决方案 (1) nginx的stream实现tcp流量转发 (2) nginx的http proxy connect实现http tunnel (3) Navicat ...阅读全文

Segmentfault 2020-04-01 13:32:35 去去1002

职场新手引导-Golang后端开发流程演示

对于职场新手来说,进入一家新公司,除了要搭建一下开发环境,还需要了解一下项目组的开发流程。只有在了解了开发流程后,才能真正参与到项目的开发中,那么接下来我就介绍一下常见的开发流程,并用Github仓库来一步步演示如何开发。首先介绍一下开发流程的10个步骤: 开发流程 接受需求任务 创建需求分支 编写需求代码 编写测试代码 Push需求分支 提交Pull Request 触发CI代码检测 人工代码Review 合并到主干分支 完成需求任务 接下来我就会在Github中演示一下开发流程,演示的Git...阅读全文

简书 2020-03-29 01:33:08 撩课学院

微服务

微服务简介 RPC 官方net/rpc包 package main import ( "fmt" "net/rpc" ) //客户端逻辑实现 func main() { client,err := rpc.DialHTTP("tcp","localhost:8081") if err != nil { panic(err.Error()) } var req float32 //请求值 req = 3 //var resp *float32 //返回值 ////同步的调用方式 //err = c...阅读全文

简书 2020-03-29 01:33:03 isuntong

从零开始写GO-API框架 一 [重复造轮子 - Golang] - 草稿

先嘚啵几句 大家好,Golang这么棒的语言学习的人越来越多,github上的轮子也是逐渐多起来,但很多刚学的朋友没有深入理解轮子的原理,看轮子使用手册直接就用,每个人轮子的规则策略基本都有自己的特性,我们不能每次都跟重新学本书一样,人脑有限是学不过来的 俗话说:『知其然知其所以然』。为了不让每个轮子都重新学一遍,最好的办法把轮子的核心思想掌握,这样拿过来一个同样属性的轮子,你就能从上层一眼看透整体轮子的架构,稍微学学就知道好处和痛点在什么地方。 不管API框架轮子有多少,但核心思想基本一致,就...阅读全文

简书 2020-03-29 01:32:42 晓亮1988

go服务docker实践-缩小镜像占用

小张开始学习go语言啦,从服务发布开始吧 背景: 需要发布GO服务,所以开始编辑dockerfile,遇到了些问题,在此记录下,一起学习吧,文档同时更新到公众号里了,可以加个关注呦,写的不对的地方请指出,3Q 1 说在前面 本文环境建立在已安装docker服务基础上,请先准备好docker环境 2 docker镜像要求 我们首先思考一下云原生对应用运行时的不同需求: 体积更小:对于微服务分布式架构而言,更小的体积意味着更少的下载带宽,更快的分发下载速度。 启动速度更快:对于传统单体应用,启动速度...阅读全文

掘金 2020年03月28日 小张学编程

Go Web编程--给自己写的服务器添加错误和访问日志

错误日志和访问日志是一个服务器必须支持的功能,我们教程里使用的服务器到目前为止还没有这两个功能。正好前两天也写了篇介绍logrus日志库的文章,那么今天的文章里就给我们自己写的服务器加上错误日志和访问日志的功能。在介绍添加访问日志的时候会介绍一种通过编写中间件获取HTTP响应的StausCode和Body的方法。 Go Web 编程系列的每篇文章的源代码都打了对应版本的软件包,供大家参考。公众号中回复gohttp11获取本文源代码 初始化日志记录器 我们先来做一下初始化工作,在项目里初始化记录错...阅读全文

掘金 2020年03月28日 kevinyan

【Go语言踩坑系列(五)】错误与异常处理

声明 本系列文章并不会停留在Go语言的语法层面,更关注语言特性、学习和使用中出现的问题以及引起的一些思考。 为什么需要错误和异常处理 任何一行代码都可能存在不可预知的问题,而这些问题就是bug的根源。为了妥善处理这类问题,我们需要编写一些代码,这类代码被称为运维代码。通常情况下,我们需要发现问题、判断问题的种类、然后根据问题的种类,分别进行响应与处理。这些处理可能是写入日志、也可能是直接让代码停止运行,这些都视你的业务逻辑而定。这样一来,在我们编写了足够健壮的运维代码之后,我们便能快速的定位并解...阅读全文

Segmentfault 2020-04-01 13:32:34 NoSay

Go for range常见的坑

在日常开发中,for range肯定是经常用到的,下面我整理了一些自己平常会遇到的坑 首先第一个肯定是遍历slice的坑了 func main() { arr := []int{1, 2, 3} newArr := []*int{} for _, v := range arr { newArr = append(newArr, &v) } for _, v := range newArr { fmt.Println(*v) } } // 输出 3 3 3 之所以会输出3 3 3是因为for ra...阅读全文

Segmentfault 2020-04-01 01:32:34 iuoui