Hello, Golang!
早就听说 “Golang 是下一代 C “、”Golang 是为云端而生的语言”,前段时间有空学了下语法,确实为其精妙的设计感到叹服:
首先它确实很多地方借鉴了 C 语言,比如
printf
函数、结构体、指针(单凭这个就可见其性能)等,让人感到很亲切;然后就是升级版的数组 – Slice,这个确实很强大;Java 的
subString()
和这个比都弱爆了,它可是支持任意类型数组,而且够简洁;最让我意外的就是,终于碰到一种语言支持函数返回多个值了,当初学 C 语言还为这个耿耿于怀(为什么只能返回一个值);
最精妙的当然要数对结构体的发扬光大了:面向对象的特性比如继承、接口等居然不用任何关键字,仅仅用匿名成员就实现了!
最后,既然是为云计算而生的语言,肯定少不了对并发的支持:Goroutine 和 Channel ,而且据说它的 Thread 比操作系统的线程粒度更小,因此在这点上有先天优势。
当然也有些不习惯的地方:
条件判断不加括号;
一行语句结束不加分号等等;
函数成员变量声明时,类型在后面。
由于还只学完语法部分,对底层机制并不十分了解,因此就不讨论其编译速度、性能了。
个人学习语言一门技术习惯通过纸质或电子书,而不是视频教程。感觉那东西走马观花的,而且不便于存储和查阅。
而且会把上面的 Demo 全部自己跑一遍,并作一些拓展。这里仅列出一个 Web 应用 Demo 。
记得当初学 Java Web 开发的时候,不用任何框架,用最基本的 Servlet + JSP + Tomcat 才能完成一个 Demo 。
而 Golang 实现一个 Web Demo 简单多了,一个文件几行代码就能搞定:
package main
import (
"fmt"
"log"
"net/http"
)
func sayHello(responseWriter http.ResponseWriter, request *http.Request) {
request.ParseForm() //解析表单参数
fmt.Println(request.Form) //打印请求的相关信息
fmt.Println("path:", request.URL.Path)
fmt.Println("UserAgent:", request.UserAgent())
for k, v := range request.Form {
fmt.Printf("key: %s, value: %s.\n", k, v)
}
fmt.Fprintf(responseWriter, "Hello, Golang.") //写入writer
}
type MyHttpHandler struct{} //定义一个实现了Http.Handler接口的类型
func (handler *MyHttpHandler) ServeHTTP(responseWriter http.ResponseWriter, request *http.Request) {
if request.URL.Path == "/" {
sayHello(responseWriter, request)
} else {
http.NotFound(responseWriter, request)
}
}
func main() {
http.HandleFunc("/", sayHello) //设置访问的路由:第一个参数为路径,第二个参数是对应的处理函数
error := http.ListenAndServe(":18188", nil) //设置端口监听,返回错误信息
if error != nil {
log.Fatal("ListenAndServe: ", error)
}
myHttpHandler := &MyHttpHandler{}
http.ListenAndServe(":19199", myHttpHandler) //调用自定义HttpHandler
}
代码注释还算详尽,这里就不赘述了。