《go语言程序设计》由会员分享,可在线阅读,更多相关《go语言程序设计(53页珍藏版)》请在金锄头文库上搜索。
1、Go!What?Godaddy(“去你爹”,X) Go a head (“去个头”,X)Golang (Go语言,YES)Go a head.Golang is一个在语言层面实现了并发机制的类C 通用型编程语言为什么我们需要一门新语言云计算时代,多核化集群化分布式是趋势硬件发展很快,软件发展太慢传统编程语言并发支持比较繁琐或不支持多核就生产效率而言,提倡少即是多Go的前世今生1995 Bell Labs, Plan9 ?public MyThread(String a) arg = a;?public void run() / / .?public static void main(Strin
2、g args) new Thread(new MyThread(“test“).start();/ / .Go的并发func run(arg string) / / .? func main() go run(“test“).并发的单位 - goroutine/ /启动一个异步过程? func foo(arg1 T1, arg2 T2) / / .go foo(arg1, arg2)goroutines 示例程序func ready(w string, sec int64) secs := time.Duration(sec)*time.Secondtime.Sleep(secs)fmt.Pr
3、intln(w, “is ready!“)? func main()go ready(“Tee“, 2)go ready(“Coffee“, 1)fmt.Println(“Im waiting“)secs := time.Duration(sec)*time.Second time.Sleep(5 * secs) ? / / Output:Im waiting / / 立刻 Coffee is ready / / 1秒后 Tee is ready / / 2秒后Channelc := make(chan int)? cchar* GetString() . */import “C”import
4、 “unsafe”? func GetString() string cstr := C.GetString()str := C.GoString(cstr)C.free(unsafe.Pointer(cstr)return str更多特性模块化 (package)运行时反射Unicode (UTF-8)跨平台 (x86 / x86_64 / ARM ).基本类型bool (true, false)数字内型(有符号/无符号,有长度/无长度)string(内建”UTF-8”支持)array(n)slice(arrayi:j)map( map)chanerror数字类型无长度int, uint有长
5、度int8, int16, int32, int64byte/uint8, uint16, uint32, uint64float32, float64类型转换(强类型)var a intvar b int32a = 99?b = a + 1 / / Error b = b + 1 / / OKb = int32(a) + 1 / / OK切片 (slice)/ / slice append? var arr intarr = append(arr, 1)arr = append(arr, 2, 3, 4)arr2 := int5, 6, 7, 8arr = append(arr, arr2.
6、)? / / slice copy? var a = .int0, 1, 2, 3var s = make(int, 2)? n1 := copy(s, a0:) / / n1 = 2, s = int0,1n2 := copy(s, a2:) / / n2 = 2, s = int2,3字典(map)插入dictk = v? 删除delete(dict, k)? 查询v, ok := dictk字符串(string)var s string = “hello”s0 = a / / Error? / / OKs1 := byte(s)s10 = as2 := string(s1)? 字符串一旦
7、定义,不可修改。字符串是字 符的序列,不是字节的序列。控制语句ifswitchfor支持 break, continue 关键字ifif x 0 retun y else / / 通常不推荐 else 语句retun x?if err := os.Open(file); err != nil return errdoSomething(f)switchswitch case , , :/ / .case :/ / .default:/ / .fallthroughswitch i case 0:case 1:do() / / 如果i = 0该函数不被调用? switch i case 0: f
8、allthroughcase 1:do() / / 如果i = 0该函数会被调用forfor init; condition; post / / 计数循环? for condition / / while 循环? for / / for ; 死循环forrangelist := string“a“, “b“, “c“for k, v := range list / / .函数func Name(arg1 T1, arg2 T2, .) RetT / / .func Name(arg1 T1, arg2 T2, .) (out1 RetT1, out2 RetT2, .) / / .func N
9、ame(arg1 T1, arg2 T2, .) (out1 RetT1, ., err error) / / .? 优势- 输入输出清晰形象- 错误处理规范gotofunc myfunc() i := 0Here:fmt.Println(i)i+goto Here闭包(closure)bar := func(arg1 T1, arg2 T2, .) (out1 RetT1, out2 RetT2, .) / / .out1, out2, . := bar(arg1, arg2, )? func intSeq() func() int i := 0return func() int i +=
10、1return i“异常”捕获func check(err error) if err != nil panic(err)? func safeHandler(fn http.HandlerFunc) http.HandlerFunc return func(w http.ResponseWriter, r *http.Request) defer func() if e, ok := recover().(error); ok http.Error(w, e.Error(), http.StatusInternalServerError)log.Panic(“panic fired in %
11、v.panic - %v“, fn, e)log.Panic(string(debug.Stack()()fn(w, r)? mux.HandleFunc(“/“, safeHandler(func(w http.ResponseWriter, r *http.Request) app.pageHandler(w, r) )Hello Worldpackage mainimport “fmt”? func main() fmt.Println(“Hello, 世界”)export GOROOT=$HOME/goexport PATH=$PATH:$GOROOT/bin? $ go build hello.go$ ./helloHello, 世界Go Web 编程http.Handle(“/foo“, fooHandler)? http.HandleFunc(“/bar“, func(w http.ResponseWriter, r *http.Request) fmt.Fprintf(w, “Hello, %q“, html.EscapeString(r.URL.Path)? log.Fatal(http.ListenAndServe(“:8080“, nil)大道至简!Q & ATwitter: