Go语言中跨包调用函数或引用变量
Nadeal2022年4月26日 15:45个人博客898
初学Go,这种操作的确让我惊艳。在以往学习的编程语言中,还没有遇到这样的操作。通过控制函数名的首字母、变量名的首字母就可以控制一个函数或变量的访问权限。与之前学习的Java略有不同。一开始,可能还不习惯,也不理解这样的好处。但是熟悉这门语言以后,发现用一个字来形容就是:爽~
变量名如果在函数内部定义,那么它就只在函数内部有效。如果这个变量名是在函数外部定义,那么将在当前包的所有文件中都可以访问,这是第一个要理解的。函数名或变量名的首字母的大小写决定了名字在包外的可见性。如果一个名字是大写字母 开头的(译注:必须是在函数外部定义的包级名字;包级函数名本身也是包级名字),那么它将是导出的,也就是说可以被外部的包访问。包本身的名字一般总是用小写字母。
那么,说到这里,就直接展示代码,看十遍不如手敲一遍,运行一遍。通过代码来理解编程,通过运行结果加深认知。
首先,创建一个简单的go项目,名为:PackagePro。在内部创建代码目录src、fruit、transportation。创建main.go文件,默认的包名就是main。fruit、transportation作为另外2个包,分别创建apple.go、car.go文件。整个项目结构如图所示。
代码如下:
main.go
package main
import (
"fmt"
"fruit"
"transportation"
_ "unsafe"
)
func main(){
fmt.Println("您好 世界 我是main函数 需要跨包访问函数和变量")
fruit.OfferApple()
fmt.Println("您好 世界 我是main函数 访问fruit包变量:" + fruit.Apple)
transportation.OfferCar()
}
apple.go
package fruit
import (
"fmt"
_ "unsafe"
)
var Apple string = "大写的Apple 变量名大写才能被外部引用"
var myApple string = "小写的首字母变量不能被外部引用"
func OfferApple(){
fmt.Println("回答: Apple.go 函数名首字母大写才能被外部调用")
}
car.go
package transportation
import (
"fmt"
_ "unsafe"
)
func OfferCar(){
fmt.Println("回答: car.go 函数首字母大写才能被外部调用")
}
func offerSelfCar(){
fmt.Println("回答: car.go 函数首字母小写不能被外部调用")
}
上述代码,运行结果如下:
当你试图跨包引用首字母小写的变量或者函数时,是无法引用的,IDE也不会给你这方面的提示。
很赞哦!
(
1
)