14 -包和文件的关系

08 - 程序结构中初步的介绍了 go 语言和包的结构, 接下来我们将会更加详细的介绍包和文件之间的恩爱情仇

一、包

GO 语言当中的包和其他语言的库或者模块很类似,都是为了支持模块化、封装、单独编译和代码重用。
package的使用原则:

  • 一个包的源代码在一个或者多个以 .go 为后缀名的源文件当中. 例如 包 gopl/ch2/tempconv对应的路径就是 $GOPATH/src/gopl/ch2/tempconv;
  • 因为每一个包必须对应一个独立的空间 ( 通俗的理解,就是每一个包必须有一个独立的路径,并且那个路径下的最后的子目录就是必须包名(这里之所以用必须,是从我 go 语言的编程习惯来说,不喜勿喷) )。
  • 除了包的导入路径,每个包还有一个包名,包名一般是短小的名字(并不要求包名是唯一的),包名在包的声明处指定。按照惯例,一个包的名字和包的导入路径的最后一个字段相同
  • 包还可以让我们通过控制哪些名字是外部可见的来隐藏内部实现信息。但在 go 语言中就是一个简单的规则:如果一个函数或者变量的名字是大写字母开头的,那么该名字是导出的

示例:为了方便理解,我做了一个包的示例
// tempconv.go

package tempconv

import "fmt"

type Celsius float64    // 摄氏温度
type Fahrenheit float64 // 华氏温度

const (
    AbsoluteZeroC Celsius = -273.15 // 绝对零度
    FreezingC     Celsius = 0       // 结冰点温度
    BoilingC      Celsius = 100     // 沸水温度
)

// conv.go

package tempconv

func CToF(c Celsius) Fahrenheit {
    return Fahrenheit(c * 9 / 5 + 32)
}

func FToC(f Fahrenheit) Celsius {
    return Celsius((f - 32) * 5 / 9)
}

包的路径:

$GOPATH/src/gopl/ch2/tempconv

分析:
每个源文件都以包的声明语句开始,用来指名包的名字。当包被导入的时候,包内的成员将通过类似tempconv.CToF的形式访问。

二、导入包

在 go 语言中,每个包的路径是全局唯一的。如包 gopl/ch2/tempconv 全局唯一的路径就是 $GOPATH/src/gopl/ch2/tempconv , 每个导入路径下面可以有多个 xx.go 文件, 这样可以更加使结构清晰

package main

import (
    "fmt"
    "os"
    "strconv"

    "gopl/ch2/tempconv"
)

func main() {
    for _, arg := range os.Args[1:] {
        t, err := strconv.ParseFloat(arg, 64)
        if err != nil {
            fmt.Fprintf(os.Stderr, "cf: %v\n", err)
            os.Exit(1)
        }

        f := tempconv.Fahrenheit(t)
        c := tempconv.Celsius(t)
        fmt.Printf("%s = %s, %s = %s\n", f, tempconv.FToC(f), c, tempconv.CToF(c))
    }
}

运行路径:

$GOPATH/src/gopl/ch2/cf

运行命令:

$ go run cf.go 32 212 -40

运行结果:
在这里插入图片描述

总结

  • 理解包和文件之间 的关系
  • 包名字内外可见性的原则

你可能感兴趣的:(Golang)