golang

Linux下配置Golang开发环境

房东的猫 提交于 2019-11-28 22:53:22
前几天无意间看到了微信推送的golang开发的消息,看到golang那么牛逼,突然心血来潮想学习一下go。工欲善其事必先利其器,想做go开发,必须先配置好go的开发环境(就像开发Java先安装配置jdk一样)。在网上找了半天,一直没有找到满意的教程(看来golang在国内还是不火)遂自己摸索,踩了不少坑,特来记录一下,希望能帮助到别人,少走弯路。由于我把除了C/C++以外的开发都搬迁到Linux下了,所以就在Ubuntu下安装配置了golang。其实Windows下的安装也是大同小异了。 1 先去golang官网下载golang的安装包 golang的官网在国内访问比较慢,建议去国内的网站下载 https://studygolang.com/dl 根据不同的平台选择对应的安装包 下载.png Linux的下载上面的,Windows下载下面的 2 安装 Windows的双击然后选择目录安装就好了。Linux的用 sudo tar -C /usr/local/ -xzvf go1.10.2.linux-amd64.tar.gz 命令解压到 /urs/local/ 目录。解压完成,下一步 3 配置环境变量 在这里想说句mmp,用网上的教程配置完,要不提示 程序go尚未安装,要不就 go install 命令无法使用,所以自己摸着石头过河,终于是过去了。话不多说,开始配置。 在 /etc

golang微服务框架go-micro 入门笔记2.3 micro工具之消息接收和发布

坚强是说给别人听的谎言 提交于 2019-11-28 22:24:48
本章节阐述micro消息订阅和发布相关内容 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架go-micro 入门笔记2.1 micro工具之micro api golang微服务框架go-micro 入门笔记2.2 micro工具之micro web broker代理 微服务之间需要通过broker来传递消息,go-micro支持http/nats/memory三种broker,其中http是默认的broker。 同时,go-micro以强大的插件形式,提供如下几种常见的broker。 $ls gocloud/ googlepubsub/ grpc/ kafka/ mqtt/ nats/ nsq/ proxy/ rabbitmq/ redis/ snssqs/ sqs/ stan/ stomp/ http HTTP Broker 是基于HTTP的异步broker,源代码在 github.com\micro\go-micro@v1.9.1\broker\broker.go 中,默认DefaultBroker为http var ( DefaultBroker Broker = newHttpBroker() ) httpbroker实际上就是一个结构体 type httpBroker

[golang] go micro 微服务部署

若如初见. 提交于 2019-11-28 22:13:08
1、安装Service Discovery 默认情况请安装consul(下载地址:https://www.consul.io/downloads.html),下载对应的系统下的文件,将可执行文件放入GOPATH下面的bin目录下 2、安装Protobuf 安装protoc (下载地址:https://github.com/protocolbuffers/protobuf/releases),下载对应的系统下的文件,将可执行文件放入GOPATH下面的bin目录下 安装好上面的的两个micro依赖后,将依赖执行文件放入环境变量中(可以将其放入go的环境变量中,go环境本身需已经加入了环境变量) 3、下载go-micro支持插件 由于golang.org/x/net被墙了,所以需要设置代理访问 go get -u github.com/golang/protobuf/{proto,protoc-gen-go} go get -u github.com/micro/protoc-gen-micro https_proxy=192.168.3.5:1080 go get -u github.com/micro/micro #代理地址修改为:https://goproxy.io 4、编辑器所在环境的gopath目录下的./pkg/mod/下面需要包含引用的包,不然编辑器编辑的时候将无法引用到包

golang 管理 pidfile

筅森魡賤 提交于 2019-11-28 21:58:08
Pidfile 存储了进程的进程 id。一般情况下 pidfile 有以下几个作用: 其他进程可以读取 pidfile 获取运行进程的 pid(当然也可以通过其他命令 动态获取) 在启动进程前先检查 pidfile,防止启动多个后台进程(特别像 agent 之类的) 下面是 docker 中管理 pidfile 的方法: package main import ( "fmt" "io/ioutil" "os" "path/filepath" "strings" log "github.com/sirupsen/logrus" ) func main() { _, err := NewPIDFile("pid.file") if err != nil { log.Errorf("error to create the pid file failed:%s", err.Error()) } } // PIDFile stored the process id type PIDFile struct { path string } // just suit for linux func processExists(pid string) bool { if _, err := os.Stat(filepath.Join("/proc", pid)); err == nil {

golang 上传文件(包括 gin 实现)

五迷三道 提交于 2019-11-28 21:57:22
golang web服务有时候需要提供上传文件的接口,以下就是具体示例。为了示例简单(吐槽下 golang 的错误处理), 忽略了所有的错误处理。本文会用两种方式(标准库和 gin )详细讲解 golang 实现文件上传的实现。 gin 是一个用 golang 实现的优秀 web 服务框架 上传文件 标准包实现 package main import ( "io" "log" "net/http" "os" ) var ( // 文件 key uploadFileKey = "upload-key" ) func main() { http.HandleFunc("/upload", uploadHandler) if err := http.ListenAndServe(":8080", nil); err != nil { log.Fatalf("error to start http server:%s", err.Error()) } } func uploadHandler(w http.ResponseWriter, r *http.Request) { // 接受文件 file, header, err := r.FormFile(uploadFileKey) if err != nil { // ignore the error handler } log

Golang系列:常用的文件读写操作

天大地大妈咪最大 提交于 2019-11-28 21:34:52
Go 语言提供了很多文件操作的支持,在不同场景下,有对应的处理方式,今天就来系统地梳理一下,几种常用的文件读写的形式。 一、读取文件内容 1、按字节读取文件 这种方式是以字节为单位来读取,相对底层一些,代码量也较大,我们看下面代码: // read-bytes.go package main import ( "fmt" "io" "os" ) func main() { file, _ := os.Open("test.txt") defer file.Close() // 字节切片缓存 存放每次读取的字节 buf := make([]byte, 1024) // 该字节切片用于存放文件所有字节 var bytes []byte for { // 返回本次读取的字节数 count, err := file.Read(buf) // 检测是否到了文件末尾 if err == io.EOF { break; } // 取出本次读取的数据 currBytes := buf[:count] // 将读取到的数据 追加到字节切片中 bytes = append(bytes, currBytes...) } // 将字节切片转为字符串 最后打印出来文件内容 fmt.Println(string(bytes)) } 2、结合 ioutil 来读取 如果我们不想那么麻烦,可以结合 ioutil

go(三)

て烟熏妆下的殇ゞ 提交于 2019-11-28 20:44:37
go语言的一些规范: (1)包名:保持package的名字和目录保持一致,尽量取有意义的包名,简短,有意义,不要和标准库冲突,比如fmt (3)变量名、函数名、常量名:采用驼峰 (2)如果变量名、函数名、常量名首字母大写,则可以被其他的包访问,如果首字母小写,则只能被本包访问。(简单理解就是:大写的公有的,小些的私有的) 运算符 (go没有三元运算符) 只写和java的运算符有差异的地方 (1)golang中++和--只能独立使用,不能和任何运算符结合使用,比如“=”,“>”,等等。并且++和--只能出现在变量后 下面这些写法都收错误的 i++ > 10 var a = i++ //不能这么使用,i++只能独立使用 ++i //这种写法也是错误的,在java中可以这么写,但是在golang中++,--只能写在变量后面 (2)golang的赋值运算符,比java的多一些 位运算符 其他运算符 来源: https://www.cnblogs.com/songcuiting/p/11426972.html

golang中type常用用法

二次信任 提交于 2019-11-28 20:09:04
golang中,type是非常重要的关键字,一般常见用法就是定义结构,接口等,但是type还有很多其它的用法,在学习中遇到了以下几种,这点简单总结记录下 定义结构 type Person struct { name string age int } type Mutex struct {} type OtherMutex Mutex //定义新的类型 func (m *Mutex) Lock(){ fmt.Println("lock") } func (m *Mutex) Unlock(){ fmt.Println("lock") } func main() { m := &OtherMutex{} //注意,OtherMutex不具有Lock和Unlock方法 m.Lock() } 定义接口 type Personer interface{ ShowName(s string) } 类型定义 type Myint int //定义一个新的类型, //定义一个类型方法 func (m Myint) showValue() { fmt.Println("show int", m) } func main() { var m Myint = 9 //变量声明 m.showValue() } 新定义的类型,可以定义方法, 如上例的 showValue() 别名定义 定义和原来一样的类型

Golang编程之os/exec命令使用

梦想与她 提交于 2019-11-28 20:07:02
Package exec import "os/exec" package exec运行外部命令。它包装os.startprocess,以便重新映射stdin和stdout、将I/O与管道连接以及进行其他调整。 目录 1. 协程执行命令 2. 阻塞执行命令 3. 实时输出命令 4. 阻塞输出命令 1. 协程执行命令 func CmdSyncExec(name string, arg ...string) error { cmd := exec.Command(name, arg...) if err := cmd.Start(); err != nil { return err } //wait for command to finishing ... if err := cmd.Wait(); err != nil { return err } return nil } 2. 阻塞执行命令 func CmdBlockExec(name string, arg ...string) error { cmd := exec.Command(name, arg...) if err := cmd.Run(); err != nil { return err } return nil } 3. 实时输出命令 func CmdSyncOutput(name string, arg ..

大话图解golang map源码详解

孤人 提交于 2019-11-28 19:18:30
网上分析golang中map的源码的博客已经非常多了,随便一搜就有,而且也非常详细,所以如果我再来写就有点画蛇添足了(而且我也写不好,手动滑稽)。但是我还是要写,略略略,这篇博客的意义在于能从几张图片,然后用我最通俗的文字,让没看过源码的人最快程度上了解golang中map是怎么样的。 当然,因为简单,所以不完美。有很多地方省略了细节问题,如果你觉得没看够,或者本来就想了解详细情况的话在文末给出了一些非常不错的博客,当然有能力还是自己去阅读源码比较靠谱。 那么下面我将从这几个方面来说明,你先记住有下面几个方向,这样可以有一个大致的思路: 基础结构:golang中的map是什么样子的,是由什么数据结构组成的? 初始化:初始化之后map是怎么样的? get:如何获取一个元素? put:如何存放一个元素? 扩容:当存放空间不够的时候扩容是怎么扩的? 基础结构 图解 这个就是golang中map的结构,其实真的不复杂,我省略了其中一些和结构关系不大的字段,就只剩下这些了。 大话 大话来描述一些要点: 最外面是hmap结构体,用buckets存放一些名字叫bmap的桶(数量不定,是2的指数倍) bmap是一种有8个格子的桶(一定只有8个格子),每个格子存放一对key-value bmap有一个overflow,用于连接下一个bmap(溢出桶) hmap还有oldbuckets,用于存放老数据