Golang
ferghs
贵在坚持!
展开
-
Golang的一些缺点
1.右大括号不允许换行,否则编译报错;不允许包含未使用的包(设置vscode工具,保存文件时可自动修改格式)2.不允许有未使用的变量(vscode工具无法解决)3.错误处理原始,虽然引入了defer、panic、recover处理出错后的逻辑,函数可以返回多个值,但基本依靠返回错误是否为空来判断函数是否执行成功,if语句较多,比较繁琐,程序没有java美观。(官方解释:提供了多个返回值,处...原创 2018-07-24 23:03:25 · 2821 阅读 · 6 评论 -
Go TCP keepalive
tcp长连接设置保持连接活跃func (c *TCPConn) SetKeepAlive(keepalive bool) errorSetKeepAlive sets whether the operating system should send keepalive messages on the connection.func (c *TCPConn) SetKeepAli...原创 2018-10-29 23:36:45 · 1676 阅读 · 0 评论 -
golang 报错 undefined: proto.InternalMessageInfo
问题原因:新的版本加入了InternalMessageInfo导致编译不过解决方法:1、使用旧版本的插件,即手动下载并安装protoc-gen-go版本v1.1.0 (https://github.com/golang/protobuf/releases/tag/v1.0.0)来生成旧风格的原型代码。方法:tar zxvf protobuf-1.0.0.tar.gzcd pro...原创 2018-09-21 18:51:42 · 4695 阅读 · 0 评论 -
go 多个GOPATH
go可以设置多个GOPATHLinux下用冒号(:)分割,例如:$ go envGOPATH="/home/ferghs/gowork:/home/ferghs/gowork/src/project1" Windows使用分号分割(;)注意:1 如果使用go get 默认安装到第一个GOPATH路径2 编译(go build)时,有时会报同一种类型或方法不匹配,原因是G...原创 2018-10-31 23:57:09 · 10565 阅读 · 0 评论 -
golang 关键词make、new的使用
Go语言中的内建函数new和make是两个用于内存分配的原语(allocation primitives)。对于初学者,这两者的区别也挺容易让人迷糊的。简单的说,new只分配内存,make用于slice,map,和channel的初始化。1. new这是一个用来分配内存的内建函数,但是与C++不一样的是,它并不初始化内存,只是将其置零。也就是说,new(T)会为T类型的新项目,分配被置零的...转载 2018-10-24 23:51:19 · 1715 阅读 · 0 评论 -
golang select case的问题
1、case条件无论是否满足,所有case语句都会执行2、阻塞channel如无接收者,则不发送例子:package mainimport ( "fmt")//定义几个变量,其中chs和numbers分别代表通道列表和整数列表var ch1 chan int var ch2 chan int var chs = []chan int{ch1, ch2}var...原创 2018-11-13 22:55:45 · 1620 阅读 · 0 评论 -
golang 正则表达式 regexp
用正则表达式判断邮箱、手机号、网站域名等是否合法,先上例子:package mainimport ( "fmt" "regexp")func main() { // Compile the expression once, usually at init time. // Use raw strings to avoid having to quote the backsl...原创 2018-11-04 16:58:47 · 1737 阅读 · 0 评论 -
golang 使用共享内存
golang没有提供共享内存的函数,使用syscall调用,或者调用c语言的共享内存函数。// @file main.go// @brief// @author tenfyzhong// @email tenfyzhong@qq.com// @created 2017-06-26 17:54:34package mainimport ( "flag" "fmt"...转载 2018-12-23 09:38:54 · 2529 阅读 · 1 评论 -
golang 数据库
使用db.Prepare时一定要关闭stmt,否则内存泄漏。db, err := sql.Open("mysql", "user:password@tcp(ip:port)/database")if err != nil { log.Fatal(err)}age := 27stmt, err := db.Prepare("SELECT name FROM users WH...转载 2018-12-23 10:29:27 · 300 阅读 · 0 评论 -
golang报错: WaitGroup is reused before previous Wait has returned
使用WaitGroup时,大概代码:package mainimport ( "fmt" "time" "sync") var wg sync.WaitGroupfunc f1() { time.Sleep(1 * time.Second) wg.Done()}func main() { var i int ...原创 2019-03-20 10:24:15 · 4815 阅读 · 0 评论 -
golang之ioutil.ReadAll()读取标准输出的问题
问题描述之前在使用ioutil.ReadAll()读取cmd.CombinedOutput()的标准输出时遇到程序挂起的问题,代码如下:func main() { cmd := exec.Command("git", "clone","https://github.com/test/test.git") stdout, _ := cmd.StdoutPipe() ...转载 2019-03-20 10:54:36 · 9827 阅读 · 0 评论 -
go http的超时
英文原始出处: The complete guide to Go net/http timeouts, 作者: Filippo Valsorda当用Go写HTTP的服务器和客户端的时候,超时处理总是最易犯错和最微妙的地方之一。错误可能来自很多地方,一个错误可能等待很长时间没有结果,直到网络故障或者进程挂起。HTTP是一个复杂的、多阶段(multi-stage)协议,所以没有一个放之四海而皆...转载 2018-10-31 21:28:23 · 2189 阅读 · 1 评论 -
go test 单元函数测试
首先安装单元测试包,go get github.com/smartystreets/goconvey/convey源程序如下,定义了加减乘除4个函数package test222import ( "errors")func Add(a, b int) int { return a + b }func Subtract(a, b int) int { ...原创 2018-10-23 09:25:13 · 1235 阅读 · 0 评论 -
Golang创建协程与Python创建进程资源消耗
Golang创建协程消耗很少资源,创建协程可以说有点随心所欲,定时多久时间后执行任务可以创建协程,完成某个比较耗时的异步函数可以创建协程等等。 首先用Python起任务进程,在虚拟机上进程上限200左右,运行所需时间1532059031.43438631532059032.7786460import osimport timeimport multiprocessingfro...原创 2018-07-20 12:14:44 · 746 阅读 · 0 评论 -
go变长参数
go语言中变长参数,形参和实参该采用如下方式传递:package mainimport "fmt"func show(args ...interface{}) { for _, v := range args { fmt.Println(v) }}func main() { slice:=[]interface{}{1,2,3,4} ...原创 2018-08-03 16:16:31 · 593 阅读 · 0 评论 -
go []interface{}的类型转换
package mainimport ( "fmt" "strings")func getName(params ...interface{}) string { var stringSlice []string for _, param := range params { stringSlice = append(stringSlice...原创 2018-08-03 16:18:24 · 18130 阅读 · 2 评论 -
go 参数传递
直接看例子:package mainimport "fmt"func main() { b := false fmt.Println("b's address is:", &b) bo(b) fmt.Println(b) } func bo(b bool) { fmt.Println("b's address is:", &...原创 2018-08-03 16:55:34 · 380 阅读 · 0 评论 -
golang sync.Once的用法
sync.Once.Do(f func())是一个挺有趣的东西,能保证once只执行一次,无论你是否更换once.Do(xx)这里的方法,这个sync.Once块只会执行一次。package main import ( "fmt" "sync" "time") var once sync.Once func main() { for i, v := range m...转载 2018-08-01 00:13:59 · 1181 阅读 · 0 评论 -
Go包导入与Java的差别
闲暇时翻阅了近期下载到的电子书《Go in Practice》 ,看到1.2.4 Package Management一节中的代码Demo,感觉作者对Go package导入的说法似乎不够精确:“Packages are imported by their name”(后续的说明将解释不精确的原因)。联想到前几天遇到的一个Java包导入的问题,让我隐约地感觉Java程序员很容易将两种语言的Pack...转载 2018-08-24 18:31:06 · 719 阅读 · 0 评论 -
go语言函数作为参数传递
package mainimport "fmt"import "time"func goFunc1(f func()) { go f() }func goFunc2(f func(interface{}), i interface{}) { go f(i)}func goFunc(f interface{}, args... interfac...转载 2018-08-29 10:17:43 · 1055 阅读 · 0 评论 -
Go语言中Interface详解
前言最近在看Go语言的面向对象的知识点时,发现它的面向对象能力全靠 interface 撑着,而且它的 interface 还与我们以前知道的 interface 完全不同。故而整个过程不断的思考为什么要如此设计?这样设计给我们带来了什么影响?interface 我不懂你Rob Pike 曾说:如果只能选择一个Go语言的特 性移植到其他语言中,他会选择接口被Go语言设计者如此看...转载 2018-08-29 11:53:21 · 197 阅读 · 0 评论 -
for循环+goroutine的坑
01. 调查初学者经常会使用如下代码来并行处理数据:for val := range values { go val.MyMethod()}或者使用闭包(closure):for val := range values { go func() { fmt.Println(val) }()}这里的问题在于 val 实际上是一个遍历了...转载 2018-09-07 23:12:20 · 4264 阅读 · 0 评论 -
golang的定时器NewTimer、NewTicker使用
废话不多说,直接看代码package mainimport ( "fmt" "sync" "time")/***ticker只要定义完成,从此刻开始计时,不需要任何其他的操作,每隔固定时间都会触发。*timer定时器,是到固定时间后会执行一次*如果timer定时器要每隔间隔的时间执行,实现ticker的效果,使用 func (t *Timer) Res...转载 2018-09-07 22:46:20 · 36130 阅读 · 0 评论 -
golang读取文件
按行读取demo如下:package mainimport ( "bufio" "fmt" "io" "os" "strings")func main() { fi, err := os.Open("./tax.txt") if err != nil { fmt.Printf("Error: %s\n", e...原创 2019-04-02 23:09:19 · 235 阅读 · 0 评论