欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

go語(yǔ)言反射怎么獲取,go根據(jù)字符串反射到類(lèi)

Go語(yǔ)言設(shè)計(jì)與實(shí)現(xiàn)(上)

基本設(shè)計(jì)思路:

創(chuàng)新互聯(lián)是網(wǎng)站建設(shè)專(zhuān)家,致力于互聯(lián)網(wǎng)品牌建設(shè)與網(wǎng)絡(luò)營(yíng)銷(xiāo),專(zhuān)業(yè)領(lǐng)域包括成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、電商網(wǎng)站制作開(kāi)發(fā)、成都小程序開(kāi)發(fā)、微信營(yíng)銷(xiāo)、系統(tǒng)平臺(tái)開(kāi)發(fā),與其他網(wǎng)站設(shè)計(jì)及系統(tǒng)開(kāi)發(fā)公司不同,我們的整合解決方案結(jié)合了恒基網(wǎng)絡(luò)品牌建設(shè)經(jīng)驗(yàn)和互聯(lián)網(wǎng)整合營(yíng)銷(xiāo)的理念,并將策略和執(zhí)行緊密結(jié)合,且不斷評(píng)估并優(yōu)化我們的方案,為客戶提供全方位的互聯(lián)網(wǎng)品牌整合方案!

類(lèi)型轉(zhuǎn)換、類(lèi)型斷言、動(dòng)態(tài)派發(fā)。iface,eface。

反射對(duì)象具有的方法:

編譯優(yōu)化:

內(nèi)部實(shí)現(xiàn):

實(shí)現(xiàn) Context 接口有以下幾個(gè)類(lèi)型(空實(shí)現(xiàn)就忽略了):

互斥鎖的控制邏輯:

設(shè)計(jì)思路:

(以上為寫(xiě)被讀阻塞,下面是讀被寫(xiě)阻塞)

總結(jié),讀寫(xiě)鎖的設(shè)計(jì)還是非常巧妙的:

設(shè)計(jì)思路:

WaitGroup 有三個(gè)暴露的函數(shù):

部件:

設(shè)計(jì)思路:

結(jié)構(gòu):

Once 只暴露了一個(gè)方法:

實(shí)現(xiàn):

三個(gè)關(guān)鍵點(diǎn):

細(xì)節(jié):

讓多協(xié)程任務(wù)的開(kāi)始執(zhí)行時(shí)間可控(按順序或歸一)。(Context 是控制結(jié)束時(shí)間)

設(shè)計(jì)思路: 通過(guò)一個(gè)鎖和內(nèi)置的 notifyList 隊(duì)列實(shí)現(xiàn),Wait() 會(huì)生成票據(jù),并將等待協(xié)程信息加入鏈表中,等待控制協(xié)程中發(fā)送信號(hào)通知一個(gè)(Signal())或所有(Boardcast())等待者(內(nèi)部實(shí)現(xiàn)是通過(guò)票據(jù)通知的)來(lái)控制協(xié)程解除阻塞。

暴露四個(gè)函數(shù):

實(shí)現(xiàn)細(xì)節(jié):

部件:

包: golang.org/x/sync/errgroup

作用:開(kāi)啟 func() error 函數(shù)簽名的協(xié)程,在同 Group 下協(xié)程并發(fā)執(zhí)行過(guò)程并收集首次 err 錯(cuò)誤。通過(guò) Context 的傳入,還可以控制在首次 err 出現(xiàn)時(shí)就終止組內(nèi)各協(xié)程。

設(shè)計(jì)思路:

結(jié)構(gòu):

暴露的方法:

實(shí)現(xiàn)細(xì)節(jié):

注意問(wèn)題:

包: "golang.org/x/sync/semaphore"

作用:排隊(duì)借資源(如錢(qián),有借有還)的一種場(chǎng)景。此包相當(dāng)于對(duì)底層信號(hào)量的一種暴露。

設(shè)計(jì)思路:有一定數(shù)量的資源 Weight,每一個(gè) waiter 攜帶一個(gè) channel 和要借的數(shù)量 n。通過(guò)隊(duì)列排隊(duì)執(zhí)行借貸。

結(jié)構(gòu):

暴露方法:

細(xì)節(jié):

部件:

細(xì)節(jié):

包: "golang.org/x/sync/singleflight"

作用:防擊穿。瞬時(shí)的相同請(qǐng)求只調(diào)用一次,response 被所有相同請(qǐng)求共享。

設(shè)計(jì)思路:按請(qǐng)求的 key 分組(一個(gè) *call 是一個(gè)組,用 map 映射存儲(chǔ)組),每個(gè)組只進(jìn)行一次訪問(wèn),組內(nèi)每個(gè)協(xié)程會(huì)獲得對(duì)應(yīng)結(jié)果的一個(gè)拷貝。

結(jié)構(gòu):

邏輯:

細(xì)節(jié):

部件:

如有錯(cuò)誤,請(qǐng)批評(píng)指正。

go語(yǔ)言中的反射

import (

"fmt"

"reflect"

)

func reflecType(x interface{}){

v := reflect.TypeOf(x)

fmt.Println("type:%v\n", v)

fmt.Println("type name:%v , rtpe kind:%v \n", v.getName(), v.getType())

}

type Cat struct{}

//通過(guò)反射設(shè)置變量的值

func reflectSetValue1(x interface{}){

v := reflect.ValueOf(x)

if v.Kind() == reflect.Int64{

v.SetInt(200) //修改的是副本, reflect 包會(huì)引發(fā)panic

}

}

//通過(guò)反射設(shè)置變量的值

func reflectSetValue2(x interface{}){

v := reflect.ValueOf(x)

//反射中使用Elem()獲取指針對(duì)應(yīng)的值

if v.Elem().Kind() == reflect.Int64{

v.Elem().SetInt(200)

}

}

func main(){

var a float32 = 3.14

reflectType(a) //type name:float32 type kind:float32

var b int64 = 100

reflectType(b) // type name :int64 type kind :int64

var c = Cat{}

reflectType(c) // type name :Cat type kind :struct

reflectSetValue1(b)

fmt.Println(b) //依然為100

reflectSetValue2(b)

}

Go語(yǔ)言JSON 處理

運(yùn)行結(jié)果

struct能被轉(zhuǎn)換的字段都是首字母大寫(xiě)的字段,但如果想要在json中使用小寫(xiě)字母開(kāi)頭的key,可以使用struct的tag來(lái)輔助反射。

運(yùn)行結(jié)果:

測(cè)試代碼

運(yùn)行結(jié)果

在這里插入圖片描述

GO語(yǔ)言是什么語(yǔ)言?我們應(yīng)該怎么學(xué)?

Go語(yǔ)言是谷歌推出的一種全新的編程語(yǔ)言,可以在不損失應(yīng)用程序性能的情況下降低代碼的復(fù)雜性。谷歌首席軟件工程師羅布派克(Rob Pike)說(shuō):我們之所以開(kāi)發(fā)Go,是因?yàn)檫^(guò)去10多年間軟件開(kāi)發(fā)的難度令人沮喪。

Go是谷歌2009發(fā)布的第二款編程語(yǔ)言。2009年7月份,谷歌曾發(fā)布了Simple語(yǔ)言,它是用來(lái)開(kāi)發(fā)Android應(yīng)用的一種BASIC語(yǔ)言.

北京時(shí)間2010年1月10日,Go語(yǔ)言摘得了TIOBE公布的2009年年度大獎(jiǎng)。該獎(jiǎng)項(xiàng)授予在2009年市場(chǎng)份額增長(zhǎng)最多的編程語(yǔ)言。

谷歌資深軟件工程師羅布·派克(Rob Pike)表示,"Go讓我體驗(yàn)到了從未有過(guò)的開(kāi)發(fā)效率。"派克表示,今天的C++或C一樣,Go是一種系統(tǒng)語(yǔ)言。他解釋道,"使用它可以進(jìn)行快速開(kāi)發(fā),同時(shí)它還是一個(gè)真正的編譯語(yǔ)言,我們之所以現(xiàn)在將其開(kāi)源,原因是我們認(rèn)為它已經(jīng)非常有用和強(qiáng)大。"

2007年,谷歌把Go作為一個(gè)20%項(xiàng)目開(kāi)始研發(fā),即讓員工抽出本職工作之外時(shí)間的20%, 投入在該項(xiàng)目上。除了派克外,該項(xiàng)目的成員還有其他谷歌工程師也參與研發(fā)。

派克表示,編譯后Go代碼的運(yùn)行速度與C語(yǔ)言非常接近,而且編譯速度非常快,就像在使用一個(gè)交互式語(yǔ)言。現(xiàn)有編程語(yǔ)言均未專(zhuān)門(mén)對(duì)多核處理器進(jìn)行優(yōu)化。Go就是谷歌工程師為這類(lèi)程序編寫(xiě)的一種語(yǔ)言。它不是針對(duì)編程初學(xué)者設(shè)計(jì)的,但學(xué)習(xí)使用它也不是非常困難。Go支持面向?qū)ο螅揖哂姓嬲拈]包(closures)和反射 (reflection)等功能。

在學(xué)習(xí)曲線方面,派克認(rèn)為Go與Java類(lèi)似,對(duì)于Java開(kāi)發(fā)者來(lái)說(shuō),應(yīng)該能夠輕松學(xué)會(huì) Go。之所以將Go作為一個(gè)開(kāi)源項(xiàng)目發(fā)布,目的是讓開(kāi)源社區(qū)有機(jī)會(huì)創(chuàng)建更好的工具來(lái)使用該語(yǔ)言,例如 Eclipse IDE中的插件。

在谷歌公開(kāi)發(fā)布的所有網(wǎng)絡(luò)應(yīng)用中,均沒(méi)有使用Go,但是谷歌已經(jīng)使用該語(yǔ)言開(kāi)發(fā)了幾個(gè)內(nèi)部項(xiàng)目。派克表示,Go是否會(huì)對(duì)谷歌即將推出的Chrome OS產(chǎn)生影響,還言之尚早,不過(guò)Go的確可以和Native Client配合使用。他表示"Go可以讓?xiě)?yīng)用完美的運(yùn)行在瀏覽器內(nèi)。"例如,使用Go可以更高效的實(shí)現(xiàn)Wave,無(wú)論是在前端還是后臺(tái)。

Go 同時(shí)具有兩種編譯器,一種是建立在GCC基礎(chǔ)上的Gccgo,另外一種是分別針對(duì)64位x64和32位x86計(jì)算機(jī)的一套編譯器(6g和8g)。谷歌目前正在研發(fā)其對(duì)ARM芯片和Android設(shè)備的支持。派克表示,"Android手機(jī)存在的問(wèn)題是,我們一直沒(méi)有一個(gè)數(shù)學(xué)協(xié)處理器。"

GO語(yǔ)言(三十):訪問(wèn)關(guān)系型數(shù)據(jù)庫(kù)(上)

本教程介紹了使用 Godatabase/sql及其標(biāo)準(zhǔn)庫(kù)中的包訪問(wèn)關(guān)系數(shù)據(jù)庫(kù)的基礎(chǔ)知識(shí)。

您將使用的database/sql包包括用于連接數(shù)據(jù)庫(kù)、執(zhí)行事務(wù)、取消正在進(jìn)行的操作等的類(lèi)型和函數(shù)。

在本教程中,您將創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),然后編寫(xiě)代碼來(lái)訪問(wèn)該數(shù)據(jù)庫(kù)。您的示例項(xiàng)目將是有關(guān)老式爵士樂(lè)唱片的數(shù)據(jù)存儲(chǔ)庫(kù)。

首先,為您要編寫(xiě)的代碼創(chuàng)建一個(gè)文件夾。

1、打開(kāi)命令提示符并切換到您的主目錄。

在 Linux 或 Mac 上:

在 Windows 上:

2、在命令提示符下,為您的代碼創(chuàng)建一個(gè)名為 data-access 的目錄。

3、創(chuàng)建一個(gè)模塊,您可以在其中管理將在本教程中添加的依賴(lài)項(xiàng)。

運(yùn)行g(shù)o mod init命令,為其提供新代碼的模塊路徑。

此命令創(chuàng)建一個(gè) go.mod 文件,您添加的依賴(lài)項(xiàng)將在其中列出以供跟蹤。

注意: 在實(shí)際開(kāi)發(fā)中,您會(huì)指定一個(gè)更符合您自己需求的模塊路徑。有關(guān)更多信息,請(qǐng)參閱一下文章。

GO語(yǔ)言(二十五):管理依賴(lài)項(xiàng)(上)

GO語(yǔ)言(二十六):管理依賴(lài)項(xiàng)(中)

GO語(yǔ)言(二十七):管理依賴(lài)項(xiàng)(下)

接下來(lái),您將創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)。

在此步驟中,您將創(chuàng)建要使用的數(shù)據(jù)庫(kù)。您將使用 DBMS 本身的 CLI 創(chuàng)建數(shù)據(jù)庫(kù)和表,以及添加數(shù)據(jù)。

您將創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),其中包含有關(guān)黑膠唱片上的老式爵士樂(lè)錄音的數(shù)據(jù)。

這里的代碼使用MySQL CLI,但大多數(shù) DBMS 都有自己的 CLI,具有類(lèi)似的功能。

1、打開(kāi)一個(gè)新的命令提示符。

在命令行,登錄到您的 DBMS,如下面的 MySQL 示例所示。

2、在mysql命令提示符下,創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)。

3、切到您剛剛創(chuàng)建的數(shù)據(jù)庫(kù),以便您可以添加表。

4、在文本編輯器的 data-access 文件夾中,創(chuàng)建一個(gè)名為 create-tables.sql 的文件來(lái)保存用于添加表的 SQL 腳本。

將以下 SQL 代碼粘貼到文件中,然后保存文件。

在此 SQL 代碼中:

(1)刪除名為album表。 首先執(zhí)行此命令可以讓您更輕松地稍后重新運(yùn)行腳本。

(2)創(chuàng)建一個(gè)album包含四列的表:title、artist和price。每行的id值由 DBMS 自動(dòng)創(chuàng)建。

(3)添加帶有值的四行。

5、在mysql命令提示符下,運(yùn)行您剛剛創(chuàng)建的腳本。

您將使用以下形式的source命令:

6、在 DBMS 命令提示符處,使用SELECT語(yǔ)句來(lái)驗(yàn)證您是否已成功創(chuàng)建包含數(shù)據(jù)的表。

接下來(lái),您將編寫(xiě)一些 Go 代碼進(jìn)行連接,以便進(jìn)行查詢。

現(xiàn)在你已經(jīng)有了一個(gè)包含一些數(shù)據(jù)的數(shù)據(jù)庫(kù),開(kāi)始你的 Go 代碼。

找到并導(dǎo)入一個(gè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,該驅(qū)動(dòng)程序會(huì)將您通過(guò)database/sql包中的函數(shù)發(fā)出的請(qǐng)求轉(zhuǎn)換為數(shù)據(jù)庫(kù)可以理解的請(qǐng)求。

1、在您的瀏覽器中,訪問(wèn)SQLDrivers wiki 頁(yè)面以識(shí)別您可以使用的驅(qū)動(dòng)程序。

2、使用頁(yè)面上的列表來(lái)識(shí)別您將使用的驅(qū)動(dòng)程序。為了在本教程中訪問(wèn) MySQL,您將使用 Go-MySQL-Driver。

3、請(qǐng)注意驅(qū)動(dòng)程序的包名稱(chēng) - 此處為github.com/go-sql-driver/mysql.

4、使用您的文本編輯器,創(chuàng)建一個(gè)用于編寫(xiě) Go 代碼的文件,并將該文件作為 main.go 保存在您之前創(chuàng)建的數(shù)據(jù)訪問(wèn)目錄中。

5、進(jìn)入main.go,粘貼以下代碼導(dǎo)入驅(qū)動(dòng)包。

在此代碼中:

(1)將您的代碼添加到main包中,以便您可以獨(dú)立執(zhí)行它。

(2)導(dǎo)入 MySQL 驅(qū)動(dòng)程序github.com/go-sql-driver/mysql。

導(dǎo)入驅(qū)動(dòng)程序后,您將開(kāi)始編寫(xiě)代碼以訪問(wèn)數(shù)據(jù)庫(kù)。

現(xiàn)在編寫(xiě)一些 Go 代碼,讓您使用數(shù)據(jù)庫(kù)句柄訪問(wèn)數(shù)據(jù)庫(kù)。

您將使用指向結(jié)構(gòu)的指針sql.DB,它表示對(duì)特定數(shù)據(jù)庫(kù)的訪問(wèn)。

編寫(xiě)代碼

1、進(jìn)入 main.go,在import您剛剛添加的代碼下方,粘貼以下 Go 代碼以創(chuàng)建數(shù)據(jù)庫(kù)句柄。

在此代碼中:

(3)使用 MySQL 驅(qū)動(dòng)程序Config和FormatDSN類(lèi)型以收集連接屬性并將它們格式化為連接字符串的 DSN。

該Config結(jié)構(gòu)使代碼比連接字符串更容易閱讀。

(4)調(diào)用sql.Open 初始化db變量,傳遞 FormatDSN。

(5)檢查來(lái)自 的錯(cuò)誤sql.Open。例如,如果您的數(shù)據(jù)庫(kù)連接細(xì)節(jié)格式不正確,它可能會(huì)失敗。

為了簡(jiǎn)化代碼,您調(diào)用log.Fatal結(jié)束執(zhí)行并將錯(cuò)誤打印到控制臺(tái)。在生產(chǎn)代碼中,您會(huì)希望以更優(yōu)雅的方式處理錯(cuò)誤。

(6)調(diào)用DB.Ping以確認(rèn)連接到數(shù)據(jù)庫(kù)有效。在運(yùn)行時(shí), sql.Open可能不會(huì)立即連接,具體取決于驅(qū)動(dòng)程序。您在Ping此處使用以確認(rèn) database/sql包可以在需要時(shí)連接。

(7)檢查來(lái)自Ping的錯(cuò)誤,以防連接失敗。

(8)Ping如果連接成功,則打印一條消息。

文件的頂部現(xiàn)在應(yīng)該如下所示:

3、保存 main.go。

1、開(kāi)始跟蹤 MySQL 驅(qū)動(dòng)程序模塊作為依賴(lài)項(xiàng)。

使用go get 添加 github.com/go-sql-driver/mysql 模塊作為您自己模塊的依賴(lài)項(xiàng)。使用點(diǎn)參數(shù)表示“獲取當(dāng)前目錄中代碼的依賴(lài)項(xiàng)”。

2、在命令提示符下,設(shè)置Go 程序使用的DBUSER和DBPASS環(huán)境變量。

在 Linux 或 Mac 上:

在 Windows 上:

3、在包含 main.go 的目錄中的命令行中,通過(guò)鍵入go run來(lái)運(yùn)行代碼。

連接成功了!

接下來(lái),您將查詢一些數(shù)據(jù)。

講講go語(yǔ)言的結(jié)構(gòu)體

作為C語(yǔ)言家族的一員,go和c一樣也支持結(jié)構(gòu)體。可以類(lèi)比于java的一個(gè)POJO。

在學(xué)習(xí)定義結(jié)構(gòu)體之前,先學(xué)習(xí)下定義一個(gè)新類(lèi)型。

新類(lèi)型 T1 是基于 Go 原生類(lèi)型 int 定義的新自定義類(lèi)型,而新類(lèi)型 T2 則是 基于剛剛定義的類(lèi)型 T1,定義的新類(lèi)型。

這里要引入一個(gè)底層類(lèi)型的概念。

如果一個(gè)新類(lèi)型是基于某個(gè) Go 原生類(lèi)型定義的, 那么我們就叫 Go 原生類(lèi)型為新類(lèi)型的底層類(lèi)型

在上面的例子中,int就是T1的底層類(lèi)型。

但是T1不是T2的底層類(lèi)型,只有原生類(lèi)型才可以作為底層類(lèi)型,所以T2的底層類(lèi)型還是int

底層類(lèi)型是很重要的,因?yàn)閷?duì)兩個(gè)變量進(jìn)行顯式的類(lèi)型轉(zhuǎn)換,只有底層類(lèi)型相同的變量間才能相互轉(zhuǎn)換。底層類(lèi)型是判斷兩個(gè)類(lèi)型本質(zhì)上是否相同的根本。

這種類(lèi)型定義方式通常用在 項(xiàng)目的漸進(jìn)式重構(gòu),還有對(duì)已有包的二次封裝方面

類(lèi)型別名表示新類(lèi)型和原類(lèi)型完全等價(jià),實(shí)際上就是同一種類(lèi)型。只不過(guò)名字不同而已。

一般我們都是定義一個(gè)有名的結(jié)構(gòu)體。

字段名的大小寫(xiě)決定了字段是否包外可用。只有大寫(xiě)的字段可以被包外引用。

還有一個(gè)點(diǎn)提一下

如果換行來(lái)寫(xiě)

Age: 66,后面這個(gè)都好不能省略

還有一個(gè)點(diǎn),觀察e3的賦值

new返回的是一個(gè)指針。然后指針可以直接點(diǎn)號(hào)賦值。這說(shuō)明go默認(rèn)進(jìn)行了取值操作

e3.Age 等價(jià)于 (*e3).Age

如上定義了一個(gè)空的結(jié)構(gòu)體Empty。打印了元素e的內(nèi)存大小是0。

有什么用呢?

基于空結(jié)構(gòu)體類(lèi)型內(nèi)存零開(kāi)銷(xiāo)這樣的特性,我們?cè)谌粘?Go 開(kāi)發(fā)中會(huì)經(jīng)常使用空 結(jié)構(gòu)體類(lèi)型元素,作為一種“事件”信息進(jìn)行 Goroutine 之間的通信

這種以空結(jié)構(gòu)體為元素類(lèi)建立的 channel,是目前能實(shí)現(xiàn)的、內(nèi)存占用最小的 Goroutine 間通信方式。

這種形式需要說(shuō)的是幾個(gè)語(yǔ)法糖。

語(yǔ)法糖1:

對(duì)于結(jié)構(gòu)體字段,可以省略字段名,只寫(xiě)結(jié)構(gòu)體名。默認(rèn)字段名就是結(jié)構(gòu)體名

這種方式稱(chēng)為 嵌入字段

語(yǔ)法糖2:

如果是以嵌入字段形式寫(xiě)的結(jié)構(gòu)體

可以省略嵌入的Reader字段,而直接訪問(wèn)ReaderName

此時(shí)book是一個(gè)各個(gè)屬性全是對(duì)應(yīng)類(lèi)型零值的一個(gè)實(shí)例。不是nil。這種情況在Go中稱(chēng)為零值可用。不像java會(huì)導(dǎo)致npe

結(jié)構(gòu)體定義時(shí)可以在字段后面追加標(biāo)簽說(shuō)明。

tag的格式為反單引號(hào)

tag的作用是可以使用[反射]來(lái)檢視字段的標(biāo)簽信息。

具體的作用還要看使用的場(chǎng)景。

比如這里的tag是為了幫助 encoding/json 標(biāo)準(zhǔn)包在解析對(duì)象時(shí)可以利用的規(guī)則。比如omitempty表示該字段沒(méi)有值就不打印出來(lái)。

本文名稱(chēng):go語(yǔ)言反射怎么獲取,go根據(jù)字符串反射到類(lèi)
文章地址:http://chinadenli.net/article49/dsicseh.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)商城網(wǎng)站網(wǎng)站維護(hù)關(guān)鍵詞優(yōu)化品牌網(wǎng)站設(shè)計(jì)企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司