Go 编程: 应用级抽象之信号管控

在软件开发过程中,我们常常做的一件事,就是编写公用库,或是基础库。这个过程可以称之为应用级抽象。应用级抽象的好处在于,接口主要面向应用,所以在适配度远远超过功能性接口。 以信号管控为例,在 Go 语言中管控进程信号,非常简单。只需要简单的 3 行代码即可完成管控: package main import "os/signal" func main() { //信号接收 channel sigCh := make(chan os.Signal, 1) //监听信号(所有信号) signal.Not...阅读全文

Segmentfault 2020-02-23 04:32:42 JayL

Go 每日一库之 dig

简介 今天我们来介绍 Go 语言的一个依赖注入(DI)库——dig。dig 是 uber 开源的库。Java 依赖注入的库有很多,相信即使不是做 Java 开发的童鞋也听过大名鼎鼎的 Spring。相比庞大的 Spring,dig 很小巧,实现和使用都比较简洁。 快速使用 第三方库需要先安装,由于我们的示例中使用了前面介绍的go-ini和go-flags,这两个库也需要安装: $ go get go.uber.org/dig $ go get gopkg.in/ini.v1 $ go get g...阅读全文

Segmentfault 2020-02-23 04:32:41 darjun

从源代码角度看epoll在Go中的使用(一)

Go提供了功能完备的标准网络库:net包,net包的实现相当之全面,httptcpudp均有实现且对用户提供了简单友好的使用接口。在Linux系统上Go使用了epoll来实现net包的核心部分,本文从用户接口层入手,分析Go在Linux平台上的epoll使用,文中若有不当之处请指出。 对于服务端程序而言,主要流程是Listen->Accept->Send/Write,客户端主要流程Connect->Send/Write,本文以这两个流程深入分析net包在Go中是如何实现的。 Listen 监听方...阅读全文

Segmentfault 2020-02-23 04:32:41 shaoyuan1943

Golang Slice 的 append 扩容

首先之前关于 slice 的 append 理解: 每次 append 操作都会检查 slice 是否有足够的容量,如果足够会直接在原始数组上追加元素并返回一个新的 slice,底层数组不变而若容量不够,会创建一个新的容量足够的底层数组,先将之前数组的元素复制过来,再将新元素追加到后面,然后返回新的 slice,底层数组改变而这里对新数组的容量定义是按 乘以2 的机制增加 而今天看到关于 Golang 切片的底层结构即 reflect.SliceHeader 时,发现 append 的扩容并不完...阅读全文

Segmentfault 2020-02-23 04:32:41 邹友

图解go反射实现原理

Go反射的实现和``interface``和``unsafe.Pointer``密切相关。如果对golang的``interface``底层实现还没有理解,可以去看我之前的文章:[Go语言interface底层实现](https://mp.weixin.qq.com/s/re_9CmGm3xEbY7xCr5CYbQ),``unsafe.Pointer``会在后续的文章中做介绍。 (本文目前使用的Go环境是Go 1.12.9) ## interface回顾 首先我们简单的回顾一下i...阅读全文

Go语言中文网 2020-02-22 20:47:53 RyuGou

golang实现RPC调用

RPC远程调用 RPC通信过程 调用者(客户端Client)以本地调用的方式发起调用 Client stub(客户端存根)收到调用后,负责将被调用的方法名、参数等打包编码成特定格式的能进行网络传输的消息体; Client stub将消息体通过网络发送给服务端; Server stub(服务端存根)收到通过网络接收到消息后按照相应格式进行拆包解码,获取方法名和参数; Server stub根据方法名和参数进行本地调用; 被调用者(Server)本地调用执行后将结果返回给server stub; S...阅读全文

简书 2020-02-22 19:32:47 JN_golang

类型转换和断言

Golang不支持隐式类型转换 普通类型转换 普通类型转换可以转换不同但是相互兼容的类型,例如int与float,int与rune,但是string与数字类型是不能进行普通类型转换的。 例如: a = 123 x := int32(a) y := float32(a) z := rune(a) string类型转换 rune切片 byte切片 string 强制转换 str := "abc" str1 := []rune(str) //[97 98 99] str2 := []byte(str)...阅读全文

简书 2020-02-22 19:32:46 元气蛋蛋

2020 年为什么要选择 Go 并放弃 Python

点击上方蓝色“Go语言中文网”关注我们,领全套Go资料,每天学习 Go 语言过去一段时间,Go 语言中文网推过挺多 Python 相关的公众号,很多人诧异:为什么推的都是 Python 的呢?其实主要原因是因为 Python 类的公众号实在太多了,而且很多粉丝都特别多,我也挺纳闷的。不过他们值得我学习,也说明 Go 还有很长的路要走。为了证明 Go 语言中文网坚持做 Go 语言,推广 Go、分享 Go,为 Go 的发展做贡献,这两天会分享两篇 Go 和 Python 的对比文章。欢迎指正。您会在...阅读全文

微信公众平台 2020-02-22 18:35:04 Go语言中文网

聊聊新的Go语言错误处理方案

今天早些时候,golang/x/exp中默默的更新了一个名曰xerrors的包,这个包和同样处于golang/x/exp下的另一个名叫errors的包名字十分相似,就连介绍也都一致: 123 Package errors implements functions to manipulate errors.This package implements the Go 2 draft designs for error inspection and printing 从目前的情况来看,基本上错误的处...阅读全文

ipfans's Blog 2019-01-25 00:00 ipfans's Blog

gini:一个让你更方便使用Gin框架的库

Gin框架是一个Go语言框架中非常受欢迎的一款。今天我们开放了一个gini库,结合了我们实际开发中的使用,描述一下我们为什么开发这个库,在开发过程中的权衡。 gini简介gini库目前发布了v0.1.0版本,支持几个常见的功能: 提供请求数据和返回数据打印记录中间件 提供可Mock化Bind方式 提供统一输出格式管理 目前gini库功能已经实际落地在开发过程中,在采用gin框架开发的程序中获得了应用。 设计思路在开发调试过程中,对于前后端分离模式开发过程中部分初级开发者无法进行方便的调试,尤其是...阅读全文

ipfans's Blog 2019-01-18 00:00 ipfans's Blog

图解Go内存分配器

本文翻译自《A visual guide to Go Memory Allocator from scratch (Golang)》。 当我刚开始尝试了解Go的内存分配器时,我发现这真是一件可以令人发疯的事情,因为所有事情似乎都像一个神秘的黑盒(让我无从下手)。由于几乎所有技术魔法都隐藏在抽象之下,因此您需要逐一剥离这些抽象层才能理解它们。 在这篇文章中,我们就来这么做(剥离抽象层去了解隐藏在其下面的技术魔法)。如果您想了解有关Go内存分配器的知识,那么本篇文章正适合您。 一. 物理内存(Phy...阅读全文

Go-001 学习参考

相关网站 1.golang.org 的中国镜像:https://golang.google.cn/ 2.中文比较活跃的社区:https://studygolang.com/ 相关文档 http://docscn.studygolang.com/ref/spec.old 相关书籍 《Go 语言圣经》 《Go 语言核心编程》 《Go程序设计语言》 可以去百度下载到PDF电子版 推荐的工具编辑器 IDE GoLand : https://www.jetbrains.com/go/阅读全文

简书 2020-02-22 15:32:52 LikePlayAPiano

Go-002 基本语法

1 hello world 1.1 代码 package main import "fmt" func main() { fmt.Println("hello world") } 1.2 执行 // 方法1 编译并执行 go run ./test002.go // 方法2 先构建后执行 go build ./test002.go // 构建 ./test002 // 执行 2 代码语法要素 2.1.语句 statement,构成源代码最基本的逻辑单位。 2.2.语句结束符 语句是需要结束的,所以...阅读全文

简书 2020-02-22 15:32:52 LikePlayAPiano

Go-004 常量

1 概述 一旦定义,其值不可更改的量,称之为常量。也是常量标识符和常量值。 常量用于存储简单数据类型:数值,字符串。 2 定义 语法:const c1 string = “GoLang” 语法上,支持批量定义,支持类型推导: const ( c1 int = 42 c2 = 42 c3 = "golang" ) fmt.Println(c1,c2,c3) 注意: 批量定义,若 后边的只写常量名,则代表和上一个一致 const ( c1 = 42 c2 c3 ) fmt.Println(c1,c2...阅读全文

简书 2020-02-22 15:32:50 LikePlayAPiano

leetcode_213

Golang: 思路:这题我个人感觉要复杂一些,难度在于首尾相连,并且,你需要考虑的更全面一些。当然,这题做完的时间复杂度100%,空间47%,但我不太想优化了。简单来说,有房子[1...n],通过打家劫舍1得出的最大值,我们需要做出判断:如果我们没抢n,那么这个最大值没有问题,如果我们抢了n,那么就需要去看下我们抢没抢1,如果也没抢1,那么没问题,但如果抢1了,那么这个最大值就需要修改了,为max([2....n],[1...n-1])。 代码如下: func rob(nums []int) ...阅读全文

简书 2020-02-22 15:32:50 淳属虚构

leetcode_343

Golang: 思路:这题以DP为思路,不算很难,以10为例子,我们知道结果是10=3+3+4这么拆分,如果我们假设res[i]表示i能拆分的正整数的最大乘积,那么如何计算res[10]呢?通过一个for循环,res[n]=res[i]*res[n-i],看看最大的res[n],即可。res[10]=res[3]*res[3]*res[4],实际上,也就是res[10]=res[3]*res[7] 代码如下: func integerBreak(n int) int { if n<=2 { re...阅读全文

简书 2020-02-22 15:32:49 淳属虚构

leetcode_338

Golang: 思路:这题以DP为思路,不算很难,以9为例,arr[9]=arr[8]+arr[9-8],arr[23]=arr[16]+arr[23-16] 代码如下: func countBits(num int) []int { if num==0 { return []int{0} } if num==1 { return []int{0,1} } arr:=make([]int,num+1) arr[0],arr[1],arr[2]=0,1,1 i:=2 for arr[num]==0...阅读全文

简书 2020-02-22 15:32:49 淳属虚构

从技术专家走向项目经理

1 项目经理的来源 就目前的IT企业而言,项目经理的来源大致可以分为2处,其一是从程序员、架构师转型的,其二是从业务、实施转型的。由于大家各自的技术底蕴不同,观念不同,因此也形成不同模式的项目经理。分解得简单一点,称之为“技术型项目经理”和“管理型项目经理”。 2 技术专家与项目经理的区别 角色:技术专家关注技术成果,负责技术攻坚;项目经理为项目的结果负责,总揽项目成败。 解决的问题:技术专家关注技术问题;项目经理除关注技术问题外,还需要关注项目范围、进度、成本、质量、资源、风险等问题 能力要求...阅读全文

简书 2020-02-22 15:32:48 陌若尘_c167

如何优雅的使用GDB调试Go

今天聊聊如何优雅的使用GDB调试Go程序。GDB有啥用?想了解代码底层的话,它是一大利器,更别说定位问题啥的。具体骚操作见曹大的使用 debugger 学习 golang但GDB从安装到可用,可能有一大堆问题要解决(尤其在Mac上),我们怎么能优雅的使用它,避免陷入问题中,是本文的重点。(涉及Docker和Mac两个平台上运行)先来看比较推荐的Docker方式Docker篇:3步即可调试docker加持的话,非常方便,随用随起先上效果:戳 gdb-debug-go-in-docker 可下载命令...阅读全文

简书 2020-02-22 15:32:47 Java天天

Go 模块--开始使用 Go Modules

Go的1.11和1.12版本包括对模块--新的Go依赖管理系统的初步支持,使依赖版本信息变得明确且更易于管理。这篇博客文章介绍了开始使用模块所需的基本操作。模块是存储在根目录有一个 go.mod文件的文件树中的 Go 包(package)的集合。go.mod文件定义了模块的module path(也是模块根目录的导入路径)以及模块依赖的其他模块的要求,满足了依赖要求模块才能被成功构建起来。每个依赖模块的要求被写为一个模块路径和相应的模块版本。下面展示了一个简单的go.mod文件 module e...阅读全文

简书 2020-02-22 15:32:45 Java天天