搞不懂Golang的Package?这一篇就够了!

263 阅读1分钟

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
}

image.png

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只被执行了一次,结果如下 image.png 定义两个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))
}

两个方法都被执行一次,结果如下 image.png

使用远程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")))
}

输出结果 image.png

本文章参考来自Go语言从入门到实战