// iffuncmain(){
x :=100if x >0{println("x")}elseif x <0{println("-x")}else{println("0")}}//switchfuncmain(){
x :=100switch{case x >0:println("x")case x <0:println("-x")default:println("0")}}
#forfuncmain(){for i :=0; i<5; i++{println(i)}for i:=4;i>=0; i--{println(i)}}funcmain(){
x :=[]int{100,101,102}//for...range 除元素外,還可返回索引for k, v :=range x {println(x,":", v)}}
3 函數
package main
import("errors""fmt")//函數可以定義多個返回值,甚至對其命名funcdiv(a, b int)(int,error){if b ==0{return0, errors.New("division by zero")}return a/b,nil}funcmain(){
a, b :=10,2//定義多個變量
c, err :=div(a, b)//接收多返回值
fmt.Println(c, err)}
函數是第一類型,可以作爲參數或返回值
functest(x int)func(){//返回函數類型returnfunc(){//匿名函數println(x)//閉包}}funcmain(){
x :=100
f :=test(x)f()}
用defer定義延遲調用,無論函數是否出錯,它都確保結束前被調用
package main
functest(a, b int){deferprintln("dispose...")//常用來釋放資源,解除鎖定,或執行一些清理操作//可定義多個defer, 按FILO順序執行println(a /b)}funcmain(){test(10,0)}
4. 數據
切片(slice)可實現類似動態數組的功能
package main
import"fmt"funcmain(){
x :=make([]int,0,5)//創建容量爲5的切片for i:=0;i<8;i++{
x =append(x, i)//追加數據,當超出容量限制時,自動分配更大的存儲空間}
fmt.Println(x)}//輸出//[0 1 2 3 4 5 6 7]
將字典(map)類型內置,可直接從運行時層面獲取性能優化.
package main
import"fmt"funcmain(){
m :=make(map[string]int)//創建字典類型對象
m["a"]=1//添加或設置
x, ok := m["b"]//使用ok-idiom獲取值,可知道key/value是否存在
fmt.Println(x, ok)delete(m,"a")//刪除}/**
所謂ok-idiom模式,是指在多返回值中用一個名爲ok的布爾值來標示操作是否成功。因爲很多操作默認返回零值,所以必須額外說明
**/
結構體(struct)可欺匿名嵌入其他類型
package main
import"fmt"type user struct{
name string
age byte}type manager struct{
user //匿名嵌入其他類型
title string}funcmain(){var m manager
m.name ="Tom"//直接訪問匿名字段的成員
m.age =29
m.title ="CTO"
fmt.Println(m)}/**
輸出:
{{Tom 29} CTO}
**/
5. 方法
可以爲當前包內的任意類型定義方法
package main
type X intfunc(x *X)inc(){//名稱前的參數稱作receiver,作用類似python self*x++}funcmain(){var x X
x.inc()println(x)}
還可直接調用匿名字段的方法,這種方式可實現與繼承類似的功能
package main
import"fmt"type user struct{
name string
age byte}func(u user)ToString()string{return fmt.Sprintf("%+v", u)}type manager struct{
user
title string}funcmain(){var m manager
m.name ="Tom"
m.age =29println(m.ToString())//調用user.ToString()}
6. 接口
接口採用了duck type方式,也就是說無須在實現類型上添加顯式聲明。
package main
import"fmt"type user struct{
name string
age byte}func(u user)Print(){
fmt.Printf("%+v", u)}type Printer interface{//接口類型Print()}funcmain(){var u user
u.name ="Tom"
u.age =29var p Printer = u //只要包含接口所需的全部方法,即表示實現了該接口
p.Print()}//另有空接口類型interface{}, 用途類似OOP裏的system.Object, 可接收任意類型對象
package main
//消費者funcconsumer(data chanint, done chanbool){for x:=range data {//接收數據,直到通道被關閉println("recv:", x)}
done <-true//通知main,消費結束}//生產者funcproducer(data chanint){for i:=0;i<4;i++{
data <- i //發送數據}close(data)//生產結束,關閉通道}funcmain(){
done :=make(chanbool)//用於接收消費結束信號
data :=make(chanint)//數據管道goconsumer(data, done)//啓動消費者goproducer(data)//啓動生產者<-done //阻塞,直到消費者發回結束信號}