golang

Golang Channel用法简编

☆樱花仙子☆ 提交于 2019-12-04 02:20:56
在进入正式内容前,我这里先顺便转发一则消息,那就是Golang 1.3.2已经正式发布了。国内的 golangtc 已经镜像了golang.org的安装包下载页面,国内go程序员与爱好者们可以到"Golang中 国",即golangtc.com去下载go 1.3.2版本。 Go 这门语言也许你还不甚了解,甚至是完全不知道,这也有情可原,毕竟Go在 TIOBE 编程语言排行榜上位列30开外。但近期使用Golang 实现的一杀手级应用 Docker 你却不该不知道。docker目前火得是一塌糊涂啊。你去国内外各大技术站点用眼轻瞥一下,如 果没有涉及到“docker”字样新闻的站点建 议你以后就不要再去访问了^_^。Docker是啥、怎么用以及基础实践可以参加国内一位仁兄的经验之作:《 Docker – 从入门到实践 》。 据我了解,目前国内试水Go语言开发后台系统的大公司与初创公司日益增多,比如七牛、京东、小米,盛大,金山,东软,搜狗等,在 这里 我们可以看到一些公司的Go语言应用列表,并且目前这个列表似乎依旧在丰富中。国内Go语言的推广与布道也再稳步推进中,不过目前来看多以Go入 门与基础为主题,Go idioms、tips或Best Practice的Share并不多见,想必国内的先行者、布道师们还在韬光养晦,积攒经验,等到时机来临再厚积薄发。另外国内似乎还没有一个针对Go的

golang: Martini之inject源码分析

旧城冷巷雨未停 提交于 2019-12-04 02:20:29
依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。在传统的程序设计过程中, 调用者是自己来决定使用哪些被调用者实现的。 但是在依赖注入模式中, 创建被调用者的工作不再由调用者来完成,因此称为控制反转; 创建被调用者实例的工作通常由注入器来完成,然后注入调用者,因此也称为依赖注入。 inject 是依赖注入的golang实现,作者是 codegangsta 。它能在运行时注入参数,调用方法。是Martini框架的基础核心。 我对依赖注入提取了以下2点性质: 由注入器注入属性。 由注入器创建被调用者实例。 在inject中,被调用者为func,因此注入属性也即对func注入实参(当然inject也可以注入struct,这样的话注入的属性就是struct中的已添加tag为`inject`的导出字段)。我们来看下普通的函数调用: package main import ( "fmt" ) func Say(name, gender string, age int) { fmt.Printf("My name is %s, gender is %s, age is %d!\n", name, gender, age) } func main() { Say("陈一回", "男", 20) } 上面的例子中

golang reflect 修改结构体字段

こ雲淡風輕ζ 提交于 2019-12-04 02:20:19
package main import ( "fmt" "reflect" ) type D struct { ID int } func main() { m := D{5} s := reflect.ValueOf(&m).Elem() s.Field(0).SetInt(77) fmt.Println(m.ID) } 结果 77 具体参照 reflect包 golang 反射 http://cjmxp007.blog.163.com/blog/static/35473837201231115825658/ 来源: oschina 链接: https://my.oschina.net/u/728591/blog/95526

golang实现web中间件的一些思考

此生再无相见时 提交于 2019-12-04 02:20:07
最近陆续看了golang的Martini框架,也试用了,这个山寨自node.js的Express框架和最新的koa框架的golang框架, 同样具有低耦合的特点,不过还是担忧其性能,因为核心采用了reflect反射技术。 golang的http包用Hander、handerfuc这些来解决中间件的问题,比如说验证,日志等,采取的是一层层封装的方式, 好比洋葱。这样写出来的代码的缺点是耦合度高。如果中间件的顺序或者名字变换,则有很多代码需要改动。 为了降低依赖,则需让代码不要直接引用前一层的名称,加入第三方的一个间接层。reflect可行,但是reflect反射是基于对对象毫不了解,采取笨办法逐步找出对象类型(结构体)的各个函数的名称然后调用。 如果采取以下方法似乎可以更好解决这个问题: 每个待添加的组件都遵守一个简单的接口约定,比如将需要导出为外界调用的函数都保持在一个类似函数指针数组的数据结构中,这样,框架对于要启用的组件会知道如何去利用,有利于两者的协同。然后,若启用该组件,则可将这个数组和别的组件的数组放在一起,web应用依次调用。这种比较底层的方式,效率或者可以更高。 为进一步考虑提高效率,若组件运行时间比较长,可采用gorutine + channel 的方式,来达到各个中间件filter 模式并行执行的效果? golang的net

golang 随笔

主宰稳场 提交于 2019-12-04 02:19:57
golang reflect go blog随笔 最近看go blog, 发现go升级到1.7了,最大的改进是编译的二进制文件缩小了近30%. 那么这30%是怎么来的呢,什么特征使其压缩了文件大小: ssa (Static Single Assignment,静态单赋值) 编译方法,压缩5% method pruning 方法修剪,压缩15% compact format 更合适的格式, 压缩5-15% 其中method prying 和compact format都涉及到了reflect包。那接下来我们就说说golang 的reflect吧。 reflection是基于类型系统(type system)的, 而go语言是静态类型的,因而每个变量都有一个静态类型(即确定的并且编译时固定的类型),int, []byte, float32, *MyType等等。 如果我们声明 ``` type MyInt int var i int var j MyInt ``` 那么i是int类型,j是MyInt类型,i和j拥有不同的静态类型,尽管他们的基础类型(underlying type)一致,不经过类型转换也不能直接赋值。 type一个重要的分类是interface types,其实意思就是接口也是go的一种类型。 空的接口类型为:interface{} reflection法则: 1.

golang sms阿里云发送短信(公司实际项目)

浪尽此生 提交于 2019-12-04 01:37:25
话不多说,直接上代码!!! 要先下载两个包 (可以go get -u +你想要的包) github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests github.com/aliyun/alibaba-cloud-sdk-go/services/dysmsapi package main import ( "fmt" "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/dysmsapi" ) func main() { client, err := dysmsapi.NewClientWithAccessKey("cn-beijing", "阿里云的accessKeyId", "accessKeySecret") request := requests.NewCommonRequest() request.Method = "POST" request.Scheme = "https" // https | http request.Domain = "dysmsapi.aliyuncs.com" request.Version = "2017-05-25" request.ApiName

golang 包依赖管理 godep 使用

僤鯓⒐⒋嵵緔 提交于 2019-12-04 00:58:21
介绍: godep是解决包依赖的管理工具,目前最主流的一种,原理是扫描记录版本控制的信息,并在go命令前加壳来做到依赖管理。 1.安装: go get github.com/tools/godep 2.编译和运行 项目用godep管理后,要编译和运行项目的时候再用 go run 和 go build 显然就不行了,因为go命令是直接到GOPATH目录下去找第三方库。 而使用godep下载的依赖库放到Godeps/workspace目录下的; godep go run main.go godep go build godep go install godep go test godep中的go命令,就是将原先的go命令加了一层壳,执行godep go的时候,会将当前项目的workspace目录加入GOPATH变量中。 3.包管理使用 godep 1)、拉取依赖 restore 用于开发 godep restore 建议开发过程使用这个命令来同步依赖库 如果下载的项目中只有Godeps.json文件,而没有包含第三库则可以使用godep restore这个命令将所有的依赖库下来到$GOPATH\src中。 用于开发godep restore执行时,godep会按照Godeps/Godeps.json内列表,依次执行go get -d -v来下载对应依赖包到GOPATH路径下。 2)

(六)golang--变量

99封情书 提交于 2019-12-04 00:42:17
什么是变量? 变量相当于内存空间中一个数据存储空间的表示,可以理解为一个门的房牌号;该区域有自己的名称(变量名)和类型(数据类型) 变量的使用步骤:申明--赋值--使用 package main import "fmt" func main(){ var i int i = 10 fmt.Println('i=', i) } Golang变量的使用有三种方式: 指定变量类型,申明后不赋值,使用默认值(int的默认值是0) var num int num = 10 省略变量类型,根据值自行判断变量类型 var num = 10 省略var,注意:=左侧的变量不应该是已经申明了的 num := 10 golang也可以一次性申明多个变量: var n1,n2,n3 intvar n1, name, n3 = 100, "tom", 888n1, name, n3 := 100, "tom", 888 变量使用注意事项: (1)该区域的变量值可以在同一类型范围内不断变化,即不能改变变量的类型(这与Python是有区别的); (2)变量在同一作用域(在同一个函数或代码块)内不能重名,不能重复申明同一名字的变量; (3)变量=变量名-值-数据类型; (4)Golang的变量如果没有赋初值,则会有默认值; 变量数据类型: (1)基本数据类型   1)数值型:     <1> 整数类型(int

你不知道的Golang盲点汇总【持续更新】

◇◆丶佛笑我妖孽 提交于 2019-12-03 20:34:05
1. 引用传递时append会复制生成新的指针 package main import ( "fmt" ) func w(s []int )[]int{ fmt.Printf("in w %v %#v ",s ,&s[0] )  //append后s指定新复制的内存指针了,不再指向原来的内存 s=append(s, 0) fmt.Printf("after append w %v %#v ",s ,&s[0] ) return s } func main() { s:=[]int{1} fmt.Printf("out of w %v %#v ",s ,&s[0] ) s2:=w(s) //原来的指针s的内容依然在内存中,而不是被覆盖/GC了 fmt.Printf("after w %v %#v %v %#v ",s ,&s[0],s2 ,&s2[0] ) } output: out of w [1] (*int)(0x40e020) in w [1] (*int)(0x40e020) after append w [1 0] (*int)(0x40e040) after w [1] (*int)(0x40e020) [1 0] (*int)(0x40e040) 来源: https://www.cnblogs.com/sunsky303/p/11807281.html

为什么 PHPer 应当学习 Golang

ε祈祈猫儿з 提交于 2019-12-03 18:49:00
熟悉我的朋友应当知道,近些年的大部分时间我的工作都会多少和 PHP 相关。随着 PHP 有着越来越深入的了解,以及遇到越来越多的不同业务时,使用 PHP 总会让我有一种莫名的无力感。当然,并不是我一个人在使用 PHP 的时候遇到了问题。事实上,每个略微有一些经验,接触过一些需求的人都会有同样的困惑。各种配合 LAMP(或者LNMP?)架构的后端技术也因此被发明或被发现,进而整合到 PHP 的开发的技术体系中。从简单的 Memcached 作为数据中转,cron 后端定时处理;到 Gearman 、 RabbitMQ 这些队列神器;最近 @Laruence 甚至封装了利用 libcurl 的异步特性实现并发 RPC 调用的 yar 扩展。几乎整个社区都在寻找 PHP 的摩西之路。 好吧,说了一大堆,回归主题。之前我写了一篇英文练笔《 Why you PHP guys should learn Golang 》,获得不少国际友人的关注。排除拼写和语法被他们诟病外,主要是有许多朋友觉得我没把事情说清楚。所以这里我用母语重新聊聊这个事情,只是这些国际友人什么时候能学会阅读中文呢?;) Go 或者 Golang ,是由 Google 支持的快速、一致、稳定的,有活跃的社区支持的开源编程语言。越来越多的应用选择使用 Golang 进行构建。虽然 Rob Pike 说 “… 我们希望 C++