十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
1、反射可以在運行時 動態(tài)獲取變量的各種信息 ,比如變量的類型、類別;

創(chuàng)新互聯(lián)建站專注于企業(yè)全網(wǎng)營銷推廣、網(wǎng)站重做改版、陜西網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、HTML5、商城網(wǎng)站制作、集團公司官網(wǎng)建設、外貿網(wǎng)站建設、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為陜西等各大城市提供網(wǎng)站開發(fā)制作服務。
2、如果是結構體變量,還可以獲取到結構體本身的信息(包括結構體的字段、方法);
3、通過反射,可以修改 變量的值 ,可以調用關聯(lián)的方法;
4、使用反射,需要import " reflect ".
5、示意圖:
1、不知道接口調用哪個函數(shù),根據(jù)傳入?yún)?shù)在運行時確定調用的具體接口,這種需要對函數(shù)或方法反射。
例如以下這種橋接模式:
示例第一個參數(shù)funcPtr以接口的形式傳入函數(shù)指針,函數(shù)參數(shù)args以可變參數(shù)的形式傳入,bridge函數(shù)中可以用反射來動態(tài)執(zhí)行funcPtr函數(shù)。
1、reflect.TypeOf(變量名),獲取變量的類型,返回reflect.Type類型。
2、reflect.ValueOf(變量名),獲取變量的值,返回reflect.Value類型reflect.Value是一個結構體類型。
3、變量、interface{}和reflect.Value是可以互相轉換的,這點在實際開發(fā)中,會經(jīng)常使用到。
1、reflect.Value.Kind,獲取變量的 類別(Kind) ,返回的是一個 常量 。在go語言文檔中:
示例如下所示:
輸出如下:
Kind的范疇要比Type大。比如有Student和Consumer兩個結構體,他們的 Type 分別是 Student 和 Consumer ,但是它們的 Kind 都是 struct 。
2、Type是類型,Kind是類別,Type和Kind可能是相同的,也可能是不同的。
3、通過反射可以在讓 變量 在 interface{} 和 Reflect.Value 之間相互轉換,這點在前面畫過示意圖。
4、使用反射的方式來獲取變量的值(并返回對應的類型),要求數(shù)據(jù)類型匹配,比如x是int,那么久應該使用reflect.Value(x).Int(),而不能使用其它的,否則報panic。
如果是x是float類型的話,也是要用reflect.Value(x).Float()。但是如果是struct類型的話,由于type并不確定,所以沒有相應的方法,只能 斷言。
5、通過反射的來修改變量,注意當使用SetXxx方法來設置需要通過對應的指針類型來完成,這樣才能改變傳入的變量的值,同時需要使用到reflect.Value.Elem()方法。
輸出num=20,即成功使用反射來修改傳進來變量的值。
6、reflect.Value.Elem()應該如何理解?
可以通過reflect反射去做,具體可以參見sqlmapper
非常簡單,只有一個文件就搞定了
基礎的增刪改查都包含了,連硬編碼的sql string都不用寫,非常方便
Go語言作為出現(xiàn)比較晚的一門編程語言,在其原生支持高并發(fā)、云原生等領域的優(yōu)秀表現(xiàn),像目前比較流行的容器編排技術Kubernetes、容器技術Docker都是用Go語言寫的,像Java等其他面向對象的語言,雖然也能做云原生相關的開發(fā),但是支持的程度遠沒有Go語言高,憑借其語言特性和簡單的編程方式,彌補了其他編程語言一定程度上的不足,一度成為一個熱門的編程語言。
最近在學習Go語言,我之前使用過C#、Java等面向對象編程的語言,發(fā)現(xiàn)其中有很多的編程方式和其他語言有區(qū)別的地方,好記性不如爛筆頭,總結一下,和其他語言做個對比。這里只總結差異的地方,具體的語法不做詳細的介紹。
種一棵樹最好的時間是十年前,其次是現(xiàn)在。
3)變量初始化時候可以和其他語言一樣直接在變量后面加等號,等號后面為要初始化的值,也可以使用變量名:=變量值的簡單方式
3)變量賦值 Go語言的變量賦值和多數(shù)語言一致,但是Go語言提供了多重賦值的功能,比如下面這個交換i、j變量的語句:
在不支持多重賦值的語言中,交換兩個變量的值需要引入一個中間變量:
4)匿名變量
在使用其他語言時,有時候要獲取一個值,卻因為該函數(shù)返回多個值而不得不定義很多沒有的變量,Go語言可以借助多重返回值和匿名變量來避免這種寫法,使代碼看起來更優(yōu)雅。
假如GetName()函數(shù)返回3個值,分別是firstName,lastName和nickName
若指向獲得nickName,則函數(shù)調用可以這樣寫
這種寫法可以讓代碼更清晰,從而大幅降低溝通的復雜度和維護的難度。
1)基本常量
常量使用關鍵字const 定義,可以限定常量類型,但不是必須的,如果沒有定義常量的類型,是無類型常量
2)預定義常量
Go語言預定義了這些常量 true、false和iota
iota比較特殊,可以被任務是一個可被編譯器修改的常量,在每個const關鍵字出現(xiàn)時被重置為0,然后在下一個const出現(xiàn)之前每出現(xiàn)一個iota,其所代表的數(shù)字會自動加1.
3)枚舉
1)int 和int32在Go語言中被認為是兩種不同類型的類型
2)Go語言定義了兩個浮點型float32和float64,其中前者等價于C語言的float類型,后者等價于C語言的double類型
3)go語言支持復數(shù)類型
復數(shù)實際上是由兩個實數(shù)(在計算機中使用浮點數(shù)表示)構成,一個表示實部(real)、一個表示虛部(imag)。也就是數(shù)學上的那個復數(shù)
復數(shù)的表示
實部與虛部
對于一個復數(shù)z=complex(x,y),就可以通過Go語言內置函數(shù)real(z)獲得該復數(shù)的實部,也就是x,通過imag(z)獲得該復數(shù)的虛部,也就是y
4)數(shù)組(值類型,長度在定義后無法再次修改,每次傳遞都將產(chǎn)生一個副本。)
5)數(shù)組切片(slice)
數(shù)組切片(slice)彌補了數(shù)組的不足,其數(shù)據(jù)結構可以抽象為以下三個變量:
6)Map 在go語言中Map不需要引入任何庫,使用很方便
Go循環(huán)語句只支持for關鍵字,不支持while和do-while
goto語句的語義非常簡單,就是跳轉到本函數(shù)內的某個標簽
今天就介紹到這里,以后我會在總結Go語言在其他方面比如并發(fā)編程、面向對象、網(wǎng)絡編程等方面的不同及使用方法。希望對大家有所幫助。