1. 保留但大幅度簡化指針
成都創(chuàng)新互聯(lián)公司服務(wù)項目包括龍山網(wǎng)站建設(shè)、龍山網(wǎng)站制作、龍山網(wǎng)頁制作以及龍山網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,龍山網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到龍山省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
Go語言保留著C中值和指針的區(qū)別,但是對于指針繁瑣用法進行了大量的簡化,引入引用的概念。所以在Go語言中,你幾乎不用擔心會因為直接操作內(nèi)寸而引起各式各樣的錯誤。
2. 多參數(shù)返回
還記得在C里面為了回饋多個參數(shù),不得不開辟幾段指針傳到目標函數(shù)中讓其操作么?在Go里面這是完全不必要的。而且多參數(shù)的支持讓Go無需使用繁瑣的exceptions體系,一個函數(shù)可以返回期待的返回值加上error,調(diào)用函數(shù)后立刻處理錯誤信息,清晰明了。
3. Array,slice,map等內(nèi)置基本數(shù)據(jù)結(jié)構(gòu)
如果你習慣了Python中簡潔的list和dict操作,在Go語言中,你不會感到孤單。一切都是那么熟悉,而且更加高效。如果你是C++程序員,你會發(fā)現(xiàn)你又找到了STL的vector 和 map這對朋友。
4. Interface
Go語言最讓人贊嘆不易的特性,就是interface的設(shè)計。任何數(shù)據(jù)結(jié)構(gòu),只要實現(xiàn)了interface所定義的函數(shù),自動就implement了這個interface,沒有像Java那樣冗長的class申明,提供了靈活太多的設(shè)計度和OO抽象度,讓你的代碼也非常干凈。千萬不要以為你習慣了Java那種一條一條加implements的方式,感覺還行,等接口的設(shè)計越來越復雜的時候,無數(shù)Bug正在后面等著你。
同時,正因為如此,Go語言的interface可以用來表示任何generic的東西,比如一個空的interface,可以是string可以是int,可以是任何數(shù)據(jù)類型,因為這些數(shù)據(jù)類型都不需要實現(xiàn)任何函數(shù),自然就滿足空interface的定義了。加上Go語言的type assertion,可以提供一般動態(tài)語言才有的duck typing特性, 而仍然能在compile中捕捉明顯的錯誤。
5. OO
Go語言本質(zhì)上不是面向?qū)ο笳Z言,它還是過程化的。但是,在Go語言中, 你可以很輕易的做大部分你在別的OO語言中能做的事,用更簡單清晰的邏輯。是的,在這里,不需要class,仍然可以繼承,仍然可以多態(tài),但是速度卻快得多。因為本質(zhì)上,OO在Go語言中,就是普通的struct操作。
6. Goroutine
這個幾乎算是Go語言的招牌特性之一了,我也不想多提。如果你完全不了解Goroutine,那么你只需要知道,這玩意是超級輕量級的類似線程的東西,但通過它,你不需要復雜的線程操作鎖操作,不需要care調(diào)度,就能玩轉(zhuǎn)基本的并行程序。在Go語言里,觸發(fā)一個routine和erlang spawn一樣簡單?;旧弦莆誈o語言,以Goroutine和channel為核心的內(nèi)存模型是必須要懂的。不過請放心,真的非常簡單。
7. 更多現(xiàn)代的特性
和C比較,Go語言完全就是一門現(xiàn)代化語言,原生支持的Unicode, garbage collection, Closures(是的,和functional programming language類似), function是first class object,等等等等。
看到這里,你可能會發(fā)現(xiàn),我用了很多輕易,簡單,快速之類的形容詞來形容Go語言的特點。我想說的是,一點都不夸張,連Go語言的入門學習到提高,都比別的語言門檻低太多太多。在大部分人都有C的背景的時代,對于Go語言,從入門到能夠上手做項目,最多不過半個月。Go語言給人的感覺就是太直接了,什么都直接,讀源代碼直接,寫自己的代碼也直接。
1.用{{}}包圍的是變量,如 {{testName}} ,這表示把給定變量的值插入, {%%}這是塊元素 在faygo里叫tag,常見的有 for , if 等
2.如何在模板中定義變量, 平常我們在使用的模板的時候的常會有這樣的需要,在模板中要定義一個變量以方便前端邏輯的實現(xiàn),在faygo模板中定義變量需要用到標簽{%set%}
使用方法
{#定義變量 newName #}
{% set newName = "hello faygo" %}
{#獲取變量newName的值#}
{{newName}}
定義用 tag set 取值就是上文所提到的{{}}取值
3.在模板中調(diào)用方法
這也是一個非常常見和有用的方法,在faygo中調(diào)用方法有兩種方式 , 一是在渲染模板時在faygo.Map在加入你要調(diào)用的方法 , 二是注冊一個全局的方法 (在faygo里叫filter過濾器),我們分別來看一下每個方法的實現(xiàn)
1) 在渲染模板時加入方法(render)
//在后端render時加入方法 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
這種方法適合只用于此模板一個特殊方法 , 在其它功能中不通用 ,那么如果想定義一個方法全局都可以使用怎么辦,這里就需要注冊全局方法了(見下文)
2)注冊全局方法(過濾器)
如果想定義一個方法全局都可以使用怎么辦 ,這里就需要注冊一個方法
// pongo2 注冊一個全局過濾器,一般在程序啟動時init中注冊
//這里注冊了一個名叫testFilter的過濾器,指向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ù)的類型是pongo2.Value和pongo2.Error
在注冊過濾器里方法的接收參數(shù)和返回參數(shù)是固定的這兩個不能改變
官網(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.
那么我們返回數(shù)據(jù)時怎么返回? 在上面例子在我們看到了 AsValue 這個方法可以將我們數(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
}
前端使用:
{#定義一個變量接收struct數(shù)據(jù) #}
{% set uinfo = "" | testFilter %}
{#取用戶名字#}
{{ uinfo.Username }}
注意,如是 uinfo 只是一個struct 不是struct數(shù)組([]uinfo)時 在模板中不能使用{% for %} 使用也不會得到任何數(shù)據(jù)
如果uinfo是struct數(shù)組 在模板中for循環(huán)時不要使用 key,val in uinfo
如果uinfo是struct數(shù)組 uinfo = []userInfo{}
{#錯誤示例#}
{% for key,val in uinfo %}
{{val.Username}}
{% endfor %}
struct數(shù)據(jù)不能使用key,否則循環(huán)會執(zhí)行,但取不到任何數(shù)據(jù)
{# 正確示例 #}
{% for val in uinfo %}
{{val.Username}}
{% endfor %}
說一下返回map時 用for循環(huán)的情況,無論是否是map數(shù)組都可以用for key,val in uinfo 來遍歷數(shù)據(jù)
4. 在模板中字符串的連接和宏標簽的使用
在模板中有時我們會碰到這樣的需要:在模板中有幾個變量 ,我們想把這幾個變量連接在一起賦值給另一個變量以做其它操作
例: 在模板中有三個變量 host是域名,route是路由地址,param是參數(shù) ,要把這三個變量連接起來賦值給另一個新的變量做urlencode操作。這應(yīng)該怎么辦
因為在模板中使用 + 號連接變量時,程序會認為是數(shù)學運算,兩個字符串的連接值為0, 如果用內(nèi)置的filter: join來連接需要傳入一個slice,但這三個只是字符串變量。
這個時候我們可能就要用到宏標簽了% macro %% endmacro %.
思路是這樣的,在宏標簽中定義一個宏(可以理解為一個方法),這個宏接收三個參數(shù)(參數(shù)個數(shù)看需求而定),在宏內(nèi)返回連接的字符串
代碼:
{#定義三個變量#}
{% set host="" %}
{% set route="/aaa/bbb" %}
{% set param= "?id=123" %}
{#定義一個宏標簽接收三個參數(shù),并返回。注意在宏標簽內(nèi)如果換行,輸出的結(jié)果中也會有換行,在urlencode的時候也會把換行符進行轉(zhuǎn)義#}
{% macro joinUrl(paramA,paramB,paramC) %}{{paramA}}{{paramB}}{{paramC}}{% endmacro %}
hr
{#定義一個新變量調(diào)用宏方法,并將三個參數(shù)傳入#}
{% set newurl = joinUrl(host,route,param) %}
{#輸出newurl的值#}
{{newurl}}br
{#輸入出urlencode后的字符串#}
{{newurl|urlencode}}br
結(jié)果:
http%3A%2F%2F
在宏標簽在也可加入自定義的一些字符串如在上面的宏標簽返回結(jié)果中要加一個固定字符可以這樣寫:
{% macro joinUrl(paramA,paramB,paramC) %}{{paramA}}{{paramB}}{{paramC}}from=macro{% endmacro %}
Query1.Close;begin Query1.sql.Add('select count(*) as temp from pzk'); Query1.Open; d:=query1.fieldbyname('temp').asinteger; showmessage(inttostr(d)); {這里的D應(yīng)是萌芽的結(jié)不雅} Query1.SQL.Clear
@microroom 回答得很正確,我補充一點就是n的作用域問題。AddUpper函數(shù)每次被調(diào)用,系統(tǒng)都會分配一塊新的內(nèi)存給n變量,在AddUpper函數(shù)返回的函數(shù)引用消失前,該n變量都不會被釋放。在該內(nèi)部函數(shù)中,n可以當做全局變量看待(n不是全局變量),同一個內(nèi)部函數(shù)引用到的是同一個n變量。
2021-10-22
每一個變量(常量、類型或函數(shù))在程序中都有一定的作用范圍。稱之為作用域。
Go語言在編譯時會檢查每一個變量是否使用過,未使用過的變量就會編譯錯誤。
根據(jù)變量定義位置的不同,可以分為以下三個類型:
在函數(shù)體內(nèi)被聲明的變量稱之為局部變量,作用在函數(shù)體內(nèi),函數(shù)的參數(shù)和返回值變量都屬于局部變量。局部變量不會一直存在,在函數(shù)被調(diào)用時存在,函數(shù)調(diào)用結(jié)束后變量就會被銷毀,即生命周期。
例子:其中a、b均為局部變量,只會在main函數(shù)內(nèi)有效
在函數(shù)體外被聲明的變量稱之為全局變量,作用于所有源文件。不包含這個全局變量的源文件需要使用"import"關(guān)鍵字引入全局變量所在的源文件之后才能使用這個全局變量。
全局變量聲明必須以 var 關(guān)鍵字開頭,如果想要在外部包中使用全局變量的首字母必須大寫。
例如:global為全局在main2和main函數(shù)中都能使用
函數(shù)名后面的小括號里定義的變量, 用于接受來自調(diào)用函數(shù)的參數(shù)。用于接收調(diào)用該函數(shù)時傳入的參數(shù)。
例如:下面的例子中,第十七行a、b為sum函數(shù)定義的形參,用于傳入main函數(shù)中的AF、BF
局部變量
在函數(shù)體內(nèi)聲明的變量稱之為局部變量,它們的作用域只在函數(shù)體內(nèi),參數(shù)和返回值變量也是局部變量。
以下實例中 main() 函數(shù)使用了局部變量 a, b, c:
package main
import "fmt"
func main() {
/* 聲明局部變量 */
var a, b, c int
/* 初始化參數(shù) */
a = 10
b = 20
c = a + b
fmt.Printf ("結(jié)果: a = %d, b = %d and c = %d\n", a, b, c)
}
以上實例執(zhí)行輸出結(jié)果為:
結(jié)果: a = 10, b = 20 and c = 30
全局變量
在函數(shù)體外聲明的變量稱之為全局變量,全局變量可以在整個包甚至外部包(被導出后)使用。
全局變量可以在任何函數(shù)中使用,以下實例演示了如何使用全局變量:
package main
import "fmt"
/* 聲明全局變量 */
var g int
func main() {
/* 聲明局部變量 */
var a, b int
/* 初始化參數(shù) */
a = 10
b = 20
g = a + b
fmt.Printf("結(jié)果: a = %d, b = %d and g = %d\n", a, b, g)
}
以上實例執(zhí)行輸出結(jié)果為:
結(jié)果: a = 10, b = 20 and g = 30
Go 語言程序中全局變量與局部變量名稱可以相同,但是函數(shù)內(nèi)的局部變量會被優(yōu)先考慮。實例如下:
package main
import "fmt"
/* 聲明全局變量 */
var g int = 20
func main() {
/* 聲明局部變量 */
var g int = 10
fmt.Printf ("結(jié)果: g = %d\n", g)
}
以上實例執(zhí)行輸出結(jié)果為:
結(jié)果: g = 10
本文標題:go語言全局引用 go語言可執(zhí)行文件
本文鏈接:http://m.rwnh.cn/article34/hpjese.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、外貿(mào)建站、網(wǎng)站收錄、響應(yīng)式網(wǎng)站、手機網(wǎng)站建設(shè)、網(wǎng)站設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)