《Go语言实战》笔记之第三章 ----包
原文地址:
http://www.niu12.com/article/10
####包
所有的.go 文件,除了空行和注释,都应该在第一行声明自己所属的包。
每个包都在一个单独的目录里。 不能把多个包放到同一个目录中,
也不能把同一个包的文件分拆到多个不同目录中。
这意味着,同一个目录下的所有.go 文件必须声明同一个包名。
并不需要所有包的名字都与别的包不同, 因为导入包时是使用全路径的,
所以可以区分同名的不同包
包被导入后会使用你的包名作为默认的名字,
不过这个导入后的名字可以修改。
这个特性在需要导入不同目录的同名包时很有用
import 语句告诉编译器到磁盘的哪里去找想要导入的包
eg:import f1 path1/file
eg:import f2 path2/file
import (
f1 path1/file
f2 path2/file
)
一旦编译器找到一个满足 import 语句的包,就停止进一步查找。
有一件重要的事需要记住,编译器会首先查找 Go 的安装目录,
然后才会按顺序查找 GOPATH 变量里列出的目录。
所有导入的包必须被使用,户可能需要导入一个包,但是不需要引用这个包的标识符。
在这种情况,可以使用空白标识符_来重命名这个导入,但是会执行该包的init()
main 包:Go 语言的编译程序会试图把这种名字的包编译为二进制可执行文件。
所有用 Go 语言编译的可执行程序都必须有一个名叫 main 的包。
当编译器发现某个包的名字为 main 时,
它一定也会发现名为 main()的函数, 否则不会创建可执行文件。
main()函数是程序的入口,所以,如果没有这个函数,程序就没有办法开始执行。
程序编译时,会使用声明 main 包的代码所在的目录的目录名作为二进制可执行文件的文件名。
最佳实践:
包名的惯例是使用包所在目录的名字,
应该使用简洁、清晰且全小写的名字,这有利于开发时频繁输入包名
####init函数
每个包可以包含任意多个init(),这些函数都会在程序执行开始的时候被调用
所有被编译器发现的 init 函数都会安排在 main 函数之前执行。
init()用在设置包、初始化变量或者其他要在程序运行前优先完成的引导工作
不能导入不使用的包,为此使用空白标识符重命名这个导入可以让 init
函数发现并被调度运行,让编译器不会因为包未被使用而产生错误
多个包的init的函数执行顺序与栈执行顺序一致:先进后出,先导后执行
####Go命令
go build . 命令会执行编译整个项目
go build fileName 命令会执行编译单个文件
go clean . 删除编译生成的可执行文件
go vet main.go 检测代码的常见错误
go fmt main.go 格式化代码
《Go语言实战》笔记之第三章 ----包的更多相关文章
- java并发编程实战笔记---(第三章)对象的共享
3.1 可见性 synchronized 不仅实现了原子性操作或者确定了临界区,而且确保内存可见性. *****必须在同步中才能保证:当一个线程修改了对象状态之后,另一个线程可以看到发生的状态变化. ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第三章:变换
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第三章:变换 学习目标 理解如何用矩阵表示线性变换和仿射变换: 学习在 ...
- 《Go语言圣经》阅读笔记:第三章基础数据类型
第三章 基础数据类型 Go语言将数据类型分为四类: 基础类型 数字 整数 浮点数 复数 字符串 布尔 复合类型 数据 结构体 引用类型 指针 切片 字典 函数 通道 接口类型 在此章节中先介绍基础类型 ...
- Kafka 权威指南阅读笔记(第三章,第四章)
Kafka 第三章,第四章阅读笔记 Kafka 发送消息有三种方式:不关心结果的,同步方式,异步方式. Kafka 的异常主要有两类:一种是可重试异常,一种是无需重试异常. 生产者的配置: acks ...
- Java语言程序设计(基础篇) 第三章 选择
第三章 选择 3.8 计算身体质量指数 package com.chapter3; import java.util.Scanner; public class ComputeAndInterpret ...
- 《Android群英传》读书笔记 (2) 第三章 控件架构与自定义控件详解 + 第四章 ListView使用技巧 + 第五章 Scroll分析
第三章 Android控件架构与自定义控件详解 1.Android控件架构下图是UI界面架构图,每个Activity都有一个Window对象,通常是由PhoneWindow类来实现的.PhoneWin ...
- JavaScript DOM编程艺术-学习笔记(第三章、第四章)
第三章: 1.js的对象分为三种:①用户自定义对象 ② 内建对象(js提供的对象) ③宿主对象(js寄宿的环境-浏览器,提供的对象) 2.文档是由节点组成的集合,即dom树,html元素是根元素,是唯 ...
- 《深入理解Java虚拟机》读书笔记(第三章)
垃圾收集器与内存分配策略(第三章) 前言,众所周知,Java是由c++进化而来,c++在内存需自己申请,自己释放,于是就有了Java的动态内存分配.书的第三章开篇,有这样一句话描述的很妙——Java与 ...
- Linux内核分析 读书笔记 (第三章)
第三章 进程管理 3.1 进程 1.进程: 进程就是处于执行期的程序. 进程就是正在执行的程序代码的实时结果. 进程是处于执行期的程序以及相关的资源的总称. 进程包括代码段和其他资源. 2.线程:执行 ...
随机推荐
- 使用Guava retryer优雅的实现接口重调机制
API 接口调用异常, 网络异常在我们日常开发中经常会遇到,这种情况下我们需要先重试几次调用才能将其标识为错误并在确认错误之后发送异常提醒.guava-retry可以灵活的实现这一功能.Guava r ...
- redis之(十一)redis实现缓存的功能
[一]redis实现缓存的原理 --->利用键的失效时间设置实现缓存技术 --->由于redis的内存有限,可以在redis的配置文件里设置maxmemory的参数.来限制redis最大可 ...
- umount.nfs: device is busy解决办法
fuser -km /app/nfs/ https://blog.csdn.net/x_i_y_u_e/article/details/42914817
- AC日记——双栈排序 洛谷 P1155
双栈排序 思路: 二分图染+模拟: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1005 #define ...
- LoadRunner运行中的mmdrv和mdrv
在LoadRunner运行脚本过程中,在任务管理器中我们可以看到有一个或多个名为“mmdrv”的进程在运行,与此同时当我们查看LoadRunner\bin目录下的文件时还会看到一个“mdrv.exe” ...
- HDU 5114 扩展欧几里得
题目大意:给你两个球的坐标 他们都往(1, 1)这个方向以相同的速度走,问你他们在哪个位置碰撞. 思路:这种题目需要把x方向和y方向分开来算周期,两个不同周期需要用扩展欧几里得来求第一次相遇. #in ...
- 洛谷P2587 [ZJOI2008] 泡泡堂
题目传送门 分析:一道策略游戏题,要求最大期望得分和最小期望得分.首先分析最大,很显然是可以用一种类似于田忌赛马的思维来做,将两队的实力按照从大到小(其实从小到大也可以)排序,然后就按照顺序比较,可能 ...
- 洛谷——P2082 区间覆盖(加强版)
P2082 区间覆盖(加强版) 题目描述 已知有N个区间,每个区间的范围是[si,ti],请求出区间覆盖后的总长. 输入输出格式 输入格式: N s1 t1 s2 t2 …… sn tn 输出格式: ...
- shell中的特殊变量
常见的特殊变量: $* 和 $@ 的区别: 1. 在这两个变量没有被双引号""引起来的时候,它们没有区别. 2. 在这两个变量被双引号""引起来的时候,&quo ...
- Cobol online program 传指针