golang

golang 网络框架之 gin

独自空忆成欢 提交于 2019-12-05 20:26:01
golang 原生 http 库已经可以很方便地实现一个 http server 了,但对于复杂的 web 服务来说,路由解析,请求参数解析,对象返回等等,原生 api 就显得有些不太够用了,而 gin 是一个功能完备,性能很高的 web 网络框架,特别适合 web api 的开发 hello world package main import "github.com/gin-gonic/gin" func main() { r := gin.New() r.GET("/ping", func(c *gin.Context) { c.String(200, "hello world") }) r.Run() // listen and serve on 0.0.0.0:8080 } 如这个 hello world 程序所示 gin 所有的业务逻辑都在 func(c *gin.Context) 函数中实现,请求和返回都通过这个 gin.Context 传递 请求参数解析 gin 提供了丰富的请求参数获取方式 (c *Context) Query(key string) string // 获取 GET 参数 (c *Context) QueryArray(key string) []string // 获取 GET 参数数组 (c *Context) DefaultQuery(key

docker golang 开发环境

扶醉桌前 提交于 2019-12-05 20:24:39
go 版本的不一致,依赖库不一致,导致编译失败;代码生成工具不一致,导致生成代码有问题;依赖工具缺失,导致测试不通过等等,开发环境和生产环境之间的差异会导致各种各样奇怪的问题,而 docker 特别擅长解决这种一致性问题 总体方案 最简单粗暴的一种方式就是每次都将代码拷贝到一个新的容器内,执行编译,编译完成后直接将容器制作成镜像,但这种方式每次编译都需要重新拉取依赖,比较耗时 我们采用在这个基础上稍作优化,启动一个固定的容器用于编译,编译完成后将生成的结果拷贝出来,制作新的镜像,能达到近乎本地编译的效果 编译环境镜像 没有直接使用 dockerhub 上的 golang 镜像,是因为我们的项目除了 golang 可能还依赖一些别的工具,比如 makefile,python,protoc 等等,就需要自己制作镜像了,这里我选 centos 作为基础镜像,主要是考虑到后面制作服务镜像的时候也仅需要 centos 即可,不需要完整的 golang 环境 FROM centos:centos7 RUN yum install -y kde-l10n-Chinese && yum reinstall -y glibc-common && localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 RUN yum install -y epel-release RUN

Golang defer 使用时的坑

一笑奈何 提交于 2019-12-05 19:57:13
defer是golang语言中的关键字,用于资源的释放,会在函数返回之前进行调用。一般采用如下模式: f,err := os.Open(filename) if err != nil { panic(err) } defer f.Close() 如果有多个defer表达式,调用顺序类似于栈,越后面的defer表达式越先被调用。 不过如果对defer的了解不够深入,使用起来可能会踩到一些坑,尤其是跟带命名的返回参数一起使用时。在讲解defer的实现之前先看一看使用defer容易遇到的问题。 先来看看几个例子。例1: func f() (result int) { defer func() { result++ }() return 0 } 例2: func f() (r int) { t := 5 defer func() { t = t + 5 }() return t } 例3: func f() (r int) { defer func(r int) { r = r + 5 }(r) return 1 } 请读者先不要运行代码,在心里跑一遍结果,然后去验证。 例1的正确答案不是0,例2的正确答案不是10,如果例3的正确答案不是6...... defer是在return之前执行的。这个在 官方文档 中是明确说明了的。要使用defer时不踩坑,最重要的一点就是要明白,return

golang编程-小问题

醉酒当歌 提交于 2019-12-05 19:27:06
环境变量GOROOT和GOPATH 下载第三方库时网络连接报错: 修改GOPROXY为goproxy.cn ;因为 Go 1.13 将 GOPROXY 默认成了中国大陆无法访问的 https://proxy.golang.org 项目运行编译过程中 go.sum 文件可能会导致第三方库下载版本不匹配而报错。 gcc编译 64位,Windows:下载64位gcc即可 https://www.cnblogs.com/tugeler/p/6110174.html For a smooth win64 build experience I recommend using http://tdm-gcc.tdragon.net/ (the 64 bit version) instead. 来源: https://www.cnblogs.com/Risk2S/p/11941523.html

[转载]golang sync.Pool

点点圈 提交于 2019-12-05 18:36:27
Go 1.3 的sync包中加入一个新特性:Pool。 官方文档可以看这里 http://golang.org/pkg/sync/#Pool 这个类设计的目的是用来保存和复用临时对象,以减少内存分配,降低CG压力。 type Pool func (p *Pool) Get() interface{} func (p *Pool) Put(x interface{}) func New() interface{} Get返回Pool中的任意一个对象。 如果Pool为空,则调用New返回一个新创建的对象。 如果没有设置New,则返回nil。 还有一个重要的特性是,放进Pool中的对象,会在说不准什么时候被回收掉。 所以如果事先Put进去100个对象,下次Get的时候发现Pool是空也是有可能的。 不过这个特性的一个好处就在于不用担心Pool会一直增长,因为Go已经帮你在Pool中做了回收机制。 这个清理过程是在每次垃圾回收之前做的。垃圾回收是固定两分钟触发一次。 而且每次清理会将Pool中的所有对象都清理掉! package main import( "sync" "log" ) func main(){ // 建立对象 var pipe = &sync.Pool{New:func()interface{}{return "Hello,BeiJing"}} // 准备放入的字符串

golang实战--客户信息管理系统

谁说我不能喝 提交于 2019-12-05 17:02:35
总计架构图: model/customer.go package model import ( "fmt" ) type Customer struct { Id int Name string Gender string Age int Phone string Email string } func NewCustomer(id int, name string, gender string, age int, phone string, email string) Customer { return Customer{ Id: id, Name: name, Gender: gender, Age: age, Phone: phone, Email: email, } } func NewCustomer2(name string, gender string, age int, phone string, email string) Customer { return Customer{ Name: name, Gender: gender, Age: age, Phone: phone, Email: email, } } func (c Customer) GetInfo() string { info := fmt.Sprintf("%v\t%v\t%v\t%v\t

在CentOS下搭建GoLang开发环境

回眸只為那壹抹淺笑 提交于 2019-12-05 11:33:54
下载安装包 [vagrant@dk ~]$ wget http://mirrors.ustc.edu.cn/golang/go1.13.linux-amd64.tar.gz 使用USTC 中科大开源镜像站,速度更快一些。 解压&配置 [vagrant@dk ~]$ sudo mkdir /opt/gowork # 工作目录 [vagrant@dk ~]$ sudo tar -xvf go1.13.linux-amd64.tar.gz -C /opt/ [vagrant@dk ~]$ mkdir /opt/gowork [vagrant@dk ~]$ sudo vim /etc/profile # 配置GOPATH&GOROOT export GOPATH=/opt/gowork export GOROOT=/opt/go export PATH=$PATH:$GOROOT/bin:$GOPATH/bin [vagrant@dk ~]$ source /etc/profile # 刷新配置 [vagrant@dk ~]$ go version # 查看版本 go version go1.13 linux/amd64 Hello World: [vagrant@dk ~]$ cd $GOPATH # 进入到工作目录 [vagrant@dk gowork]$ sudo touch

[翻译] effective go 之 Initialization

寵の児 提交于 2019-12-05 10:23:11
Initialization Although it doesn't look superficially very different from initialization in C or C++, initialization in Go is more powerful. Complex structures can be built during initialization and the ordering issues between initialized objects in different packages are handled correctly. 从表面上看 Go的初始化和C/C++区别不大 但是Go更加给力 复杂的数据结构可以在初始化的时候建立起来 并且Go可以准确地处理不同包之间的对象初始化顺序 Constants 常量初始化 Constants in Go are just that—constant. They are created at compile time, even when defined as locals in functions, and can only be numbers, strings or booleans. Because of the compile-time restriction, the

Golang在windows下交叉编译linux程序

谁说胖子不能爱 提交于 2019-12-05 10:21:55
1、下载相关程序。   Golang下载:http://www.golangtc.com/download   Git下载:http://git-scm.com/download/   TDM-GCC下载:http://tdm-gcc.tdragon.net/download 2、Go编译环境配置   安装 TDM-GCC,程序会自动设置PATH环境变量,如果没有设置成功请手动设置。   安装Go,安装完后需要设置GOROOT,GOPATH,GOBIN,PATH环境变量,   其中     GOROOT为你的Go安装跟目录   GOPATH为你go程序开发目录,go get后的包也会下载到该目录。   GOBIN为你的go运行目录,运行 go install 命令后,程序会被安装到该目录。   PATH为你Go程序根目录,用于能够通过控制台调用go命令。 3、配置交叉编译环境   在Go根目录下的src目录,新建一个build.bat文件,并复制内容如下: set CGO_ENABLED=0set GOROOT_BOOTSTRAP=C:/Go ::x86块 set GOARCH=386set GOOS=windows call make.bat --no-clean set GOOS=linux call make.bat --no-clean set GOOS=freebsd

(三十四)golang--接口

不打扰是莪最后的温柔 提交于 2019-12-05 09:18:32
golang的多态特性主要体现在接口上; 主要优势:高内服低耦合; package main import ( "fmt" ) type usb interface { start() stop() } type phone struct { } func (p phone) start() { fmt.Println("手机开始工作") } func (p phone) stop() { fmt.Println("手机停止工作") } type camera struct { } func (c camera) start() { fmt.Println("相机开始工作") } func (c camera) stop() { fmt.Println("相机停止工作") } type computer struct { } func (co computer) working(usb usb) { usb.start() usb.stop() } func main() { computer := computer{} phone := phone{} camera := camera{} computer.working(phone) computer.working(camera) } 来源: https://www.cnblogs.com/xiximayou/p