
go
左耳朵猫
这个作者很懒,什么都没留下…
展开
-
golang通过代理访问url
直接上实例package mainimport ( "fmt" "io/ioutil" "net/http" "net/url" "net" "time")func main() { proxyAddr := &quo原创 2018-09-10 21:15:17 · 10040 阅读 · 0 评论 -
go语言解析 map[string]interface{} 数据格式
注意事项map记得分配内存解析出来的int类型会变成float64类型注意判断不为nil后再转换类型package mainimport ( "fmt" "encoding/json")func main() { var m map[string]interface{} //声明变量,不分配内存 m = make(map[stri...原创 2018-04-03 13:22:31 · 50354 阅读 · 3 评论 -
Ubuntu配置golang的protobuf的go代码生成环境
1、下载gitsudo apt-get install git2、下载go语言的protobufgit clone https://github.com/golang/protobuf sudo apt-get install protobuf-compiler3、配置GOPATHvim ~/.bashrc source ~/.bashrc4、安装prot...原创 2018-03-27 20:03:38 · 1245 阅读 · 0 评论 -
Windows下安装Ubuntu虚拟机并配置go环境
安装虚拟机1、下载VMware,Ubuntu的iso安装包 2、打开bios中的VT-X、VT-D选项,VT就是虚拟机的意思 3、新建虚拟机 4、安装VMware tools。点击菜单虚拟机->安装VMWare tools,Ubuntu中出下载一个压缩包,解压出现文件夹vmware-tools-distrib,运行vmware-install.pl文件./vmware-instal...原创 2018-03-25 11:30:52 · 1275 阅读 · 0 评论 -
golang项目莫名的问题
# command-line-argumentscannot open file C:\Go\pkg\windows_amd64/user-service/userprofile/dao.a: open C:\Go\pkg\windows_amd64/user-service/userprofile/dao.a: The system cannot find the path specifie...原创 2018-03-29 19:43:15 · 1682 阅读 · 1 评论 -
go语言struct中的tag
一句话总结:方便通过tag获取struct的成员变量为什么要有taggo语言中命名都是推荐都是用驼峰方式,但是由于实际项目中经常需要和其它的系统进行数据交互,这个时候如果用属性名来作为键值可能不一定会符合项目要求。如代码中对象的结构体的成员变量和数据库表中的列名的映射关系的建立是通过struct Tag来实现的。如何获取tag直接上实例吧package mainimpo...原创 2018-03-22 22:12:30 · 1739 阅读 · 0 评论 -
yml文件解析
主要使用了开源组件github.com/uber-go/config直接上实例吧,这里的环境变量及具体yml文件路径都是配置过的。test.yml文件yml: desc: we are testing yml代码package mainimport ( "flag" "fmt" "github.com/uber-go/config" "os" "strings")var (...原创 2018-03-22 21:45:43 · 1685 阅读 · 0 评论 -
go语言“依赖注入”
一句话总结:解耦组件之间的依赖关系,避免手动配置每个组件的依赖关系。下面实例来自:https://godoc.org/github.com/facebookgo/injectpackage mainimport ( "fmt" "net/http" "os" "github.com/facebookgo/inject")// Our Awesome Applic...原创 2018-03-18 19:17:27 · 1256 阅读 · 0 评论 -
go语言中flag的用法——参数解析
一句话总结:用于参数解析package mainimport ( "flag" "fmt")var ( configPath = flag.String("configPath", "project/config/config.xml", "configPath flag"))func main() { flag.Parse() fmt.Println(*configPath)}我们获取配置文件有...原创 2018-03-18 18:22:44 · 6017 阅读 · 0 评论 -
go语言类型判断
一句话总结:利用类型判断可以判断接口是否属于某个具体的接口或者类型,另外.(type)仅用于switch语句。注意主体是接口类型,另外待判断对象的类型跟:接收方法若为值,判断对象可以是值或者指针;接收方法若为指针,判断对象也要是指针;接收方法若为值和指针,判断对象也要是指针。对象若未实现全部接口的方法,则该对象不属于该接口。方法的接收对象是值package mainimport ( "fmt")t...原创 2018-02-11 17:51:38 · 2123 阅读 · 0 评论 -
protobuf中的omitempty字段
一句话总结:带有omitempty字段的成员,如果该字段为nil(字符串”“,空数组等),则打包的JSON结果不会有这个字段。我们把proto文件自动生成go代码时会出现omitempty字段,如下type Reply struct { Code uint32 `protobuf:"varint,1,opt,name=cod...原创 2018-04-03 20:59:47 · 9598 阅读 · 0 评论 -
interface{}类型通过json.Unmarshal之后的类型
一句话总结:所有JSON数值类型一律解析为float64类型,需手动转换;对于map类型需判断是否为nil再转换为所需类型。interface{}类型在json.Unmarshal时,会自动将JSON转换为对应的数据类型: JSON的boolean 转换为bool JSON的数值 转换为float64 JSON的字符串 转换为string JSON的Array 转换为[]interfa...原创 2018-04-03 21:11:58 · 15302 阅读 · 0 评论 -
揭开golang中defer的坑
揭开golang中defer的坑defer执行顺序,后进先出,是个栈函数在执行最后的RET返回指令前,会先检查是否存在defer语句,如果有从栈中依次取出匿名返回值在return执行时被声明然后给他赋值,所以并不会返回在defer中修改后的值,有名返回值在函数声明时即被声明,在defer中修改即是修改返回值return内部有两个步骤,一是给返回值赋值(有名返回值直接赋值,匿名返回值则先...原创 2018-09-12 21:25:43 · 1519 阅读 · 0 评论 -
golang单元测试和压力测试
1、运行文件夹下所有单元测试 go test 2、运行单个文件 go test -v add_test.go add.go 3、运行单个方法 go test -v -test.run Test_Add1、运行文件夹下所有压力测试 go test -test.bench=”.*” 2、运行单个文件 go test add_bench_test.go add.go -test.b...原创 2018-06-28 20:32:44 · 2109 阅读 · 1 评论 -
go-channel空间不够怎么办
一句话总结:channel空间不够存储到其他地方,等有空间再存储尽量package mainimport "fmt"func main() { memoryMsgChan := make(chan int, 4) s := []int{1,2,3,4,5,6,7} for _, msg := range s { select { ...原创 2018-07-04 10:55:05 · 1683 阅读 · 0 评论 -
Ubuntu升级go版本
sudo apt install golang-gosudo apt-get install golang-1.9sudo apt-get remove golang-1.9sudo apt autoremove 先卸载旧版本curl -O https://storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz $ tar -C...原创 2018-05-04 13:24:23 · 10478 阅读 · 0 评论 -
golang XORM速记
一、初始化 配置 user = userDB pass = 123456 host = 127.0.0.1 port = 3306 database = user_db maxconn = 100 maxidle = 100 showsql = false charset = utf8mb4初始化 ...原创 2018-04-05 17:08:35 · 3082 阅读 · 0 评论 -
go get无法下载git代码
simon@ubuntu:~/git/src/github.com$ go get github.com/grpc/grpcpackage github.com/grpc/grpc: cannot download, $GOPATH must not be set to $GOROOT. For more details see: go help gopathsimon@ubuntu:~/gi...原创 2018-03-29 15:54:24 · 3931 阅读 · 0 评论 -
golang构建htpp服务
1、简单实现serverpackage mainimport ( "flag" "net/http")func main() { host := flag.String("host", "127.0.0.1", "listen host") port := flag.String("port", "8080", &quo原创 2018-03-29 11:24:03 · 351 阅读 · 0 评论 -
golang protobuf 的序列化和反序列化
1、通过proto文件生成go代码hello.protosyntax = "proto3";package prototest;message Test { int32 num = 1; string msf = 2;}hello.pb.go// Code generated by protoc-gen-go. DO NOT EDIT.// source...原创 2018-03-28 21:26:11 · 9936 阅读 · 0 评论 -
go语言接口查询
一句话总结:如果接口A实现了接口B中所有方法,那么A可以转化为B接口。package optionstype IPeople interface { GetName() string}type IPeople2 interface { GetName() string GetAge() int}package mainimport原创 2018-01-29 20:49:36 · 2866 阅读 · 0 评论 -
Go语言fmt包Printf方法详解
下面引用自:https://www.jianshu.com/p/8be8d36e779cGo语言的标准输出流在打印到屏幕时有些参数跟别的语言(比如C#和Java)不同,下面是我整理的一些常用的格式化输入操作。General%v 以默认的方式打印变量的值%T 打印变量的类型Integer%+d 带符号的整型,fmt.Printf("%+d", 255)输出+255转载 2018-01-29 13:01:08 · 2213 阅读 · 0 评论 -
go语言函数传递问题(map、切片、接口、chan)
一句话总结:map、切片、接口、函数类型、chan都是引用类型,作为函数参数传递不会复制一个副本。package mainimport ( "fmt")func change(a int) { a = 10}func changeMap(m map[int]string) { _, ok := m[1] if ok { m[1] = "ja原创 2017-11-26 23:00:04 · 2494 阅读 · 2 评论 -
go语言中select与switch的区别
一句话总结:switch主要用于表达式的比较判断,select主要用于通信即IO。package mainimport ( "fmt")func main() { key := 10 switch key { case 7: fmt.Println("7") case 10: fmt.Println("10") default原创 2017-11-26 22:52:10 · 688 阅读 · 0 评论 -
go:chan分为阻塞和非阻塞
一句话总结:原创 2017-11-25 22:45:47 · 8415 阅读 · 1 评论 -
go:*handler is pointer to interface, not interface
一句话总结:不能声明一个接口的指针,如同不能在C++中不能声明一个指向引用的指针。type handler interface { Do()}var h *handler //errorC++中不能声明一个指向引用的指针int&* p; //error原创 2017-11-24 23:25:38 · 2977 阅读 · 0 评论 -
go语言中数组与切片的区别
一句话总结:切片是动态数组,注意两者初始化和函数参数的区别1、初始化:数组需要指定大小,不指定也会根据初始化的自动推算出大小,不可改变 数组: a := [...]int{1,2,3} a := [3]int{1,2,3}切片: a:= []int{1,2,3} a := make([]int, 5) a := make([]int, 5, 10)//var a [...]int = [.....原创 2017-12-02 10:29:19 · 7331 阅读 · 0 评论 -
go中new和make的区别
一句话总结:make用于分配和初始化map、chan、slice类型,返回引用;new用于分配任意类型,返回指针,尽量少用new,可用T{}或&T{}。原创 2017-12-02 10:12:17 · 351 阅读 · 0 评论 -
go——奇怪的iota
一句话总结:const语句块的行索引,从0开始累加。注意与C++中枚举类的区分。1、iota从0开始,b、c依次等于累加的索引2、a1=13、d、e、f、g会等于上面的值,不累加,与枚举类不同。package mainimport "fmt"func main() { const ( a = iota b c a1 = 1 << iota b1 c原创 2017-11-12 11:46:20 · 449 阅读 · 0 评论 -
go语言并发编程
一句话总结:使用锁sync.Mutex来保证数据的原子性操作、使用channel进行通信、使用select检测通信状态、使用sync.Once保证全局仅执行一次、使用runtime包设置CPU个数及时间片分配。直接上实例package mainimport ( "fmt" "runtime" "sync" "time")var g_value原创 2017-12-24 09:08:31 · 317 阅读 · 0 评论 -
go语言中的value receiver和pointer receiver
一句话总结:方法的接收者receiver是t T时,值可以是T活着*T;如果接收者是t *T时,值只能是*T。原创 2017-11-24 23:18:12 · 751 阅读 · 0 评论 -
go语言最主要的特性
go语言最主要特性主要是:自动垃圾回收更丰富的内置类型函数多返回值错误处理匿名函数和闭包类型和接口并发编程反射语言交互性1、自动垃圾回收能够像java、C#等语言自带GC,不用再为内存管理苦恼2、更丰富的内置类型关键在于内置,像map、slice这些常用的数据类型,内置于builtin,默认包含,无需自己添加。3、函数返回多值多值原创 2018-01-27 19:16:17 · 5485 阅读 · 1 评论 -
go语言细节汇总
1、原始字符串func main() { s := `功能介绍: 1、可以拍照 2、可以打电话` fmt.Println(s)}2、字符串不能用序号取元素指针func main() { s := "abc" fmt.Println(&s[1]) //error 636: cannot take the address of s[1]}原创 2018-01-02 22:03:34 · 363 阅读 · 0 评论 -
go语言原子操作atomic
一句话总结:主要用于数值的操作,由于原子操作可有底层硬件实现,通常比操作系统层的锁机制效率要高。一共分为5类,LoadT、StoreT、AddT、SwapT和CompareAndSwapT。func LoadT(addr *T) (val T) func StoreT(addr *T) (val T)func AddT(addr *T, delta T) (new原创 2018-01-27 13:04:47 · 2255 阅读 · 0 评论 -
go语言——利用-tags进行条件编译
一句话总结:通过条件编译解决同名包中同名函数冲突问题,注意编译标签的声明必须和包声明中间空一行,否则编译标签的声明会被误认为包声明的注释。可以用于原有的包不适用我们的需求,如性能过低,而引用的替代包又发生包名和函数名的双重冲突,可用这个解决。// +build myprintpackage myprint //切记与编译标签中间加个空行,否则被认为是注释import ( "fmt")...原创 2018-01-31 13:25:24 · 2014 阅读 · 0 评论 -
go语言自定义log
log一般打印只有三种,如下面所示,如果要区分日志类型以及加些前缀信息就很不方便,这时就需要自定义日志了。log.Println("log")log.Panic("panic")log.Fatal("fata")直接上实例吧package mainimport ( "log" "os")type myLog struct { In原创 2018-01-07 14:46:57 · 1340 阅读 · 0 评论 -
go语言非侵入式接口
侵入式接口:需要显式地创建一个类去实现一个接口。非侵入式接口:不需要显式地创建一个类去实现一个接口。C++侵入式接口:#include enum SEX { MAIL, FEMAIL };class PeopleInterface{public: PeopleInterface(){}; virtual ~PeopleInterface(){}; virtu原创 2018-01-01 21:36:56 · 1422 阅读 · 0 评论 -
go语言sync.WaitGroup
一句话总结:sync.WaitGroup用于等待一个系列执行完成,不能保证数据的原子性操作。go语言中有两种同步机制,一种是channel,另一种是锁机制。sync.WaitGroup是一种比较简单的同步机制,接口简洁只有三个,Add(),Done(),Wait();其中Add()是添加计数,Done()是减去一个计数,本质是Add(-1),Wait是阻塞等待计数为0;// Done原创 2017-12-15 23:46:46 · 665 阅读 · 0 评论 -
go语言实现回调函数
定义:回调函数就是一个通过函数指针调用的函数。package mainimport "fmt"type Callback func(x, y int) intfunc testCallback(x, y int, callback Callback) int { return callback(x, y)}func add(x, y int) int原创 2017-12-15 23:37:23 · 9506 阅读 · 0 评论 -
go语言:数组指针与指针数组
一句话总结:注意*与谁结合,如p *[5]int,*与数组结合说明是数组的指针;如p [5]*int,*与int结合,说明这个数组都是int类型的指针,是指针数组。package mainimport "fmt"func main() { a := [...]int{1, 2, 3, 4, 5} var p *[5]int = &a fmt.Println(*p原创 2017-12-15 23:33:53 · 9935 阅读 · 0 评论