1. 程式人生 > 其它 >《Go語言實戰》讀書筆記——公開或未公開的識別符號

《Go語言實戰》讀書筆記——公開或未公開的識別符號

技術標籤:Golanggo語言gogolang程式語言

一、包裡未公開的識別符號

Go語言支援從包裡公開或者隱藏識別符號。通過這個功能,讓使用者能按照自己的規則控制識別符號的可見性。

這個就類似於Java當中的許可權修飾符private、public,只是golang當中是使用對變數名首字母大小寫來控制其的可訪問性。

package counters

type alertCounter int
package main

import (
	"fmt"
	"counters"
)

// main 是應用程式的入口
func main() {
	// 建立一個未公開的型別的變數
	// 並將其初始化為 10
	counter := counters.alertCounter(10)

	fmt.Printf("Counter: %d\n", counter)
}

上述的程式碼會執行錯誤

只要將自定義型別的首字母改成大寫就可以正常初始化了

或者我們可以使用一個工廠函式對其進行初始化

package counters

type alertCounter int

func New(value int) alertCounter{
	return alertCounter(value)
}
package main

import (
	"fmt"
	"counters"
)

// main 是應用程式的入口
func main() {
	// 建立一個未公開的型別的變數
	// 並將其初始化為 10
	counter := counters.New(10)

	fmt.Printf("Counter: %d\n", counter)
}

二、結構裡的不可見欄位

package entities

// User 在程式裡定義一個使用者型別
type User struct {
	Name string
	email string
}
package main

import (
	"fmt"
	"entities"
)

 // main 是應用程式的入口
func main() {
 	// 建立 entities 包中的 User 型別的值
 	u := entities.User{
 		Name: "Bill",
 		email: "[email protected]
", } // ./example69.go:16: 結構字面量中結構 entities.User // 的欄位’email’未知 fmt.Printf("User: %v\n", u) }

上述例子只需要將email改成首字母大寫即可

三、公開和未公開的內嵌型別

package entities

// user 在程式裡定義一個使用者型別
type user struct {
	Name string
	Email string
}

// Admin 在程式裡定義了管理員
type Admin struct {
	user // 嵌入的型別是未公開的
	Rights int
}
package main

import (
	"fmt"
	"entities"
)

// main 是應用程式的入口
func main() {
	// 建立 entities 包中的 Admin 型別的值
	a := entities.Admin{
		Rights: 10,
	}
	// 設定未公開的內部型別的
	// 公開欄位的值
	a.Name = "Bill"
	a.Email = "[email protected]"
	fmt.Printf("User: %v\n", a)
}

由於內部型別 user 是未公開的,這段程式碼無法直接通過結構字面量的方式初始化該內部型別。不過,即便內部型別是未公開的,內部型別裡宣告的欄位依舊是公開的。既然內部型別的識別符號提升到了外部型別,這些公開的欄位也可以通過外部型別的欄位的值來訪問。