Archive for golang

golang博客里有一个例子。下面两段程序的结果是相同的。 <pre lang="golang"> package main import ( "fmt" "reflect" ) type A struct { Name string } func (p A) test(){} func (p A) Test1(){ fmt.Println("df") } type AInterface interface { Test1() test() } func main() { var a A a.Name = "hha" var value reflect.Value = reflect.ValueOf(a) p := value.Interface().(AInterface) p.Test1() } </pre> <pre lang="golang"> package main import ( "fmt"

Continue

没写完,先这样吧,应该要停写一段时间,先放出来。我又开始研究别的了0 0,golang又要放下了,不过我觉得,那个消耗的时间不会长,回头再接着写^_^. 我的第一个web框架,用go写。虽然没啥价值^_^ 靠,忘记写地址了0 0:<a title="go web framework" href="https://github.com/0x55aa/tfwf" target="_blank">github</a>

Continue

从上上个周开始,就开始进行了。为啥起了这么蛋疼的一个名字,0 0当时建目录的时候不知道起啥名字,然后就起了一个the first web framework(tfwf),然后在bitbucket上开了一个私有项目,就开始写了。 先说说目的:一直都在用别人写的东西,包括接触的n多东西,一直想自己也实现一个。终于下决心用go准备写一个web框架,因为对这个还算是熟悉的了。选择go的原因是,写了可能会有别人用,但是我的出发点是学习并玩玩。不懂设计,不懂高深的理论,能有点样子就好了。 其实go自带的包写web应用已经非常方便了,现在主要实现的功能有: url的正则匹配,并且可以定义`^/aa/(?P&lt;second&gt;\d+)/`这样的样式。 网站的基本设置,像域名,名字,templedir等 控制器模仿tornado的样子写的,感觉蹩脚的很0 0. 启动时模板的导入。 就这些了。 &nbsp; 说说从一开始写的过程,现在只记得七七八八了,时间有点长了。 准备写web框架的时候,我先去大略看了一遍谢大的 goweb编程那本书,

Continue

又传到github上了:https://github.com/0x55aa/golang-udp-chat 用golang写的第二个程序,这么久再没学golang,找到《go语言编程》的电子版,现在打算重新再学一遍。翻出这个程序,分享。 没有什么特殊功能,自己边做边添加,主要使用了net包中关于upd的几个函数。还没有实现预期的功能,只是个雏形,传上去好记得还写过这么个小程序,哪天心血来潮再改改。 程序是根据这个程序修改的《<a title="Permanent Link to Network programming with Go" rel="bookmark" href="http://0x55aa.sinaapp.com/%e7%ae%97%e6%b3%95-%e7%bc%96%e7%a8%8b/756.html" target="_blank">Network programming with Go</a>》,下面我想看完电子书开始用go写web程序,路漫漫其修远兮 吾将上下而求索。 截了client的图: <a href="http://0x55

Continue

总结的很好,《golang web 编程》作者维护的golang博客:http://beego.me/ 。。。。。。。。。。。。。。。。 我们在写Go代码的时候经常用到import这个命令用来导入包文件,而我们经常看到的方式参考如下: <pre lang="golang">import( "fmt" )</pre> 然后我们代码里面可以通过如下的方式调用 <pre lang="golang">fmt.Println("hello world")</pre> 上面这个fmt是Go语言的标准库,他其实是去goroot下去加载该模块,当然Go的import还支持如下两种方式来加载自己写的模块: 1.相对路径 import “./model” //当前文件同一目录的model目录,但是不建议这种方式来import 2.绝对路径 import “shorturl/model” //加载gopath/src/shorturl/model模块 上面展示了一些import常用的几种方式,但是还有一些特殊的import,让很多新手很费解,下面

Continue

很不错的教程,讲的很详细。《Network programming with Go》http://jan.newmarch.name/golang/,照着教程写了一个小程序。 &nbsp; <pre lang="golang">//server.go package main import( "fmt" "net" "os" "time" ) func handleClient(conn *net.UDPConn){ var buf [512]byte n, addr, err := conn.ReadFromUDP(buf[0:]) if err != nil{ return } fmt.Println(string(buf[0:])) daytime := time.Now().String() fmt.Println(n,addr) conn.WriteToUDP([]byte(daytime),addr) }

Continue

<pre lang="golang">func Join(a []string, sep string) string</pre> ,连接字符串,以sep作为分隔符 例子: <pre lang="golang">s := []string{"foo", "bar", "baz"} fmt.Println(strings.Join(s, ", "))</pre> 输出: <pre lang="golang">foo, bar, baz</pre> ,源代码分析 1.判断a的长度,0时,返回空字符串,长度为1时,返回a[0]. 2.否则,在变量n中保存将要生产字符串的长度。计算方法len(a)-1个sep的长度 + 数组a中字符串长度和。 3.创建一个长度为n的byte数组。将数据复制到数组中,copy()将返回复制元素的个数,用bp来记录复制的位置。最后转成string返回。 &nbsp; <pre lang="golang">func Split(s, sep string) []string</pre> ,分割字符串,sep为空字串时,与

Continue

打算把golang的常用包都看一遍,分析一下包的代码,觉得从中会学到golang的编程方法^_^。 <pre lang="golang">func Index(s, sep string) int</pre> 返回s中第一次出现sep的位置,如果没有返回-1. 例子: 代码: <pre lang="golang">fmt.Println(strings.Index("chicken", "ken")) fmt.Println(strings.Index("chicken", "dmr"))</pre> 输出: <pre lang="golang">4 -1</pre> 看源码中index的实现方法, 1.取得sep的长度。如果长度为零,返回0。否则取sep第一个字符。 2.如果长度为1,for循环比较s[i]和sep[0],相等,返回i。都不相等,返回-1。 3.如果长度大于1,for循环比较(先比较s[i]和sep[0],不相等就i++,再比较s[i:i+n] == sep。)成立返回i,否则返回-1。比较的上限是i+n。 相关函数

Continue

在看《build web application with golang》地址:https://github.com/astaxie/build-web-application-with-golang 看到Panic和Recover这一节,对Panic和Recover有了了解。 Go没有例如像Java那样的异常机制:不能抛出一个异常。作为代替,它使用了panic和recover机制。一定要记得,这应当作为最后的手段被使用,你的代码中应当没有,或者很少的令人恐慌的东西。这是个强大的工具,明智的使用它。那么,应该如何使用它。 Panic <blockquote>是一个内建函数,可以中断原有的控制流程,进入一个令人恐慌的流程中。当函数F调用panic,函数F的执行被中断,但是F中的延迟函数会正常执 行,然后F返回到调用它的地方。在调用的地方,F的行为就像调用了panic。这一过程继续向上,直到发生panic的goroutine中所有调用的函 数返回,此时程序退出。恐慌可以直接调用panic产生。也可以由运行时错误产生,例如访问越界的数组。</blockquote> Re

Continue

学习golang来自己写的代码,先贴出来。 <pre lang="golang">package main import ( "fmt" "os" "errors" "strings" ) //no tag var ErrFormat = errors.New("No TAG!") type Mp3 struct{ //the file attr Name string Size int64 //the mp3 attr Title string Artist string Album string Year string Comment string Genre uint8 } func (m *Mp3) PrintInfo(){ fmt.Printf("%v:\n",m.Name) fmt.Printf("size:%v\ntitle:%v\nartist:%v\nalbum:%v\nyear:%v\nco

Continue