go包的导入

1 首先配置Go环境

export $GOPATH=$HOME/go_learn

2 这里创建一个华与摄氏度的温度转换包,源文件有两个,一个是相关常量,类型声明,一个是转换方法

tempconv.go

package tempconv
import "fmt"
type Cels float64
type Fahr float64
const (
	AbZeroC Cels = -273.15
	FreeC Cels = 0
	BoilingC Cels =100
)
func (c Cels) String() string {
	return fmt.Sprintf("%g°C", c) 
}
func (f Fahr) String() string {
	return fmt.Sprintf("%g°F", f)    
}

conv.go

//
package tempconv
func Ctof(c Cels) Fahr {
	return Fahr(c*9/5 +32)    
}
func Ftoc(f Fahr) Cels {
	return Cels((f - 32)*5/9)    
}//首字母大写否则不能包级分享

3 在$GOPATH/src/cha2目录下创建一个包

mkdir tempconv

将这两个文件放入$GOPATH/src/cha2/tempconv中,这就是包的所在目录,通常一个包所在目录路径的后缀是包的导入路径,则调用时其导入路径为cha2/tempconv

注意包级别的常量名和函数等都是以大写字母开头,它们才可以像tempconv.AbZeroC这样被外部代码访问。

除了包的导入路径,每个包还有一个包名,包名一般是短小的名字(并不要求包名是唯一的),包名在包的声明处指定。按照惯例,一个包的名字和包的导入路径的最后一个字段相同,故这里是tempconv。

4 调用,创建test_tempconv.go

//
package main
import (
	"fmt"
	"cha2/tempconv"
	"os"
	"strconv"
)
func main() {
	for _, arg := range os.Args[1:] {
	    t, err := strconv.ParseFloat(arg, 64)//par to float64
	    if err !=nil {
	    	fmt.Fprintf(os.Stderr, "temp par err: %v\n", err)
		os.Exit(1)
	    }
	    f := tempconv.Fahr(t)//to Fahr
	    c := tempconv.Cels(t)//to Cels
	    fmt.Printf("f %s= %s; c %s=%s\n", f,
	    		tempconv.Ftoc(f), c, tempconv.Ctof(c),
			)
	}
}

5 结果

go run test_temconv.go 212
f 212°F= 100°C; c 212°C=413.6°F

6 包的初始化

在解决包的依赖后,包的初始化是从低到上顺序,也就是如果p包导入了q包,则当p包初始化时,q包已经完成初始化,所以很明显Main包最后才完成初始。这样也保证了当main函数执行时相关包都已经初始化完毕,

你可能感兴趣的:(go)