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

Go語言之類型

Go語言是一種靜態(tài)類型的編程語言,所以在編譯器進行編譯的時候,就要知道每個值的類型,這樣編譯器就知道要為這個值分配多少內存,并且知道這段分配的內存表示什么。

我們提供的服務有:網站設計制作、網站制作、微信公眾號開發(fā)、網站優(yōu)化、網站認證、臨渭區(qū)ssl等。為上千多家企事業(yè)單位解決了網站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的臨渭區(qū)網站制作公司


提前知道值的類型的好處有很多,比如編譯器可以合理地使用這些值,可以進一步優(yōu)化代碼,提高執(zhí)行的效率,減少bug等。


基本類型


基本類型是Go語言自帶的類型,比如數值類型、浮點類型、字符類型以及布爾類型。它們本質上是原始類型,也就是不可改變的,所以對它們進行操作,一般都會返回一個新創(chuàng)建的值。所以把這些值傳遞給函數時,其實傳遞的是一個值的副本。


func main() {
    name:="張三"
    fmt.Println(modify(name))
    fmt.Println(name)
}

func modify(s string) string{
    s=s+s
    return s
}
張三張三
張三


以上是一個操作字符串的例子。通過打印的結果,可以看到,本來name的值并沒有被改變,也就是說,我們傳遞的時一個副本,并且返回一個新創(chuàng)建的字符串。


因為基本類型是拷貝的值,并且在對它進行操作的時候,生成的也是新創(chuàng)建的值,所以這些類型在多線程里是安全的,我們不用擔心一個線程的修改影響了另外一個線程的數據。


引用類型


引用類型和原始的基本類型恰恰相反,它的修改可以影響到任何引用到它的變量。在Go語言中,引用類型有切片、map、接口、函數類型以及chan。


引用類型之所以可以引用,是因為我們創(chuàng)建的引用類型變量,其實是一個標頭值,標頭值里包含一個指針,指向底層的數據結構。當我們在函數中傳遞引用類型時,其實傳遞的是這個標頭值的副本,它所指向的底層結構并沒有被復制傳遞,這也是引用類型傳遞高效的原因。


本質上,我們可以理解函數的傳遞都是值傳遞,只不過引用類型傳遞的是一個指向底層數據的指針。所以我們在操作的時候,可以修改共享的底層數據的值,進而影響到所有引用到這個共享底層數據的變量。


func main() {
    ages := map[string]int{"張三": 20}
    fmt.Println(ages)
    modify(ages)
    fmt.Println(ages)
}

func modify(m map[string]int) {
    m["張三"] = 10
}


這是一個很明顯的修改引用類型的例子,函數modify的修改,會影響到原來變量ages的值。


結構類型


結構類型是用來描述一組值的,比如一個人有身高、體重、名字和年齡等本質上是一種聚合型的數據類型。


type person struct {
    age int
    name string
}


定義一個結構體的類型,要通過type關鍵字和類型struct進行聲明,以上我們就定義了一個結構體類型person,它有agename這兩個字段數據。


結構體類型定義好之后,就可以進行使用了,我們可以用過var關鍵字聲明一個結構體類型的變量。


var p person


這種聲明的方式,會對結構體person里的數據類型默認初始化,也就是使用它們類型的零值。如果要創(chuàng)建一個結構體變量并初始化其為零值時,這種var方式最常用。


如果我們需要指定非零值,就可以使用我們字面量方式了。


jim := person{10,"Jim"}


示例中我們就為其指定了值,注意這個值的順序很重要,必須和結構體里聲明字段的順序一致。當然我們也可以不按順序,但是這時候我們必須為字段指定值。


jim := person{name:"Jim",age:10}


使用冒號:分開字段名和字段值即可,這樣我們就不用嚴格的按照定義的順序了。


除了基本的原始類型外,結構體內的值也可以是引用類型,或者自己定義的其他類型。具體選擇類型,要根據實際情況,比如是否允許修改值本身,如果允許的話,可以選擇引用類型;如果不允許的話,則需要使用基本類型。


函數傳參是值傳遞,所以對于結構體來說也不例外,結構體傳遞的是其本身以及里面的值的拷貝。


func main() {
    jim := person{10,"Jim"}
    fmt.Println(jim)
    modify(jim)
    fmt.Println(jim)
}

func modify(p person) {
    p.age =p.age+10
}

type person struct {
    age int
    name string
}


以上示例的輸出是一樣的,所以我們可以驗證傳遞的是值的副本。如果上面的例子我們要修改age的值可以通過傳遞結構體的指針,我們稍微改動下例子:


func main() {
    jim := person{10,"Jim"}
    fmt.Println(jim)
    modify(&jim)
    fmt.Println(jim)
}

func modify(p *person) {
    p.age =p.age+10
}

type person struct {
    age int
    name string
}


這個例子的輸出是:


{10 Jim}
{20 Jim}


非常明顯的,age的值已經被改變。如果結構體里有引用類型的值,比如map,那么即使我們傳遞的是結構體的值副本,如果修改這個map的話,原結構的對應的map值也會被修改。這里不再寫例子,大家可以驗證下。


自定義類型


Go語言支持我們自定義類型,比如剛剛上面的結構體類型,就是我們自定義的類型,這也是比較常用的自定義類型的方法。


另外一個自定義類型的方法是基于一個已有的類型,就是基于一個現有的類型創(chuàng)造新的類型,這種也是使用type關鍵字。


type Duration int64


我們在使用time這個包的時候,對于類型time.Duration應該非常熟悉,它其實就是基于int64 這個基本類型創(chuàng)建的新類型來表示時間的間隔。


但是這里我們注意,雖然Duration是基于int64創(chuàng)建的,覺得它們其實一樣,比如都可以使用數字賦值。


type Duration int64

var i Duration = 100
var j int64 = 100


但是本質上,它們并不是同一種類型,所以對于Go這種強類型語言,它們是不能相互賦值的。


type Duration int64

var dur Duration
dur=int64(100)
fmt.Println(dur)


上面的例子,在編譯的時候,會報類型轉換的異常錯誤。


cannot use int64(100) (type int64) as type Duration in assignment


Go的編譯器不會像Java的那樣,幫我們做隱式的類型轉換。


有時候,大家會迷茫,已經有了int64這些類型了,可以表示,還要基于它們創(chuàng)建新的類型做什么?其實這就是Go靈活的地方,我們可以使用自定義的類型做很多事情,比如添加方法,比如可以更明確的表示業(yè)務的含義等

當前名稱:Go語言之類型
網頁鏈接:http://chinadenli.net/article32/iegppc.html

成都網站建設公司_創(chuàng)新互聯,為您提供移動網站建設、營銷型網站建設Google、服務器托管定制網站、網頁設計公司

廣告

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

成都做網站
四季精品人妻av一区二区三区| 在线中文字幕亚洲欧美一区| 欧美成人免费一级特黄| 五月婷婷欧美中文字幕| 国产精品午夜视频免费观看| 高清不卡视频在线观看| 日本欧美一区二区三区在线播| 99久久精品免费看国产高清| 国内精品伊人久久久av高清| 久久综合狠狠综合久久综合| 欧美成人黄色一级视频| 精品欧美一区二区三久久| 99久久国产亚洲综合精品| 午夜精品久久久99热连载| 人妻少妇av中文字幕乱码高清| 欧美日韩国产亚洲三级理论片| 日韩综合国产欧美一区| 亚洲中文在线男人的天堂| 不卡免费成人日韩精品| 一二区不卡不卡在线观看| 91久久国产福利自产拍| 色鬼综合久久鬼色88| 亚洲精品国产精品日韩| 出差被公高潮久久中文字幕| 人妻少妇系列中文字幕| 久久国产精品亚州精品毛片 | 亚洲午夜精品视频观看| 二区久久久国产av色| 五月天丁香婷婷一区二区| 日韩欧美国产高清在线| 经典欧美熟女激情综合网| 午夜精品黄片在线播放| 不卡视频在线一区二区三区| 成人三级视频在线观看不卡| 日韩蜜桃一区二区三区| 色婷婷激情五月天丁香| 亚洲中文字幕一区三区| 嫩呦国产一区二区三区av| 午夜传媒视频免费在线观看| 日韩欧美国产精品中文字幕| 亚洲内射人妻一区二区|