Go的標志符,這個翻譯覺得怪怪的,不過還是按這個起了標題,可以理解為Go的變量、類型、字段等。這里的可見性,也就是說那些方法、函數(shù)、類型或者變量字段的可見性。比如哪些方法不想讓另外一個包訪問,我們就可以把它們聲明為非公開的;如果需要被另外一個包訪問,就可以聲明為公開的,和Java語言里的作用域類似。

在Go語言中,沒有特別的關(guān)鍵字來聲明一個方法、函數(shù)或者類型是否為公開的,Go語言是以大小寫方式進行區(qū)分的。如果一個類型的名字是以大寫開頭,那么其他包就可以訪問;如果以小寫開頭,其他包就不能訪問。
package common type count int
package main
import (
"flysnow.org/hello/common"
"fmt"
)
func main() {
c:=common.count(10)
fmt.Println(c)
}這是一個定義在common包里的類型count,因為它的名字以小寫開頭,所以我們不能在其他包里使用它,否則就會報編譯錯誤。
./main.go:9: cannot refer to unexported name common.count
因為這個類型沒有被導出,如果我們改為大寫,就可以正常編譯運行了,大家可以自己試試。
現(xiàn)在這個類型沒有導出,不能使用,我們修改下例子,增加一個函數(shù),看看是否可行。
package common
type count int
func New(v int) count {
return count(v)
}func main() {
c:=common.New(100)
fmt.Println(c)
}這里我們在common包里定義了一個導出的函數(shù)New ,該函數(shù)返回一個count類型的值。New函數(shù)可以在其他包訪問,但是count類型不可以,現(xiàn)在我們在main包里調(diào)用這個New函數(shù),會發(fā)現(xiàn)是可以正常調(diào)用并且運行的。但是有個前提,必須使用:=這樣的操作符才可以,因為它可以推斷變量的類型。
這是一種非常好的能力。試想,我們在和其他人進行函數(shù)方法通信的時候,只需約定好接口就可以了,至于內(nèi)部實現(xiàn),使用方是看不到的,隱藏了實現(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()
}以上例子,我們對于函數(shù)間的通信,通過Loginer接口即可,在main函數(shù)中,使用者只需要返回一個Loginer接口,至于這個接口的實現(xiàn),使用者是不關(guān)心的。所以接口的設(shè)計者可以把defaultLogin類型設(shè)計為不可見,并讓它實現(xiàn)接口Loginer,這樣我們就隱藏了具體的實現(xiàn)。如果以后重構(gòu)這個defaultLogin類型的具體實現(xiàn),也不會影響外部的使用者,極為方便,這也就是面向接口的編程。
假如一個導出的結(jié)構(gòu)體類型里,有一個未導出的字段,會出現(xiàn)怎樣的問題。
type User struct {
Name string
email string
}當我們在其他包聲明和初始化User的時候,字段email是無法初始化的,因為它沒有導出,無法訪問。此外,一個導出的類型,包含了一個未導出的方法也一樣,也是無法訪問的。
我們再擴展,導出和未導出的類型相互嵌入,會有什么什么樣的發(fā)現(xiàn)?
type user struct {
Name string
}
type Admin struct {
user
}被嵌入的user是未導出的,但是它的外部類型Admin是導出的,所以外部可以聲明初始化Admin。
func main() {
var ad common.Admin
ad.Name="張三"
fmt.Println(ad)
}這里因為user是未導出的,所以我們不能再使用字面值直接初始化user了,所以只能先定義一個Admin類型的變量,再對Name字段初始化。這里Name可以訪問是因為它是導出的,在user嵌入到Admin中時,它已經(jīng)被提升為Admin的字段,所以它可以被訪問。
如果我們還想使用:=操作符怎么做呢?
ad:=common.Admin{}字面值初始化的時候什么都不做就好了,因為user未導出,所以我們不能直接使用字面值初始化Name字段。
還有要注意的是,因為user未導出,所以我們不能通過外部類型訪問內(nèi)部類型了,也就是說ad.user這樣的操作,都會編譯不通過。
最后,我們做個總結(jié),導出還是未導出,是通過名稱首字母的大小寫決定的,它們決定了是否可以訪問,也就是標志符的可見性。
對于.操作符的調(diào)用,比如調(diào)用類型的方法,包的函數(shù),類型的字段,外部類型訪問內(nèi)部類型等,我們要記住:.操作符前面的部分導出了,.操作符后面的部分才有可能被訪問;如果.前面的部分都沒有導出,那么即使.后面的部分是導出的,也無法訪問。
例子 | 可否訪問 |
|---|---|
Admin.User.Name | 是 |
Admin.User.name | 否 |
Admin.user.Name | 否 |
Admin.user.name | 否 |
以上表格中Admin為外部類型,User(user)為內(nèi)部類型,Name(name)為字段,以此來更好的理解最后的總結(jié),當然方法也適用這個表格。
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準確進行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。
當前文章:Go語言之標志符可見性-創(chuàng)新互聯(lián)
當前地址:http://www.chinadenli.net/article2/decioc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、網(wǎng)站導航、用戶體驗、建站公司、標簽優(yōu)化、品牌網(wǎng)站制作
聲明:本網(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)
猜你還喜歡下面的內(nèi)容