package的作用


       √ package是golang最基本的分发单位和工程管理中依赖关系的体现。

       √ 每个golang源代码文件开头都拥有一个package声明,表示该golang代码所属的package。

       √ 要生成golang可执行程序,必须建立一个名为main的package,并且在该package中必须包含一个名为main()的函数。

       √ 在golang工程中,同一个路径下只能存在一个package,一个package可以拆成多个源文件组成。

       √ import关键字导入的是package路径,而在源文件中使用package时,才需要package名。经常可见的import的目录名和源文件中使用的package名一致容易造成import关键字后即是package名的错觉,真正使用时,这两者可以不同。

 

• 《Go语言编程》中calc实例

▶ 工程目录

<calcproj>
           ├─<src>
                   ├─<calc>
                            ├─calc.go
                   ├─<simplemath>
                            ├─add.go
                            ├─add_test.go
                            ├─sqrt.go
                            ├─sqrt_test.go
           ├─<bin>
           ├─<pkg>

▶ 详细源码

       Δ add.go

package sm

func Add(a int, b int) int {
return a + b
}

       Δ sqrt.go

package sm

import "math"

func Sqrt(i int) int {
v := math.Sqrt(float64(i))
return int(v)
}

       Δ add_test.go

package sm

import "testing"

func TestAdd1(t *testing.T) {
r := Add(, ) if r != {
t.Errorf("Add(1, 2) failed. Got %d, expected 3.", r)
}
}

       Δ sqrt_test.go

package sm

import "testing"

func TestSqrt1(t *testing.T) {
v := Sqrt() if v != {
t.Errorf("Sqrt(16) failed. Got %v, expected 4.", v)
}
}

       Δ calc.go

package main

import "os"
import
"fmt"
import
"strconv"
import
"simplemath" var Usage = func() {
fmt.Println("USAGE: calc command [arguments] ...")
fmt.Println("\nThe commands are:\n\tadd\tAddition of two values.\n\tsqrt\tSquare root of a non-negative value.")
} func main() {
args := os.Args
if args == nil || len(args) < {
Usage()
return
} switch args[] {
case "add":
if len(args) != {
fmt.Println("USAGE: calc add <integer1> <integer2>")
return
} v1, err1 := strconv.Atoi(args[])
v2, err2 := strconv.Atoi(args[])
if err1 != nil || err2 != nil {
fmt.Println("USAGE: calc add <integer1> <integer2>")
return
} ret := sm.Add(v1, v2)
fmt.Println("Result: ", ret)
case "sqrt":
if len(args) != {
fmt.Println("USAGE: calc sqrt <integer>")
return
} v, err := strconv.Atoi(args[])
if err != nil {
fmt.Println("USAGE: calc sqrt <integer>")
return
} ret := sm.Sqrt(v)
fmt.Println("Result: ", ret)
default:
Usage()
}
}

▶ 源码说明

calcproj工程中src\simplemath目录下只存在sm一个package,而sm包由四个源文件构成。calc.go文件中可以看到import导入的是simplemath而非sm,而在使用sm包中的Add和Sqrt函数时,使用的才是真正的包名sm。

import关键字


 使用import语句导入源代码文件所依赖的package路径

       √ 不得导入源代码文件中没有用到的package,否则golang编译器会报编译错误。

• import语法

▶ 风格一

import "package1"
import
"package2"
import
"package3"
...

▶ 风格二

import (
"package1"
"package2"
"package3"
...
)

• import原理

如果编译时main包导入了其他的包,那么这些包将被依次导入。

当一个包被导入时,如果该包还导入了其它的包,那么先将其他的包导入进来,然后再对该包的包级常量和变量进行初始化,最后执行init函数(如果存在)。包的导入如上图所示,是一个递归地过程,等所有被导入的包加载完毕,就会对main包中的包级常量和变量进行初始化,然后执行main包中的init函数(如果存在),最后执行main函数。

如果一个包被多个包同时导入,那么它只会被导入一次。

• import修饰操作

• 点(.)操作

点(.)操作的含义是:点(.)标识的包导入后,调用该包中函数时可以省略前缀包名。点(.)操作的语法为:

import . "package1"
import .
"package2"
import .
"package3"
...
import (
. "package1"
. "package2"
. "package3"
...
)

下面的示例中,fmt包将使用点操作省略前缀包名,os包用法保持不变:

package main

import (
. "fmt"
"os"
) func main() {
for _, value := range os.Args {
Println(value)
}
}

• 别名操作

别名操作的含义是:将导入的包命名为另一个容易记忆的别名。别名操作的语法为:

import p1 "package1"
import
p2 "package2"
import
p3 "package3"
...
import (
p1 "package1"
p2 "package2"
p3 "package3"
...
)

下面的示例中,fmt包将使用别名操作重新命名为f,os包用法保持不变:

package main

import (
f "fmt"
"os"
) func main() {
for _, value := range os.Args {
f.Println(value)
}
}

• 下划线(_)操作

下划线(_)操作的含义是:导入该包,但不导入整个包,而是执行该包中的init函数,因此无法通过包名来调用包中的其他函数。使用下划线(_)操作往往是为了注册包里的引擎,让外部可以方便地使用。下划线(_)操作的语法为:

import _ "package1"
import
_ "package2"
import
_ "package3"
...
import (
_ "package1"
_ "package2"
_ "package3"
...
)

[golang note] 包和导入的更多相关文章

  1. 3.Golang的包导入

    1.golang的源码文件可以随意命名,但是属于同一个包的源文件必须声明 package base 2.golang的包引入规则 import ( "fmt" #系统包直接写名字 ...

  2. Golang Vendor 包管理工具 glide 使用教程

    Glide 是 Golang 的 Vendor 包管理器,方便你管理 vendor 和 verdor 包.类似 Java 的 Maven,PHP 的 Composer. Github:https:// ...

  3. Golang测试包

    Golang测试包 golang自带了测试包(testing),直接可以进行单元测试.性能分析.输出结果验证等.简单看着官方文档试了试,总结一下: 目录结构和命令 使用golang的测试包,需要遵循简 ...

  4. golang的包规则

    1.包声明:文件所在目录,有利于源码整体迁移. 2.包导入:4种方式. ---------------------------------------------------------------- ...

  5. python模块与包的导入

    1. 模块与包的区别 模块,即module,一个包含python语句的.py文件就是一个模块!每个源代码文件都会自动成为模块!没有额外的语法用来声明模块. 包,又称模块包,即module packag ...

  6. 01Spring_基本jia包的导入andSpring的整体架构and怎么加入日志功能

    1.什么是Spring : v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:u ...

  7. python中的模块,以及包的导入的总结

    模块导入的方式: 模块的概念:一个.py文件就称为一个模块 导入模块中函数的方式: 方式一:import  模块名 使用时:模块名.函数名() 方式二 :from 模块名 import  函数名 使用 ...

  8. Golang fmt包使用小技巧

    h1 { margin-top: 0.6cm; margin-bottom: 0.58cm; direction: ltr; color: #000000; line-height: 200%; te ...

  9. 【Python3之模块及包的导入】

    一.模块导入 1.定义 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python ...

随机推荐

  1. 从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射

    从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射.Collection 接口又有 3 ...

  2. Cocos2d-X中的Slider控件

    Slider控件事实上就是滑块控件.经常使用于音乐中的音量控制,在Windows编程中开发音乐播放器就须要用到滑块控件控制音量 首先在project文件夹下的Resource文件夹中放 在Skider ...

  3. 微软向开源又迈进了一大步:Checked C

    导读 微软开源了 Checked C ,这是一个 C 语言的扩展版本,可以用于解决 C 语言中的一系列安全相关的隐患.正如其名字所示,Checked C 为 C 语言增加了检查,这个检查可以帮助开发者 ...

  4. 递归删除资源树 Ztree

    前言 最近项目里有这么一个需求:现在有一个用Ztree编写的资源树,当删除资源树的某个节点时,则将此节点下面的所有节点全部删除,这里显然就用到了递归:若此节点被删除后无其它的兄弟节点了,我们还需要将其 ...

  5. poj_2479 动态规划

    题目大意 给定一列数,从中选择两个不相交的连续子段,求这两个连续子段和的最大值. 题目分析 典型的M子段和的问题,使用动态规划的方法来解决. f[i][j] 表示将A[1...i] 划分为j个不相交连 ...

  6. ios 更改UITableview group形式 两个section之间的距离

    -(CGFloat)tableView:(UITableView*)tableView heightForHeaderInSection:(NSInteger)section { return 1.0 ...

  7. mysql支持跨表删除多条记录

    在Mysql4.0之后,mysql开始支持跨表delete. Mysql可以在一个sql语句中同时删除多表记录,也可以根据多个表之间的关系来删除某一个表中的记录. 假定我们有两张表:Product表和 ...

  8. [LintCode] 最多有多少个点在一条直线上

    /** * Definition for a point. * struct Point { * int x; * int y; * Point() : x(0), y(0) {} * Point(i ...

  9. 利用CSS3制作淡入淡出动画效果

    CSS3新增动画属性“@-webkit-keyframes”,从字面就可以看出其含义——关键帧,这与Flash中的含义一致. 利用CSS3制作动画效果其原理与Flash一样,我们需要定义关键帧处的状态 ...

  10. 170403、java 版cookie操作工具类

    package com.rick.utils; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; imp ...