在 Go 中,应用程序是按包来组织的。 一个包就是位于同一个文件夹中的一组源文件。 同一个文件夹中的所有源文件,都必须在文件顶部声明相同的包名。 按照惯例,包的名称与其所在的文件夹名称相同。
package greeting
Go 提供了内容丰富的标准库,你可以用import关键字把这些包引入到自己的程序里。
标准库中的包通过它们各自的名称来导入。
package greeting
import "fmt"
导入之后,就可以通过包名来使用这个包:
world := "World"
fmt.Sprintf("Hello %s", world)
一个条目能否被其他包中的代码调用,取决于它在 Go 中的声明方式。 要让函数、类型、变量、常量或结构体字段对外可见(称为_导出_),名称必须以大写字母开头。
package greeting
// Hello is a public function (callable from other packages).
func Hello(name string) string {
return "Hello " + name
}
// hello is a private function (not callable from other packages).
func hello(name string) string {
return "Hello " + name
}
Go 内置了一个名为fmt的包(格式化包),它提供了各种函数来操作输入和输出的格式。
最常用的函数是Sprintf,它使用%s这类动词把值插值到字符串中,并返回这个字符串。
import "fmt"
food := "taco"
fmt.Sprintf("Bring me a %s", food)
// Returns: Bring me a taco
在 Go 中,浮点数可以方便地用 Sprintf 的动词来格式化:%g(紧凑表示)、%e(指数)或%f(非指数)。
这三个动词都可以控制字段的宽度和精度。
import "fmt"
number := 4.3242
fmt.Sprintf("%.2f", number)
// Returns: 4.32
你可以在格式化包文档中找到可用动词的完整列表。
fmt还包含其他处理字符串的函数,比如Println,它只是把接收到的实参打印到控制台;还有Printf,它会先像Sprintf那样格式化输入,再打印出来。
从前,有一位古怪的程序员,住在一座装着铁栅栏窗户的奇怪房子里。一天,他从一个在线招聘网站上接下一份工作:做一个派对机器人。这个机器人应该负责迎接客人,并把他们领到座位上。第一版做得非常技术化,暴露出这位程序员不擅长与人打交道。其中有些毛病也延续到了下一版。
实现Welcome函数,用给定的名字返回一条欢迎信息:
Welcome("Christiane")
// => Welcome to my party, Christiane!
实现HappyBirthday函数,根据这个人的名字和年龄返回一条生日祝福信息。
遗憾的是,这位程序员有点爱炫耀,所以机器人必须展示出它知道每位客人的生日。
HappyBirthday("Frank", 58)
// => Happy birthday Frank! You are now 58 years old!
实现AssignTable函数来指路。
它应该接受 5 个形参。
string)int)string)string)float64)确切的结果格式见下面的示例。
机器人会以 3 位数字的格式给出桌号。 如果数字不足 3 位,就会在前面补零,凑成 3 位(例如 3 变成 003)。 机器人还会提到桌子的距离。 幸运的是,精度只保留 1 位小数。
AssignTable("Christiane", 27, "Frank", "on the left", 23.7834298)
// =>
// Welcome to my party, Christiane!
// You have been assigned to table 027. Your table is on the left, exactly 23.8 meters from here.
// You will be sitting next to Frank.