[golang note] 包和导入
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] 包和导入的更多相关文章
- 3.Golang的包导入
1.golang的源码文件可以随意命名,但是属于同一个包的源文件必须声明 package base 2.golang的包引入规则 import ( "fmt" #系统包直接写名字 ...
- Golang Vendor 包管理工具 glide 使用教程
Glide 是 Golang 的 Vendor 包管理器,方便你管理 vendor 和 verdor 包.类似 Java 的 Maven,PHP 的 Composer. Github:https:// ...
- Golang测试包
Golang测试包 golang自带了测试包(testing),直接可以进行单元测试.性能分析.输出结果验证等.简单看着官方文档试了试,总结一下: 目录结构和命令 使用golang的测试包,需要遵循简 ...
- golang的包规则
1.包声明:文件所在目录,有利于源码整体迁移. 2.包导入:4种方式. ---------------------------------------------------------------- ...
- python模块与包的导入
1. 模块与包的区别 模块,即module,一个包含python语句的.py文件就是一个模块!每个源代码文件都会自动成为模块!没有额外的语法用来声明模块. 包,又称模块包,即module packag ...
- 01Spring_基本jia包的导入andSpring的整体架构and怎么加入日志功能
1.什么是Spring : v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:u ...
- python中的模块,以及包的导入的总结
模块导入的方式: 模块的概念:一个.py文件就称为一个模块 导入模块中函数的方式: 方式一:import 模块名 使用时:模块名.函数名() 方式二 :from 模块名 import 函数名 使用 ...
- Golang fmt包使用小技巧
h1 { margin-top: 0.6cm; margin-bottom: 0.58cm; direction: ltr; color: #000000; line-height: 200%; te ...
- 【Python3之模块及包的导入】
一.模块导入 1.定义 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python ...
随机推荐
- 基于Unity5的TPS整理
1.游戏管理器 游戏管理器负责管理游戏的整体流程,还可以系统管理用于游戏的全局数据以及游戏中判断胜败的条件.游戏管理器并不是单一的模块,更像是能控制游戏的功能集合.1)怪兽出现逻辑:专门设置一些位置用 ...
- js math atan2
在双十二活动中,视觉要求实现一个鼠标跟随运动的的效果,就像“觉”的那个效果类似 其实原理很简单,看鼠标从哪个方向进的及从哪个方向出的,然后区块里绝对定位的浮层就可以根据鼠标方向 运动; 如:在鼠标进入 ...
- 如何在ChemDraw中输入℃温度符号
化学反应常常对于温度是有一定要求的,所以用ChemDraw化学绘图工具在绘制化学反应的时候常常会用到℃温度符号.但是一些才接触ChemDraw的用户朋友不知道怎么输入℃.针对这种情况本教程来给大家分享 ...
- 编程之美 set 1 不要被阶乘吓倒
总结 1. 使用加法解决指数问题时, 可用背包问题的变形 2. 题目用到的公式和求解 1~N 中 1 出现的次数的公式类似 题目 1. 给定一个整数 N, 那么 N 的阶乘 N! 末尾有多少个 0 呢 ...
- 构建API
前言 过程,如图: 第一步创建一个帮助类,类里面提供了加密.组装Url等方法,代码如下: using System; using System.Collections.Generic; using S ...
- Android TextView使用HTML处理字体样式、显示图片等
一般情况下,TextView中的文本都是一个样式.那么如何对于TextView中各个部分的文本来设置字体,大小,颜色,样式,以及超级链接等属性呢?下面我们通过SpannableString的具体实例操 ...
- 后端程序员如何玩转AJAX
1.原生的Ajax入门 (感觉很是繁琐,所以一般我们都是用简单的方式) 创建一个核心对象 XMLHttpRequest var xmlhttp; if (window.XMLHttpRequest) ...
- 在 Java 应用程序中绑定 Bean 和数据
本指南介绍了 NetBeans IDE 对 Java 应用程序中 Bean 绑定和数据绑定的支持. 要学完本教程,您需要具备以下软件和资源. 软件或资源 要求的版本 NetBeans IDE 版本 7 ...
- 用wamp实现前端和php的交互效果
我们今天来用php来做一下前台与后台的交互效果,首先我们先打开这个软件. 看一下电脑右下角的小图标 当变成之后鼠标左键 打开这个之后点击第二个之后会打开一个网站 点击右面页面的数据库打开新建数据库,填 ...
- gdb常见命令(未完,待续)
// 编译文件时,带参-g > gcc -g test.c // 进入gdb调试界面 > gdb a.out 或者 > gdb > file a.out // 查看文件内容 & ...