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
唯收通道
雙向通道可以轉換成單向通道,單向通道不能轉換成雙向通道