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

go語(yǔ)言中怎樣引用模板,go引用類(lèi)型

Go語(yǔ)言基礎(chǔ)語(yǔ)法(一)

本文介紹一些Go語(yǔ)言的基礎(chǔ)語(yǔ)法。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、微信小程序定制開(kāi)發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶(hù)創(chuàng)新互聯(lián)還提供了清豐免費(fèi)建站歡迎大家使用!

先來(lái)看一個(gè)簡(jiǎn)單的go語(yǔ)言代碼:

go語(yǔ)言的注釋方法:

代碼執(zhí)行結(jié)果:

下面來(lái)進(jìn)一步介紹go的基礎(chǔ)語(yǔ)法。

go語(yǔ)言中格式化輸出可以使用 fmt 和 log 這兩個(gè)標(biāo)準(zhǔn)庫(kù),

常用方法:

示例代碼:

執(zhí)行結(jié)果:

更多格式化方法可以訪問(wèn)中的fmt包。

log包實(shí)現(xiàn)了簡(jiǎn)單的日志服務(wù),也提供了一些格式化輸出的方法。

執(zhí)行結(jié)果:

下面來(lái)介紹一下go的數(shù)據(jù)類(lèi)型

下表列出了go語(yǔ)言的數(shù)據(jù)類(lèi)型:

int、float、bool、string、數(shù)組和struct屬于值類(lèi)型,這些類(lèi)型的變量直接指向存在內(nèi)存中的值;slice、map、chan、pointer等是引用類(lèi)型,存儲(chǔ)的是一個(gè)地址,這個(gè)地址存儲(chǔ)最終的值。

常量是在程序編譯時(shí)就確定下來(lái)的值,程序運(yùn)行時(shí)無(wú)法改變。

執(zhí)行結(jié)果:

執(zhí)行結(jié)果:

Go 語(yǔ)言的運(yùn)算符主要包括算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符、賦值運(yùn)算符以及指針相關(guān)運(yùn)算符。

算術(shù)運(yùn)算符:

關(guān)系運(yùn)算符:

邏輯運(yùn)算符:

位運(yùn)算符:

賦值運(yùn)算符:

指針相關(guān)運(yùn)算符:

下面介紹一下go語(yǔ)言中的if語(yǔ)句和switch語(yǔ)句。另外還有一種控制語(yǔ)句叫select語(yǔ)句,通常與通道聯(lián)用,這里不做介紹。

if語(yǔ)法格式如下:

if ... else :

else if:

示例代碼:

語(yǔ)法格式:

另外,添加 fallthrough 會(huì)強(qiáng)制執(zhí)行后面的 case 語(yǔ)句,不管下一條case語(yǔ)句是否為true。

示例代碼:

執(zhí)行結(jié)果:

下面介紹幾種循環(huán)語(yǔ)句:

執(zhí)行結(jié)果:

執(zhí)行結(jié)果:

也可以通過(guò)標(biāo)記退出循環(huán):

--THE END--

GO語(yǔ)言(十一):開(kāi)始使用多模塊工作區(qū)

本教程介紹 Go 中多模塊工作區(qū)的基礎(chǔ)知識(shí)。使用多模塊工作區(qū),您可以告訴 Go 命令您正在同時(shí)在多個(gè)模塊中編寫(xiě)代碼,并輕松地在這些模塊中構(gòu)建和運(yùn)行代碼。

在本教程中,您將在共享的多模塊工作區(qū)中創(chuàng)建兩個(gè)模塊,對(duì)這些模塊進(jìn)行更改,并在構(gòu)建中查看這些更改的結(jié)果。

本教程需要 go1.18 或更高版本。使用go.dev/dl中的鏈接確保您已在 Go 1.18 或更高版本中安裝了 Go 。

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

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

在 Linux 或 Mac 上:

在 Windows 上:

2、在命令提示符下,為您的代碼創(chuàng)建一個(gè)名為工作區(qū)的目錄。

3、初始化模塊

我們的示例將創(chuàng)建一個(gè)hello依賴(lài)于 golang.org/x/example 模塊的新模塊。

創(chuàng)建你好模塊:

使用 . 添加對(duì) golang.org/x/example 模塊的依賴(lài)項(xiàng)go get。

在 hello 目錄下創(chuàng)建 hello.go,內(nèi)容如下:

現(xiàn)在,運(yùn)行 hello 程序:

在這一步中,我們將創(chuàng)建一個(gè)go.work文件來(lái)指定模塊的工作區(qū)。

在workspace目錄中,運(yùn)行:

該go work init命令告訴為包含目錄中模塊的工作空間go創(chuàng)建一個(gè)文件 。go.work./hello

該go命令生成一個(gè)go.work如下所示的文件:

該go.work文件的語(yǔ)法與go.mod相同。

該go指令告訴 Go 應(yīng)該使用哪個(gè)版本的 Go 來(lái)解釋文件。它類(lèi)似于文件中的go指令go.mod 。

該use指令告訴 Go在進(jìn)行構(gòu)建時(shí)hello目錄中的模塊應(yīng)該是主模塊。

所以在模塊的任何子目錄中workspace都會(huì)被激活。

2、運(yùn)行工作區(qū)目錄下的程序

在workspace目錄中,運(yùn)行:

Go 命令包括工作區(qū)中的所有模塊作為主模塊。這允許我們?cè)谀K中引用一個(gè)包,即使在模塊之外。在模塊或工作區(qū)之外運(yùn)行g(shù)o run命令會(huì)導(dǎo)致錯(cuò)誤,因?yàn)樵揼o命令不知道要使用哪些模塊。

接下來(lái),我們將golang.org/x/example模塊的本地副本添加到工作區(qū)。然后,我們將向stringutil包中添加一個(gè)新函數(shù),我們可以使用它來(lái)代替Reverse.

在這一步中,我們將下載包含該模塊的 Git 存儲(chǔ)庫(kù)的副本golang.org/x/example,將其添加到工作區(qū),然后向其中添加一個(gè)我們將從 hello 程序中使用的新函數(shù)。

1、克隆存儲(chǔ)庫(kù)

在工作區(qū)目錄中,運(yùn)行g(shù)it命令來(lái)克隆存儲(chǔ)庫(kù):

2、將模塊添加到工作區(qū)

該go work use命令將一個(gè)新模塊添加到 go.work 文件中。它現(xiàn)在看起來(lái)像這樣:

該模塊現(xiàn)在包括example.com/hello模塊和 `golang.org/x/example 模塊。

這將允許我們使用我們將在模塊副本中編寫(xiě)的新代碼,而不是使用命令stringutil下載的模塊緩存中的模塊版本。

3、添加新功能。

我們將向golang.org/x/example/stringutil包中添加一個(gè)新函數(shù)以將字符串大寫(xiě)。

將新文件夾添加到workspace/example/stringutil包含以下內(nèi)容的目錄:

4、修改hello程序以使用該功能。

修改workspace/hello/hello.go的內(nèi)容以包含以下內(nèi)容:

從工作區(qū)目錄,運(yùn)行

Go 命令在go.work文件指定的hello目錄中查找命令行中指定的example.com/hello模塊 ,同樣使用go.work文件解析導(dǎo)入golang.org/x/example。

go.work可以用來(lái)代替添加replace 指令以跨多個(gè)模塊工作。

由于這兩個(gè)模塊在同一個(gè)工作區(qū)中,因此很容易在一個(gè)模塊中進(jìn)行更改并在另一個(gè)模塊中使用它。

現(xiàn)在,要正確發(fā)布這些模塊,我們需要發(fā)布golang.org/x/example 模塊,例如在v0.1.0. 這通常通過(guò)在模塊的版本控制存儲(chǔ)庫(kù)上標(biāo)記提交來(lái)完成。發(fā)布完成后,我們可以增加對(duì) golang.org/x/example模塊的要求hello/go.mod:

這樣,該go命令可以正確解析工作區(qū)之外的模塊。

關(guān)于go語(yǔ)言中的引用傳遞,小白剛?cè)腴T(mén),跪求大神解惑!

a, b *string傳入swap函數(shù)內(nèi)部后,使用的是a,b的副本a1,b1, 他們的值是相同的,都是字符串的首字母的地址,當(dāng)在內(nèi)部交換這兩個(gè)值時(shí),函數(shù)結(jié)束后,這兩個(gè)值就被銷(xiāo)毀了;如果交換的是這兩個(gè)值代表的數(shù)據(jù),函數(shù)結(jié)束后,這兩個(gè)地址值被銷(xiāo)毀,但地址指向的字符串?dāng)?shù)據(jù)已經(jīng)被修改了,所以可以交換成功。

golang的iris框架的模版如何相互引用?

1.用{{}}包圍的是變量,如 {{testName}} ,這表示把給定變量的值插入, {%%}這是塊元素 在faygo里叫tag,常見(jiàn)的有 for , if 等

2.如何在模板中定義變量, 平常我們?cè)谑褂玫哪0宓臅r(shí)候的常會(huì)有這樣的需要,在模板中要定義一個(gè)變量以方便前端邏輯的實(shí)現(xiàn),在faygo模板中定義變量需要用到標(biāo)簽{%set%}

使用方法

{#定義變量 newName #}

{% set newName = "hello faygo" %}

{#獲取變量newName的值#}

{{newName}}

定義用 tag set 取值就是上文所提到的{{}}取值

3.在模板中調(diào)用方法

這也是一個(gè)非常常見(jiàn)和有用的方法,在faygo中調(diào)用方法有兩種方式 , 一是在渲染模板時(shí)在faygo.Map在加入你要調(diào)用的方法 , 二是注冊(cè)一個(gè)全局的方法 (在faygo里叫filter過(guò)濾器),我們分別來(lái)看一下每個(gè)方法的實(shí)現(xiàn)

1) 在渲染模板時(shí)加入方法(render)

//在后端render時(shí)加入方法 testFunc

rErr := ctx.Render(200, switchDir+"index.html", faygo.Map{

"TITLE": title,

"testMap": map[string]string{"aaa": "111111"},

"testFunc": func(s string) string {

return s + " this is test func"

},

})

{#前端模板中調(diào)用#}

{{ testFunc("hello") }}

結(jié)果如下

hello this is test func

這種方法適合只用于此模板一個(gè)特殊方法 , 在其它功能中不通用 ,那么如果想定義一個(gè)方法全局都可以使用怎么辦,這里就需要注冊(cè)全局方法了(見(jiàn)下文)

2)注冊(cè)全局方法(過(guò)濾器)

如果想定義一個(gè)方法全局都可以使用怎么辦 ,這里就需要注冊(cè)一個(gè)方法

// pongo2 注冊(cè)一個(gè)全局過(guò)濾器,一般在程序啟動(dòng)時(shí)init中注冊(cè)

//這里注冊(cè)了一個(gè)名叫testFilter的過(guò)濾器,指向TestFilterFunc方法

pongo2.RegisterFilter("testFilter", TestFilterFunc)

func TestFilterFunc(in, param *pongo2.Value) (*pongo2.Value, *pongo2.Error) {

a := in.String() + " this is global filter"

return pongo2.AsValue(a), nil

}

在這里我們看到TestFilterFunc方法里接收參數(shù)和返回參數(shù)的類(lèi)型是pongo2.Value和pongo2.Error

在注冊(cè)過(guò)濾器里方法的接收參數(shù)和返回參數(shù)是固定的這兩個(gè)不能改變

官網(wǎng)的話:

All functions’ parameters types must be of either your own type or of type *pongo2.Value(no matter how many) and functions must return one value of either type *Value or your own one.

那么我們返回?cái)?shù)據(jù)時(shí)怎么返回? 在上面例子在我們看到了 AsValue 這個(gè)方法可以將我們數(shù)據(jù)返回,我們可以返回struct,map,array,string 等

在前端調(diào)用

{{ "hello" | testFilter }}

結(jié)果:

hello this is global filter

返回結(jié)構(gòu)體:

type LoginUserInfo struct {

Username string `json:"username"`

Telephone string `json:"telephone"`

Email string `json:"email"`

Level int `json:"level"`

}

func TestFilterFunc(in, param *pongo2.Value) (*pongo2.Value, *pongo2.Error) {

userInfo := LoginUserInfo{

Username: "userA",

Telephone: "123456",

Email: "123456@test.com",

Level: 1,

}

return pongo2.AsValue(userInfo), nil

}

前端使用:

{#定義一個(gè)變量接收struct數(shù)據(jù) #}

{% set uinfo = "" | testFilter %}

{#取用戶(hù)名字#}

{{ uinfo.Username }}

注意,如是 uinfo 只是一個(gè)struct 不是struct數(shù)組([]uinfo)時(shí) 在模板中不能使用{% for %} 使用也不會(huì)得到任何數(shù)據(jù)

如果uinfo是struct數(shù)組 在模板中for循環(huán)時(shí)不要使用 key,val in uinfo

如果uinfo是struct數(shù)組 uinfo = []userInfo{}

{#錯(cuò)誤示例#}

{% for key,val in uinfo %}

{{val.Username}}

{% endfor %}

struct數(shù)據(jù)不能使用key,否則循環(huán)會(huì)執(zhí)行,但取不到任何數(shù)據(jù)

{# 正確示例 #}

{% for val in uinfo %}

{{val.Username}}

{% endfor %}

說(shuō)一下返回map時(shí) 用for循環(huán)的情況,無(wú)論是否是map數(shù)組都可以用for key,val in uinfo 來(lái)遍歷數(shù)據(jù)

4. 在模板中字符串的連接和宏標(biāo)簽的使用

在模板中有時(shí)我們會(huì)碰到這樣的需要:在模板中有幾個(gè)變量 ,我們想把這幾個(gè)變量連接在一起賦值給另一個(gè)變量以做其它操作

例: 在模板中有三個(gè)變量 host是域名,route是路由地址,param是參數(shù) ,要把這三個(gè)變量連接起來(lái)賦值給另一個(gè)新的變量做urlencode操作。這應(yīng)該怎么辦

因?yàn)樵谀0逯惺褂?+ 號(hào)連接變量時(shí),程序會(huì)認(rèn)為是數(shù)學(xué)運(yùn)算,兩個(gè)字符串的連接值為0, 如果用內(nèi)置的filter: join來(lái)連接需要傳入一個(gè)slice,但這三個(gè)只是字符串變量。

這個(gè)時(shí)候我們可能就要用到宏標(biāo)簽了% macro %% endmacro %.

思路是這樣的,在宏標(biāo)簽中定義一個(gè)宏(可以理解為一個(gè)方法),這個(gè)宏接收三個(gè)參數(shù)(參數(shù)個(gè)數(shù)看需求而定),在宏內(nèi)返回連接的字符串

代碼:

{#定義三個(gè)變量#}

{% set host="" %}

{% set route="/aaa/bbb" %}

{% set param= "?id=123" %}

{#定義一個(gè)宏標(biāo)簽接收三個(gè)參數(shù),并返回。注意在宏標(biāo)簽內(nèi)如果換行,輸出的結(jié)果中也會(huì)有換行,在urlencode的時(shí)候也會(huì)把換行符進(jìn)行轉(zhuǎn)義#}

{% macro joinUrl(paramA,paramB,paramC) %}{{paramA}}{{paramB}}{{paramC}}{% endmacro %}

hr

{#定義一個(gè)新變量調(diào)用宏方法,并將三個(gè)參數(shù)傳入#}

{% set newurl = joinUrl(host,route,param) %}

{#輸出newurl的值#}

{{newurl}}br

{#輸入出urlencode后的字符串#}

{{newurl|urlencode}}br

結(jié)果:

http%3A%2F%2F

在宏標(biāo)簽在也可加入自定義的一些字符串如在上面的宏標(biāo)簽返回結(jié)果中要加一個(gè)固定字符可以這樣寫(xiě):

{% macro joinUrl(paramA,paramB,paramC) %}{{paramA}}{{paramB}}{{paramC}}from=macro{% endmacro %}

golang中的傳值或傳引用

按數(shù)據(jù)類(lèi)別有以下幾種數(shù)據(jù)類(lèi)型:

按存儲(chǔ)方式也有兩大類(lèi)數(shù)據(jù)類(lèi)型:

值類(lèi)型:變量直接存儲(chǔ)值。值類(lèi)型的數(shù)據(jù)存儲(chǔ)在棧內(nèi)存空間中,棧在函數(shù)調(diào)f返回后,內(nèi)存會(huì)被釋放。

引用類(lèi)型:變量存儲(chǔ)的是一個(gè)地址,這個(gè)地址存儲(chǔ)最終的值。引用數(shù)據(jù)類(lèi)型的數(shù)據(jù)存儲(chǔ)在堆內(nèi)存空間中,通過(guò) GC 回收。

函數(shù)調(diào)用時(shí)申明的基礎(chǔ)類(lèi)型均為值傳遞,如int,string,數(shù)組等,數(shù)據(jù)傳入函數(shù)后會(huì)重新copy一份,函數(shù)內(nèi)的修改不會(huì)影響外面的變量,外部變量的修改也不會(huì)影響函數(shù)類(lèi)的變量。

func main () {

myvar := [ 4 ] string {" test0 ", " test1 ", " test3 ", " test4 "}

go Test (myvar)

for i := 1 ; i

GO語(yǔ)言學(xué)習(xí)系列八——GO函數(shù)(func)的聲明與使用

GO是編譯性語(yǔ)言,所以函數(shù)的順序是無(wú)關(guān)緊要的,為了方便閱讀,建議入口函數(shù) main 寫(xiě)在最前面,其余函數(shù)按照功能需要進(jìn)行排列

GO的函數(shù) 不支持嵌套,重載和默認(rèn)參數(shù)

GO的函數(shù) 支持 無(wú)需聲明變量,可變長(zhǎng)度,多返回值,匿名,閉包等

GO的函數(shù)用 func 來(lái)聲明,且左大括號(hào) { 不能另起一行

一個(gè)簡(jiǎn)單的示例:

輸出為:

參數(shù):可以傳0個(gè)或多個(gè)值來(lái)供自己用

返回:通過(guò)用 return 來(lái)進(jìn)行返回

輸出為:

上面就是一個(gè)典型的多參數(shù)傳遞與多返回值

對(duì)例子的說(shuō)明:

按值傳遞:是對(duì)某個(gè)變量進(jìn)行復(fù)制,不能更改原變量的值

引用傳遞:相當(dāng)于按指針傳遞,可以同時(shí)改變?cè)瓉?lái)的值,并且消耗的內(nèi)存會(huì)更少,只有4或8個(gè)字節(jié)的消耗

在上例中,返回值 (d int, e int, f int) { 是進(jìn)行了命名,如果不想命名可以寫(xiě)成 (int,int,int){ ,返回的結(jié)果都是一樣的,但要注意:

當(dāng)返回了多個(gè)值,我們某些變量不想要,或?qū)嶋H用不到,我們可以使用 _ 來(lái)補(bǔ)位,例如上例的返回我們可以寫(xiě)成 d,_,f := test(a,b,c) ,我們不想要中間的返回值,可以以這種形式來(lái)舍棄掉

在參數(shù)后面以 變量 ... type 這種形式的,我們就要以判斷出這是一個(gè)可變長(zhǎng)度的參數(shù)

輸出為:

在上例中, strs ...string 中, strs 的實(shí)際值是b,c,d,e,這就是一個(gè)最簡(jiǎn)單的傳遞可變長(zhǎng)度的參數(shù)的例子,更多一些演變的形式,都非常類(lèi)似

在GO中 defer 關(guān)鍵字非常重要,相當(dāng)于面相對(duì)像中的析構(gòu)函數(shù),也就是在某個(gè)函數(shù)執(zhí)行完成后,GO會(huì)自動(dòng)這個(gè);

如果在多層循環(huán)中函數(shù)里,都定義了 defer ,那么它的執(zhí)行順序是先進(jìn)后出;

當(dāng)某個(gè)函數(shù)出現(xiàn)嚴(yán)重錯(cuò)誤時(shí), defer 也會(huì)被調(diào)用

輸出為

這是一個(gè)最簡(jiǎn)單的測(cè)試了,當(dāng)然還有更復(fù)雜的調(diào)用,比如調(diào)試程序時(shí),判斷是哪個(gè)函數(shù)出了問(wèn)題,完全可以根據(jù) defer 打印出來(lái)的內(nèi)容來(lái)進(jìn)行判斷,非常快速,這種留給你們?nèi)?shí)現(xiàn)

一個(gè)函數(shù)在函數(shù)體內(nèi)自己調(diào)用自己我們稱(chēng)之為遞歸函數(shù),在做遞歸調(diào)用時(shí),經(jīng)常會(huì)將內(nèi)存給占滿,這是非常要注意的,常用的比如,快速排序就是用的遞歸調(diào)用

本篇重點(diǎn)介紹了GO函數(shù)(func)的聲明與使用,下一篇將介紹GO的結(jié)構(gòu) struct

本文標(biāo)題:go語(yǔ)言中怎樣引用模板,go引用類(lèi)型
當(dāng)前鏈接:http://chinadenli.net/article49/dsshjeh.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷(xiāo)型網(wǎng)站建設(shè)域名注冊(cè)建站公司品牌網(wǎng)站建設(shè)軟件開(kāi)發(fā)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(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)站托管運(yùn)營(yíng)