1. 程式人生 > >六、go語言一些常用方法--go語言筆記

六、go語言一些常用方法--go語言筆記

遍歷以及map

for i,value range slice{

}

//方式一
ages:=make(map[string]int)

//方式二
ages:=map[string]int{
    “alice”:31,
       “charlies”:34,
}
//delete 一個元素
delete(ages,"alice")
ages["bob"] = ages["bob"] + 1 //如果沒有bob會返回0
ages["bob"] += 1
ages["bob"]++

_ = &ages["bob"] //無法進行取地址操作,並非是變數
for name, age := range
ages { fmt.Printf("%s\t%d\n", name, age) } //遍歷操作

排序操作

var names []string
    for name := range ages {
        names = append(names, name)
    }
    sort.Strings(names)
    for _, name := range names {
        fmt.Printf("%s\t%d\n", name, ages[name])
    }

檢視是否存在在map中

age,ok:=ages["bob"
] if !ok{ bob is not a key in this map} //一般這樣用: if age, ok := ages["bob"]; !ok { /* ... */ }

匿名成員

type Point struct{
    X,Y int
}
type Circle struct{
    Point 
    Radius int
}

type Wheel struct{
    Circle
    Spokes int
}

var w Wheel
w.X=8  // =w.Circle.Point.X
w.Radius=5

w=Wheel{8,8,5,20} //無效
w
=Wheel{x:8,Y:8 ...} //無效 w=Wheel{Circle{Point{8,8},5},20} //可以

因為匿名成員也有一個隱式的名字,因此不能同時包含兩個型別相同的匿 名成員,這會導致名字衝突。同時,因為成員的名字是由其型別隱式地決定的, 所有匿名成員也有可見性的規則約束。

JSON 支援

encoding/json、encoding/xml、encoding/asn1等包

type Movie struct{
    Title string
    Year int `json:"released"`
    Color bool `json:"color,omitempty"`
    Actors []string
}

var movies=[]Movie{
    {Title:"CASEL",Year:1942,Color:false,
    Actors:[]string{"humphrey Bogart","Ingrid Bergman"}},
    {Title:"CASEL",Year:1942,Color:false,
    Actors:[]string{"humphrey Bogart","Ingrid Bergman"}},
}

這樣的資料結構特別適合 JSON 格式,並且在兩種之間相互轉換也很容易。 將一個 Go 語言中類似 movies 的結構體 slice 轉為 JSON 的過程叫編組 (marshaling)。編組通過呼叫 json.Marshal 函式完成:

data,err:=json.Marshal(movies)
if err!=nil{
    log.Fatalf("JSON marshaling failed:%s",err)
}
fmt.Printf("%s\n",data)

Marshal函式返還一個編碼後的位元組slice,包含很長的字串,並且沒 有空白縮排;我們將它折行以便於顯示:

[{"Title":"Casablanca","released":1942,"Actors":["Humphrey
Bogart","Ingr
id Bergman"]},{"Title":"Cool Hand
Luke","released":1967,"color":true,"Ac tors":["Paul
Newman"]},{"Title":"Bullitt","released":1968,"color":true," Actors":["Steve McQueen","Jacqueline Bisset"]}]

這種緊湊的表示形式雖然包含了全部的資訊,但是很難閱讀。為了生成便 於閱讀的格式,另一個 json.MarshalIndent 函式將產生整齊縮排的輸出。 該函式有兩個額外的字串引數用於表示每一行輸出的字首和每一個層級的 縮排:

data, err := json.MarshalIndent(movies, "", " ") if err != nil {
log.Fatalf("JSON marshaling failed: %s", err)
}
fmt.Printf("%s\n", data)

輸出為:

[
{
"Title": "Casablanca",
"released": 1942, "Actors": [
"Humphrey Bogart",
"Ingrid Bergman"
]
},
{
"Title": "Cool Hand Luke",
...

在編碼時,預設使用 Go 語言結構體的成員名字作為 JSON 的物件(通過 reflect 反射技術,我們將在 12.6 節討論)。只有匯出的結構體成員才會被 編碼,這也就是我們為什麼選擇用大寫字母開頭的成員名稱。
細心的讀者可能已經注意到,其中 Year 名字的成員在編碼後變成了 released,還有 Color 成員編碼後變成了小寫字母開頭的 color。這是因為 構體成員 Tag 所導致的。一個構體成員 Tag 是和在編譯階段關聯到該成員的 元資訊字串:

Year int `json:"released"`
Color bool `json:"color,omitempty"`

結構體的成員 Tag 可以是任意的字串面值,但是通常是一系列用空格分 隔的 key:”value”鍵值對序列;因為值中含義雙引號字元,因此成員 Tag 一 般用原生字串面值的形式書寫。json 開頭鍵名對應的值用於控制 encoding/json 包的編碼和解碼的行為,並且 encoding/…下面其它的包也 遵循這個約成員 Tag 中 json 對應值的第一部分用於指定 JSON 物件的名 字,比如將 Go 語言中的 TotalCount 成員對應到 JSON 中的 total_count 物件。Color 成員的 Tag 還帶了一個額外==的 omitempty== 選項,表示當 Go 語言結
構體成員為空或零值時不生成 JSON 物件(這裡 false 為零值)。果然, Casablanca 是一個黑白電影,並沒有輸出 Color 成員。

編碼的逆操作是解碼,對應將 JSON 資料解碼為 Go 語言的資料結構,Go 語言中一般叫unmarshaling,通過json.Unmarshal函式完成。下面的程式碼 將 JSON 格式的電影資料解碼為一個結構體 slice,結構體中只有 Title 成員。 通過定義合適的 Go 語言資料結構,我們可以選擇性地解碼 JSON 中感興趣的 成員。當 Unmarshal 函式呼叫返回,slice 將被只含有 Title 資訊值填充, 其它 JSON 成員將被忽略。

var titles []struct{ Title string}
if err:=json.Unmarshal(data,&titles);err!=nil{
    log.Fatalf("JSON unmarshaling failed:%s", err)
}

每一次函式呼叫都必須按照宣告順序為所有引數提供實參(引數值)。在 函式呼叫時,Go 語言沒有預設引數值,也沒有任何方法可以通過引數名指定 形參,因此形參和返回值的變數名對於函式呼叫者而言沒有意義。
在函式體中,函式的形參作為區域性變數,被初始化為呼叫者提供的值。函 數的形參和有名返回值作為函式最外層的區域性變數,被儲存在相同的詞法塊 中。
實參通過值的方式傳遞,因此函式的形參是實參的拷貝。對形參進行修改 不會影響實參。但是,如果實參包括引用型別,如指標,slice(切片)、map、 function、channel 等型別,實參可能會由於函式的簡介引用被修改。
你可能會偶爾遇到沒有函式體的函式宣告,這表示該函式不是以 Go 實現 的。這樣的宣告定義了函式識別符號。