package
- 基本复用模块单元:方法以首字母大写表明可以被外部代码访问
- 代码的package可以和所在的目录不一致
- 同一目录里的Go代码的package要保持一致
package series
// 方法名小写,代表不能被外部访问
func square(n int) int {
return n * n
}
// 方法名大写,表明可以被外部访问
func GetFibonacciSeries(n int) []int {
ret := []int{1, 1}
for i := 2; i <= n; i++ {
ret[i] = ret[i-1] + ret[i-2]
}
return ret
}
init方法
- 在main被执行前,所有依赖的package的init方法都会被执行
- 不同包的init函数按照包导入的依赖关系决定执行顺序
- 每个包可以有多个init函数
- 包的每个源文件也可以有多个init函数,这点比较特殊
package series
import "fmt"
//定义一个init方法
func init() {
fmt.Println("init1")
}
func Square(n int) int {
return n * n
}
// 方法名大写,表明可以被外部访问
func GetFibonacciSeries(n int) []int {
ret := []int{1, 1}
for i := 2; i <= n; i++ {
ret = append(ret, ret[i-1]+ret[i-2])
}
return ret
}
package client
import (
"awesomeProject/src/demo/series"
"testing"
)
func TestPackage(t *testing.T) {
t.Log(series.GetFibonacciSeries(5))
t.Log(series.Square(5))
}
package中的方法被调用了两次,但是init只被执行了一次,结果如下
定义两个init方法,方法同名,但是不报错
package series
import "fmt"
// 定义一个init方法
func init() {
fmt.Println("init1")
}
// 定义一个init方法
func init() {
fmt.Println("init2")
}
func Square(n int) int {
return n * n
}
// 方法名大写,表明可以被外部访问
func GetFibonacciSeries(n int) []int {
ret := []int{1, 1}
for i := 2; i <= n; i++ {
ret = append(ret, ret[i-1]+ret[i-2])
}
return ret
}
package client
import (
"awesomeProject/src/demo/series"
"testing"
)
func TestPackage(t *testing.T) {
t.Log(series.GetFibonacciSeries(5))
t.Log(series.Square(5))
t.Log(series.GetFibonacciSeries(5))
t.Log(series.Square(5))
}
两个方法都被执行一次,结果如下
使用远程Package
- 通过
go get来获取远程依赖:go get -u强制从网络更新远程依赖 - 注意代码在GitHub上的组织形式,以适应
go get:直接以代码路径开始,不要有src
命令行输入: go get -u github.com/easierway/concurrent_map
测试远程Package是否能够使用
package demo2
import "testing"
//导入Package
import cm "github.com/easierway/concurrent_map"
func TestConcurrentMap(t *testing.T) {
m := cm.CreateConcurrentMap(99)
m.Set(cm.StrKey("key"), 10)
t.Log(m.Get(cm.StrKey("key")))
}
输出结果
本文章参考来自Go语言从入门到实战