1. 程式人生 > >go 學習3

go 學習3

go學習


介面(interface)

知識點1:當一個型別定義了介面中的所有方法,該型別才實現了改介面。

知識點2:沒有包含方法的介面稱為空介面,用interface{}表示,因為沒有方法,所有所有型別都實現了空介面

//如果一個函式接收空介面作為引數,
//那麼這個函式可以傳遞任何型別
func a(i interface{}){
}

知識點3:型別斷言
語法:i.(T),介面中 i 的具體型別是T

func a (i interface{}) {
    //如果傳進來的值型別為int,那麼v為該型別的值,ok為true
    //如果傳進來的值型別不是int,那麼v為0,ok為false
v,ok := i.(int) fmt.Print(v) }

知識點3:型別選擇
語法:i.(type)

func a (i interface{}){
    switch i.(type){
        case string:
            fmt.Print(i) //這裡輸出傳入的值
        case int:
            fmt.Print(i) //這裡輸出傳入的值
        default:
            fmt.Print("找不到該型別")
    }
}
//case 後面還可以跟介面名稱,可以判斷傳入的型別是否實現了該介面

知識點4:指標接受者和值接受者
如果介面實現方法的接受者是指標接受者,那麼傳入的值型別必須是帶&的地址型別

知識點5:介面是可以巢狀的,可以呼叫子介面的方法。如果介面內的方法不存在,它的值和具體型別都為nil,並且呼叫它的時候會報錯

序列化(struct)

序列化:就是把當前的資料格式轉化為任何應用都能讀取和輸出的資料格式(比如json序列化 相當於PHP裡面json_encode()方法
go序列化有三種格式:Json 、XML 、 Gob

Json序列化:需要import “encoding/json”
函式:json.Marshal(data)
反序列化函式:json.Unmarshal([]byte(str), &data)

go協程

Go 協程是與其他函式或方法一起併發執行的函式或方法。Go 協程可以看作是輕量級執行緒。與執行緒相比,建立一個 Go 協程的成本很小。
使用:呼叫函式或者方法時,在前面加上關鍵字 go,可以讓一個新的 Go 協程併發地執行。
注意:如果 Go 主協程終止,則程式終止,於是其他 Go 協程也不會繼續執行。

通道

通道可以想像成 Go 協程之間通訊的管道。如同管道中的水會從一端流到另一端,通過使用通道,資料也可以從一端傳送,在另一端接收。
所有通道都關聯了一個型別。通道只能運輸這種型別的資料,而運輸其他型別的資料都是非法的。
注意:傳送和接收通道預設都是阻塞的,就是說單方面傳送或接收都是阻塞的,傳送後必須要接收,接收必須要有協程把資料寫入通道,不然都會阻塞!

chan T表示T 型別的通道。

package main

import (
    "fmt"
)

func hello(done chan int) {
    fmt.Print("Hello chan方法")
    done <- 123 // 把123寫入done通道
}
func main() {
    done := make(chan int) //  宣告通道變數done
    go hello(done) //開啟hello協程,並傳入通道
    data := <- done  //讀取通道done的值 並賦給data
    fmt.Print("data 的值為:",data)
}

chan int定義的都是雙向通道,
go裡還有單向通道:
chan <- int 唯送通道
<- chan int 唯收通道
雙向通道可以轉換成單向通道,單向通道不能轉換成雙向通道