go語言基礎
雖然這本書是講goweb,但還是吧go語言基礎過了一遍,由于我之前已經對go語言基礎做了一遍系統的學習,這里就當簡單回顧一下,不再寫過多筆記了,之前的寫的博客都有基礎知識,O(∩_∩)O哈哈~
Go是天生支持UTF-8的,任何字符都可以直接輸出,你甚至可以用UTF-8中的任何字符作為識別符號,
Go使用package(和Python的模塊類似)來組織代碼,main.main()函式(這個函式位于主包)是每一個獨立的可運行程式的入口點,Go使用UTF-8字串和識別符號(因為UTF-8的發明者也就是Go的發明者之一),所以它天生支持多語言
Comma-ok斷言
Go語言里面有一個語法,可以直接判斷是否是該型別的變數: value, ok = element.(T),這里value就是變數的值,ok是一個bool型別,element是interface變數,T是斷言的型別,
如果element里面確實存盤了T型別的數值,那么ok回傳true,否則回傳false,
package main
import (
"fmt"
"strconv"
)
type Element interface{}
type List [] Element
type Person struct {
name string
age int
}
//定義了String方法,實作了fmt.Stringer
func (p Person) String() string {
return "(name: " + p.name + " - age: "+strconv.Itoa(p.age)+ " years)"
}
func main() {
list := make(List, 3)
list[0] = 1 // an int
list[1] = "Hello" // a string
list[2] = Person{"Dennis", 70}
for index, element := range list {
if value, ok := element.(int); ok {
fmt.Printf("list[%d] is an int and its value is %d\n", index, value)
} else if value, ok := element.(string); ok {
fmt.Printf("list[%d] is a string and its value is %s\n", index, value)
} else if value, ok := element.(Person); ok {
fmt.Printf("list[%d] is a Person and its value is %s\n", index, value)
} else {
fmt.Printf("list[%d] is of a different type\n", index)
}
}
}
反射
Go語言實作了反射,所謂反射就是能檢查程式在運行時的狀態,我們一般用到的包是reflect包,如何運用reflect包,官方的這篇文章詳細的講解了reflect包的實作原理,laws of reflection
使用reflect一般分成三步,下面簡要的講解一下:要去反射是一個型別的值(這些值都實作了空interface),首先需要把它轉化成reflect物件(reflect.Type或者reflect.Value,根據不同的情況呼叫不同的函式),這兩種獲取方式如下:
t := reflect.TypeOf(i) //得到型別的元資料,通過t我們能獲取型別定義里面的所有元素
v := reflect.ValueOf(i) //得到實際的值,通過v我們獲取存盤在里面的值,還可以去改變值
轉化為reflect物件之后我們就可以進行一些操作了,也就是將reflect物件轉化成相應的值,例如
tag := t.Elem().Field(0).Tag //獲取定義在struct里面的標簽
name := v.Elem().Field(0).String() //獲取存盤在第一個欄位里面的值
獲取反射值能回傳相應的型別和數值
var x float64 = 3.4
v := reflect.ValueOf(x)
fmt.Println("type:", v.Type())
fmt.Println("kind is float64:", v.Kind() == reflect.Float64)
fmt.Println("value:", v.Float())
最后,反射的話,那么反射的欄位必須是可修改的,我們前面學習過傳值和傳參考,這個里面也是一樣的道理,反射的欄位必須是可讀寫的意思是,如果下面這樣寫,那么會發生錯誤
var x float64 = 3.4
v := reflect.ValueOf(x)
v.SetFloat(7.1)
如果要修改相應的值,必須這樣寫
var x float64 = 3.4
p := reflect.ValueOf(&x)
v := p.Elem()
v.SetFloat(7.1)
上面只是對反射的簡單介紹,更深入的理解還需要自己在編程中不斷的實踐,
var和const參考2.2Go語言基礎里面的變數和常量申明
package和import已經有過短暫的接觸
func 用于定義函式和方法
return 用于從函式回傳
defer 用于類似解構式
go 用于并發
select 用于選擇不同型別的通訊
interface 用于定義介面,參考2.6小節
struct 用于定義抽象資料型別,參考2.5小節
break、case、continue、for、fallthrough、else、if、switch、goto、default這些參考2.3流程介紹里面
chan用于channel通訊
type用于宣告自定義型別
map用于宣告map型別資料
range用于讀取slice、map、channel資料
上面這二十五個關鍵字記住了,那么Go你也已經差不多學會了,
總體來說這章寫的挺不錯的,注釋最后涉及到執行緒和協程時有點懵逼,對這方面接觸還是少的原因,
地址
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/49399.html
標籤:Go
上一篇:goweb-安裝go及配置go
