Go語言使用exported name(匯出名稱)讓外部存取,也就是能被其他package程式呼叫。
Java是以存取修飾符(access modifiers)定義類別的成員是否可被外部存取,例如public
修飾可被其他package的類別存取,private
則僅限內部使用,這概念又稱為封裝(Encapsulation)。
Go則以開頭名稱的大小寫決定package內的特性是否能被外部存取:
大寫開頭(upper case, exported name)可被其他package存取,
小寫開頭(lower case, unexported name)限package內使用。
在「Golang 建立Go module」範例中greetings
package的Hello()
函式為大寫開頭,因此可被main
package的main.go
程式被呼叫。若在greeting.go
定義一個小寫開頭的函式hi()
,則此函式無法被其他package呼叫。
greeting.go
package greetings
func Hello(name string) string { // 大寫開頭 exported
message := "Hello " + name
return message
}
func hi(name string) string { // 小寫開頭 unexported
message := "Hi " + name
return message
}
在main.go
試著呼叫greetings.hi()
執行時會發生
cannot refer to unexported name greetings.hi
錯誤。
main.go
package main
import (
"fmt"
"abc.com/greetings"
)
func main() {
message := greetings.Hello("John")
fmt.Println(message)
message = greetings.hi("Mary") // cannot refer to unexported name greetings.hi
fmt.Println(message)
}
exported name可決定type能被其他package使用。例如在greeting.go
宣告一個Count
型態為int
type。
greeting.go
package greetings
type Count int // exported
...
在main.go
可正常使用greetings.Count
。
main.go
package main
import (
"fmt"
"abc.com/greetings"
)
func main() {
count := greetings.Count(1)
fmt.Println(count) // 1
...
}
若把Count
改為小寫count
則出現錯誤。
greeting.go
package greetings
type count int // unexported
...
main.go
package main
import (
"fmt"
"abc.com/greetings"
)
func main() {
count := greetings.count(1) // cannot refer to unexported name greetings.count
fmt.Println(count)
...
}
exported name也可以決定struct型別的屬性能被其他package存取。例如在greeting.go
宣告一個Person
struct type。
greeting.go
package greetings
...
type Person struct {
Name string // 大寫開頭 exported
Title string // 大寫開頭 exported
age int // 小寫開頭 unexported
}
...
在main.go
建立greetings.Person
時只能存取大寫開頭的屬性,存取小寫屬性會發生cannot refer to unexported field in struct literal
錯誤。
main.go
package main
import (
"fmt"
"abc.com/greetings"
)
func main() {
...
person := greetings.Person {
Name: "Dave",
Title: "Dr.",
age: 50, // cannot refer to unexported field 'age' in struct literal of type greetings.Person
}
...
}
沒有留言:
張貼留言