Hello, Golang!

早就听说 “Golang 是下一代 C “、”Golang 是为云端而生的语言”,前段时间有空学了下语法,确实为其精妙的设计感到叹服:

  1. 首先它确实很多地方借鉴了 C 语言,比如 printf 函数、结构体、指针(单凭这个就可见其性能)等,让人感到很亲切;

  2. 然后就是升级版的数组 – Slice,这个确实很强大;Java 的 subString() 和这个比都弱爆了,它可是支持任意类型数组,而且够简洁;

  3. 最让我意外的就是,终于碰到一种语言支持函数返回多个值了,当初学 C 语言还为这个耿耿于怀(为什么只能返回一个值);

  4. 最精妙的当然要数对结构体的发扬光大了:面向对象的特性比如继承、接口等居然不用任何关键字,仅仅用匿名成员就实现了!

  5. 最后,既然是为云计算而生的语言,肯定少不了对并发的支持:Goroutine 和 Channel ,而且据说它的 Thread 比操作系统的线程粒度更小,因此在这点上有先天优势。

当然也有些不习惯的地方:

  1. 条件判断不加括号;

  2. 一行语句结束不加分号等等;

  3. 函数成员变量声明时,类型在后面。

由于还只学完语法部分,对底层机制并不十分了解,因此就不讨论其编译速度、性能了。

个人学习语言一门技术习惯通过纸质或电子书,而不是视频教程。感觉那东西走马观花的,而且不便于存储和查阅。

而且会把上面的 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
}

代码注释还算详尽,这里就不赘述了。

所有 Demo 地址