速战速决 go - go 面向对象: 包

速战速决 go https://github.com/webabcd/GoSample
作者 webabcd

速战速决 go - go 面向对象: 包

示例如下:

oop/package1.go

// 设置当前文件的包名,只需要指定当前文件夹的名称即可,不用写全名
package oop

// go 可以导入内置包(GOROOT 路径)和第三方包(GOPATH 路径)和自定义包(你自己的路径)
// go 的可见性控制:
//    1、如果定义的常量、变量、类型、接口、接口中的方法,结构体、结构体中的成员、函数等的名称是大写字母开头,则表示能被其它包访问或调用,非大写字母开头就只能在包内使用
//    2、同包名下互相可见所以不能重名

/*
// 单行导入
import "fmt"
// 然后就可以通过导入的包名使用这个包下的东西了
fmt.Println("xxx")
*/

/*
// 多行导入
import (
	"fmt"
	"math"
)
*/

/*
// 为导入的包指定别名
import F "fmt"
// 然后就可以通过别名使用这个包下的东西了
F.Println("xxx")
*/

/*
// 以合并的方式导入包
import . "fmt"
// 然后就可以直接使用这个包下的东西了
Println("xxx")
*/

// 导入包时要写全路径
// 导入包时,会先调用包中的文件的 init 方法
// 如果 a 导入了 b,b 导入了 c,则先调用 c 中文件的 init 方法,再调用 b 中文件的 init 方法,最后调用 c 中文件的 init 方法
// 如果同包有多个文件都有 init 方法,则他们的调用顺序不定
import (
	// _ 的意思就是你无法使用这个包(但是会调用这个包中的文件的 init 方法)
	_ "GoSample/oop/pkg1"
	// 注:因为当前包引用了 GoSample/oop/pkg1,而 GoSample/oop/pkg1 引用了 GoSample/oop/pkg1/pkg2,所以当前包如果被引用后则会打印
	// pkg2 init
	// pkg1 init
)

func Package1Sample() {

}

oop/pkg1/go.go

package pkg1

import (
	// _ 的意思就是你无法使用这个包(但是会调用这个包中的文件的 init 方法)
	_ "GoSample/oop/pkg1/pkg2"
	"fmt"
)

func init() {
	fmt.Println("pkg1 init")
}

oop/pkg1/pkg2/go.go

package pkg2

import "fmt"

func init() {
	fmt.Println("pkg2 init")
}

速战速决 go https://github.com/webabcd/GoSample
作者 webabcd

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章