go中struct結構默認字段都會有零值,故不能用nil來判斷struct是否爲空,可經過額外的字段來判斷struct是否填充或爲空web
type Demo struct{ ready bool name string //其餘字段 }
在初始化的時候必須將ready設置爲true編程
var d Demo if !d.ready{ //do stuff }
ListenAndServer
來創建web服務器,底層是初始化一個server
對象,而後調用net.Listen("tcp",addr)
來監聽端口。srv.server(net.Listener)
函數來處理接收客戶端請求。函數裏面爲一個for{}
,首先經過accept
接受請求,接着建立一個Conn,最後單獨開一個goroutine取執行:go c.server()
。c.readRequest()
獲取相應的handler := c.server.Handler
,它本質是一個路由器,經過它來匹配url跳到對應的handle函數。os.getenv()獲取環境變量獲取不到最新設置的環境變量,最新設置的須要從新啓動電腦獲取數組
這兩天在搞反射,看到Go的基礎數據類型那麼多,int,int32,int64都有,並且運算過程當中還須要轉換,因此抽空看了些博客以及官方文檔。
int跟uint服務器
浮點類型爲float32和float64app
stringtcp
反射在計算機中是程序檢查本身結構的一種能力,尤爲是經過類型,它是元數據編程的一種方式,也是混亂的重要來源每一個語言的反射模型都不一樣(不少語言根本不支持它)函數
由於反射是創建在類型系統上,讓咱們先回顧一下Go中的類型。post
Go是靜態類型語言,每一個變量都有一個靜態類型,即在編譯時就已知被固定上一種類型:int, float32, &MyType, []byte
ui
type MyInt int var i int var j MyInt
變量i和j具備不一樣的靜態類型,雖然他們具備相同的底層類型,但若是沒有轉換,則沒法將他們分配給彼此。url
interface能夠存儲任何具體的值,interface包括:
反射就是創建在類型之上的,Golang的指定類型的變量的類型是靜態的(也就是指定int、string這些變量,它的type是static type),在建立變量的時候就已經肯定,反射主要於Golang的interface有關(它的類型是concrete type),只有interface類型纔有反射之說。
如下是一些API
reflect: TypeOf(interface{}) Type : 返回接口中保存值的類型,i爲nil值返回nil ValueOf(interface{}) Value : 返回一個初始化爲i接口保管的具體值的Value,但i爲nil時返回Value零值 New(Type) Value:返回一個指向類型爲Type的新申請的零值的指針。 Type: Kind():返回該接口的具體類型 Name():返回類型名 Elem():返回該類型的元素類型,若是Kind不是Array,Chan,Map,Slice,Ptr會panic Value: Append(s Value,x ...Value) Value: s需爲切片類型的Value值,x需爲s的元素類型的Value值,將x複製給s而且返回s Type():返回v持有的類型的Type表示 Elem() Value:返回v持有的接口或者指針保管值的Value封裝,若是v的Kind不是interface或者Ptr將會panic Kind():同上一致 CanSet():判斷v持有的值是否能更改,只有當Value持有值爲Ptr而且爲共有類型時,它才能夠被修改。 Set(x Value):將v的持有值修改成x的持有值 SetInt(x Int64) SetString(s string) ....
更多的可參考官方文檔:https://go-zh.org/pkg/reflect/#Value.Convert
反射講得比較好的一篇文章:http://www.javashuo.com/article/p-epkjfqjn-kw.html
儘管Go編譯器產生的是本地可執行代碼,這些代碼仍舊運行在Go的runtime(這部分的代碼能夠在runtime包中找到)當中,這個runtime相似虛擬機,它負責管理包括內存分配、垃圾回收、棧處理、goroutine、channel、slice、map和reflection等等。
Go中的interface並非顯示實現的,這就致使,一個方法接收的類型爲IPerson,可是雖然個人Student對象已經實現了IPerson,可是仍是不要在經過方法去new實現返回IPerson對象
type Student struct{ name string age int } func newIPerson(name string,age int) IPerson{ return Student{ name : name, age : age, } }
make([]int,l,c)
,l
爲長度,c
爲容量,不傳c
則容量等於長度len()
獲取長度,cap()
獲取容量append
以後返回的是一個新的切片擴容:
capacity
小於1000時,兩倍擴容capacity
大於1000時,增加因子爲1.25
,25%
擴容賦值:將一個切片賦值給另外一個切片可指定索引
參考下面代碼:
a := []int{1, 2, 3, 4, 5} b := a[1:] c := a[:4] d := a[1:4] e := a[2:3:4] fmt.Println("a", len(a), cap(a)) fmt.Println("b", len(b), cap(b)) fmt.Println("c", len(c), cap(c)) fmt.Println("d", len(d), cap(d)) fmt.Println("e", len(e), cap(e)) //打印結果 a 5 5 b 4 4 c 4 5 d 3 4 e 1 2
for-range
返回的是每一個元素的副本,而不是引用