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

Go語(yǔ)言之標(biāo)志符可見(jiàn)性-創(chuàng)新互聯(lián)

Go的標(biāo)志符,這個(gè)翻譯覺(jué)得怪怪的,不過(guò)還是按這個(gè)起了標(biāo)題,可以理解為Go的變量、類(lèi)型、字段等。這里的可見(jiàn)性,也就是說(shuō)那些方法、函數(shù)、類(lèi)型或者變量字段的可見(jiàn)性。比如哪些方法不想讓另外一個(gè)包訪(fǎng)問(wèn),我們就可以把它們聲明為非公開(kāi)的;如果需要被另外一個(gè)包訪(fǎng)問(wèn),就可以聲明為公開(kāi)的,和Java語(yǔ)言里的作用域類(lèi)似。

石棉網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、響應(yīng)式網(wǎng)站設(shè)計(jì)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)2013年開(kāi)創(chuàng)至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專(zhuān)注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)

在Go語(yǔ)言中,沒(méi)有特別的關(guān)鍵字來(lái)聲明一個(gè)方法、函數(shù)或者類(lèi)型是否為公開(kāi)的,Go語(yǔ)言是以大小寫(xiě)方式進(jìn)行區(qū)分的。如果一個(gè)類(lèi)型的名字是以大寫(xiě)開(kāi)頭,那么其他包就可以訪(fǎng)問(wèn);如果以小寫(xiě)開(kāi)頭,其他包就不能訪(fǎng)問(wèn)。

package common

type count int
package main

import (
    "flysnow.org/hello/common"
    "fmt"
)

func main() {
    c:=common.count(10)
    fmt.Println(c)
}

這是一個(gè)定義在common包里的類(lèi)型count,因?yàn)樗拿忠孕?xiě)開(kāi)頭,所以我們不能在其他包里使用它,否則就會(huì)報(bào)編譯錯(cuò)誤。

./main.go:9: cannot refer to unexported name common.count

因?yàn)檫@個(gè)類(lèi)型沒(méi)有被導(dǎo)出,如果我們改為大寫(xiě),就可以正常編譯運(yùn)行了,大家可以自己試試。

現(xiàn)在這個(gè)類(lèi)型沒(méi)有導(dǎo)出,不能使用,我們修改下例子,增加一個(gè)函數(shù),看看是否可行。

package common

type count int

func New(v int) count {
    return count(v)
}
func main() {
    c:=common.New(100)
    fmt.Println(c)
}

這里我們?cè)?code>common包里定義了一個(gè)導(dǎo)出的函數(shù)New ,該函數(shù)返回一個(gè)count類(lèi)型的值。New函數(shù)可以在其他包訪(fǎng)問(wèn),但是count類(lèi)型不可以,現(xiàn)在我們?cè)趍ain包里調(diào)用這個(gè)New函數(shù),會(huì)發(fā)現(xiàn)是可以正常調(diào)用并且運(yùn)行的。但是有個(gè)前提,必須使用:=這樣的操作符才可以,因?yàn)樗梢酝茢嘧兞康念?lèi)型。

這是一種非常好的能力。試想,我們?cè)诤推渌诉M(jìn)行函數(shù)方法通信的時(shí)候,只需約定好接口就可以了,至于內(nèi)部實(shí)現(xiàn),使用方是看不到的,隱藏了實(shí)現(xiàn)。

package common

import "fmt"

func NewLoginer() Loginer{
    return defaultLogin(0)
}

type Loginer interface {
    Login()
}

type defaultLogin int

func (d defaultLogin) Login(){
    fmt.Println("login in...")
}
func main() {
    l:=common.NewLoginer()
    l.Login()
}

以上例子,我們對(duì)于函數(shù)間的通信,通過(guò)Loginer接口即可,在main函數(shù)中,使用者只需要返回一個(gè)Loginer接口,至于這個(gè)接口的實(shí)現(xiàn),使用者是不關(guān)心的。所以接口的設(shè)計(jì)者可以把defaultLogin類(lèi)型設(shè)計(jì)為不可見(jiàn),并讓它實(shí)現(xiàn)接口Loginer,這樣我們就隱藏了具體的實(shí)現(xiàn)。如果以后重構(gòu)這個(gè)defaultLogin類(lèi)型的具體實(shí)現(xiàn),也不會(huì)影響外部的使用者,極為方便,這也就是面向接口的編程。

假如一個(gè)導(dǎo)出的結(jié)構(gòu)體類(lèi)型里,有一個(gè)未導(dǎo)出的字段,會(huì)出現(xiàn)怎樣的問(wèn)題。

type User struct {
    Name string
    email string
}

當(dāng)我們?cè)谄渌暶骱统跏蓟?code>User的時(shí)候,字段email是無(wú)法初始化的,因?yàn)樗鼪](méi)有導(dǎo)出,無(wú)法訪(fǎng)問(wèn)。此外,一個(gè)導(dǎo)出的類(lèi)型,包含了一個(gè)未導(dǎo)出的方法也一樣,也是無(wú)法訪(fǎng)問(wèn)的。

我們?cè)贁U(kuò)展,導(dǎo)出和未導(dǎo)出的類(lèi)型相互嵌入,會(huì)有什么什么樣的發(fā)現(xiàn)?

type user struct {
    Name string
}

type Admin struct {
    user
}

被嵌入的user是未導(dǎo)出的,但是它的外部類(lèi)型Admin是導(dǎo)出的,所以外部可以聲明初始化Admin

func main() {
    var ad common.Admin
    ad.Name="張三"
    fmt.Println(ad)
}

這里因?yàn)?code>user是未導(dǎo)出的,所以我們不能再使用字面值直接初始化user了,所以只能先定義一個(gè)Admin類(lèi)型的變量,再對(duì)Name字段初始化。這里Name可以訪(fǎng)問(wèn)是因?yàn)樗菍?dǎo)出的,在user嵌入到Admin中時(shí),它已經(jīng)被提升為Admin的字段,所以它可以被訪(fǎng)問(wèn)。

如果我們還想使用:=操作符怎么做呢?

ad:=common.Admin{}

字面值初始化的時(shí)候什么都不做就好了,因?yàn)?code>user未導(dǎo)出,所以我們不能直接使用字面值初始化Name字段。

還有要注意的是,因?yàn)?code>user未導(dǎo)出,所以我們不能通過(guò)外部類(lèi)型訪(fǎng)問(wèn)內(nèi)部類(lèi)型了,也就是說(shuō)ad.user這樣的操作,都會(huì)編譯不通過(guò)。

最后,我們做個(gè)總結(jié),導(dǎo)出還是未導(dǎo)出,是通過(guò)名稱(chēng)首字母的大小寫(xiě)決定的,它們決定了是否可以訪(fǎng)問(wèn),也就是標(biāo)志符的可見(jiàn)性。

對(duì)于.操作符的調(diào)用,比如調(diào)用類(lèi)型的方法,包的函數(shù),類(lèi)型的字段,外部類(lèi)型訪(fǎng)問(wèn)內(nèi)部類(lèi)型等,我們要記住:.操作符前面的部分導(dǎo)出了,.操作符后面的部分才有可能被訪(fǎng)問(wèn);如果.前面的部分都沒(méi)有導(dǎo)出,那么即使.后面的部分是導(dǎo)出的,也無(wú)法訪(fǎng)問(wèn)。

例子

可否訪(fǎng)問(wèn)

Admin.User.Name

Admin.User.name

Admin.user.Name

Admin.user.name

以上表格中Admin為外部類(lèi)型,User(user)為內(nèi)部類(lèi)型,Name(name)為字段,以此來(lái)更好的理解最后的總結(jié),當(dāng)然方法也適用這個(gè)表格。

創(chuàng)新互聯(lián)www.cdcxhl.cn,專(zhuān)業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開(kāi)啟,新人活動(dòng)云服務(wù)器買(mǎi)多久送多久。

當(dāng)前文章:Go語(yǔ)言之標(biāo)志符可見(jiàn)性-創(chuàng)新互聯(lián)
當(dāng)前地址:http://chinadenli.net/article2/decioc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開(kāi)發(fā)網(wǎng)站導(dǎo)航用戶(hù)體驗(yàn)建站公司標(biāo)簽優(yōu)化品牌網(wǎng)站制作

廣告

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

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)