转--在学Go语言

开始学点儿Go语言,这语言据说在国内比在国外火,社区上褒贬不一,不过“小马过河”嘛,总要先自己试试再来下结论。

环境准备:

1.在Golang中国下载安装go语言,个人喜欢用msi安装,直接帮你设置环境变量,免得手动弄。 2.安装goclipse:在eclipse官网下载最新版eclipse,安装后进入菜单Help -> Install New Software,输入网址http://goclipse.github.io/releases/。注意在读出的长长的列表中选择goclipse即可,千万别全选(血的教训),然后一路Next。 3.安装好goclipse后,在eclipse配置(Window -> Preferences)中选Go菜单,里面的GOROOT和GOPATH自行指定,前者当然就是go的根目录,后者自行指定一个目录。 4.如果在控制台无法运行git命令,即电脑中未安装git客户端,则需要下载msysgit并安装,这是为第5步做准备。 5.点开菜单Go-Tools,点Download gocode的大按钮,会自动下载安装gocode,并放到上一步你指定的GOPATH里。 6.下载GDB(我图省事直接在csdn下的),将exe文件放到系统path中,即让命令行运行gdb能够生效(我是将它直接放到go文件夹下的bin里了),这样goclipse就能断点调试了。

学习体会: 这里有go语言的中文文档,入门读七牛出的《Go语言编程》个人觉得不错,该书附录有“常用包介绍”,对照着去文档看看挺好。

语法上,一般评价是“乏善可陈”,不花哨,走实用主义路线,看书第1章提到的,自动垃圾回收,丰富的内置类型,函数多返回值,错误处理,匿名函数闭包,类型接口,并发编程,反射,都比较基本,还有些动态语言常见的讨喜的语法糖,除了多返回值之外,出彩的地方不多,但Go是强类型的。

这意味着编译器能帮你做很多事,错误检查,语法提示,这能减轻程序员的不少负担,编译的结果比如exe程序,直接放到服务器裸机上就能跑,不像python啊nodejs它们需要现在目标机器上安语言,减轻了点工作量(同样是发布一个web程序,除了程序之外,java需要安个java环境再安个应用服务器,nodejs需要安个nodejs语言环境,而go啥都不用安),但如果在裸机上跑四个编译后的程序,依赖库就是四份的体积了,而python之类只有一份,大家公用。不过这不太重要。

重要的是Go最拿手的做网络服务器的能力,使用轻量级的协程,能胜任很大的并发量(几百万),而且协程是语言天生支持的,启动一个新协程直接go xxFun就好,xxFun是函数,Go里函数是一等对象。 用基础库做网络编程,语法简单得令人发指,看书的第5章,个人的helloworld如下(更高深的还没研究):

package main import ( "bufio" "fmt" "io/ioutil" "log" "net" "net/http" "os" ) func main() { //httpServer() //httpClient() //tcpClient() //tcpServer() test() } func test() { ch := make(chan int, 1) for{ select { case ch <- 0: case ch <- 1: } i := <-ch fmt.Println("Value", i) } } func cmd() { for { reader := bufio.NewReader(os.Stdin) input, _ := reader.ReadBytes('\n') println(string(input[0 : len(input)-1])) } } //http服务器 func httpServer() { http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello")) }) log.Fatal(http.ListenAndServe(":90", nil)) } //http客户端 func httpClient() { client := &http.Client{} reqest, _ := http.NewRequest("GET", "http://427studio.net", nil) response, _ := client.Do(reqest) if response.StatusCode == 200 { body, _ := ioutil.ReadAll(response.Body) bodystr := string(body) fmt.Println(bodystr) } } //tcp客户端 func tcpClient() { conn, _ := net.Dial("tcp", "182.92.10.238:42769")//写 fmt.Fprintf(conn, "getgames\n") data, _ := bufio.NewReader(conn).ReadString('\n')//读 fmt.Printf("%#v\n", data) } //tcp服务器 func tcpServer() { ln, err := net.Listen("tcp", ":6010") if err != nil { panic(err) } for { conn, err := ln.Accept() if err != nil { log.Fatal("get client connection error: ", err) } go _service(conn) } } //tcp服务器使用的服务函数 func _service(conn net.Conn) { data, err := bufio.NewReader(conn).ReadString('\n') if err != nil { log.Fatal("get client data error: ", err) } fmt.Printf("%#v\n", data) fmt.Fprintf(conn, "hello client\n") conn.Close() } func checkErr(e error){ if e != nil { fmt.Fprintf(os.Stderr, "%s", e.Error()) } }

目前就学了这点儿,明天想个点子做服务器+多客户端的命令行游戏玩玩。

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2016-04-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏林德熙的博客

win10 uwp 萤火虫效果 安装 win2d创建界面后台的方法核心代码

本文在Nukepayload2指导下,使用他的思想用C#写出来。 本文告诉大家,如何使用 win2d 做出萤火虫效果。

1281
来自专栏有趣的django

博客园美化终极版-(自定义导航栏)----什么CSDN、简书、腾讯云专栏、个人博客和微信公众号都弱爆了

7370
来自专栏刘望舒

Android应用优化之流畅度实操

3113
来自专栏向治洪

iOS开发入门笔记

iOS开发入门笔记 本文面向已有其它语言(如Java,C,PHP,Javascript)编程经验的iOS开发初学者,初衷在于让我的同事一小时内了解如何开始开发i...

4576
来自专栏PPV课数据科学社区

【工具】EXCEL十大搞笑操作排行榜

大名鼎鼎EXCEL江湖上谁人不知,谁人不晓呀,纵使你没见过EXCEL,也见过数据在跑吧?可惜的是,经常用EXCEL表哥表妹,甚至操作六七年 的江湖老手,或多或少...

3636
来自专栏iOS技术

YYImage 源码剖析:图片处理技巧

图片是现代化 APP 界面设计里应用广泛的东西,精美的图片可以带来视觉上的享受,提高用户体验。由此给技术上带来了一些挑战,比如动图的处理、图片显示流畅程度的优化...

1613
来自专栏韩东吉的Unity杂货铺

零基础入门 20: UGUI DropDown

(题外话,因为这期分享中段制作之后,微信平台抽疯,Gif图无法使用,导致我不得不尝试用其他的方式来让文章看起来没那么死板,在后面的部分展示中,我插入了视频文件而...

3334
来自专栏CRPER折腾记

React 折腾记 - (3) 结合Mobx实现一个比较靠谱的动态tab水平菜单,同时关联侧边栏

4562
来自专栏青玉伏案

iOS开发针对对Masonry下的FPS优化讨论

今天博客的内容就系统的讨论一下Masonry对FSP的影响,以及如何更好的使用Masonry。如果你对iOS开发足够熟悉的话,那么对Masonry框架应该不陌生...

2606
来自专栏微信公众号:Java团长

你们都在用IntelliJ IDEA吗?或许你们需要看一下这篇博文

以前一直用的elipce,如今入坑IntelliJ IDEA,没想到啊。深深的爱上了它,强大到无所不能;

1713

扫码关注云+社区

领取腾讯云代金券