你好,Go
Go语言是一门类似C语言的编译型语言,它的编译速度非常快。这门语言的关键字一共25个,比所有英文字母还少一个,这对于我们的学习来说非常有利。先让我们看一看这些关键字都长什么样。
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
本章中,笔者将带领你去学习Go语言的基础。通过每一小节的介绍,你将发现,Go语言的世界是多么简洁,设计是如此美妙,编写Go语言将会是一件愉快的事情。等回过头来,你就会发现这25个关键字是多么亲切。
在开始编写应用之前,我们先从最基本的程序开始。就像你造房子之前不知道什么是地基一样,编写程序也不知道如何开始。因此,在本节中,我们要学习用最基本的语法让Go语言程序运行起来。
程序
这就像一个传统,在学习大部分语言之前,你先学会如何编写一个可以输出Hello World的程序。
准备好了吗?让我们开始吧!
package main
import "fmt"
func main() {
fmt.Printf("Hello, world or 你好,世界 or καλημ ́ρα κóσμor こんにちは世界\n")
}
输出如下。
Hello, world or 你好,世界 or καλημ ́ρα κóσμor こんにちは世界
详解
首先我们要了解一个概念,Go语言程序是通过package来组织的。
package <pkgName>(在我们的例子中是package main)这一行告诉我们当前文件属于哪个包,而包名main则告诉我们它是一个可独立运行的包,它在编译后会产生可执行文件。除了main包之外,其他 的包最后都会生成*.a文件(也就是包文件),并放置在$GOPATH/pkg/$GOOS_$GOARCH中(以Mac为例就是$GOPATH/pkg /darwin_amd64)。
每一个可独立运行的Go语言程序,必定包含一个package main,在这个main包中必定包含一个入口函数main,而这个函数既没有参数,也没有返回值。
为了打印Hello, World...,我们调用了一个函数Printf,这个函数来自于fmt包,所以我们在第三行中导入了系统级别的fmt包:import"fmt"。
包的概念和Python中的module相同,它们都有一些特别的好处:模块化(能够把程序分成多个模块)和可重用性(每个模块都能被其他应用程序反复使用)。我们在这里只是先了解一下包的概念,后面我们将会编写自己的包。
在第五行,我们通过关键字func定义了一个main函数,函数体被放在{}中,就像我们平时写C、C++或Java时一样。大家可以看到main函数是没有任何参数的,我们接下来就学习如何编写带参数的、返回0个或多个值的函数。
第六行,我们调用了fmt包里面定义的函数Printf。大家可以看到,这个函数通过<pkgName>.<funcName>的方式调用,这一点和Python十分相似。
前面提到过,包名和包所在的文件夹名可以是不同的,此处的<pkgName>即为通过package<pkgName>声明的包名,而非文件夹名。
最后大家可以看到我们输出的内容里面包含了很多非ASCII码字符。实际上,Go语言是天生支持UTF-8的,任何字符都可以直接输出,你甚至可以用UTF-8中的任何字符作为标识符。
小结
Go 语言使用package(和Python的模块类似)来组织代码。main.main()函数(这个函数主要位于主包)是每一个独立的可运行程序的入口 点。Go语言使用UTF-8字符串和标识符(因为UTF-8的发明者也就是Go语言的发明者),所以它天生就具有多语言的支持。
Go语言基础
定义变量
Go语言里面定义变量有多种方式。
使用var关键字是Go语言最基本的定义变量方式,与C语言不同的是Go语言把变量类型放在变量名后面,如下所示。
//定义一个名称为“variableName”,类型为"type"的变量
var variableName type
定义多个变量。
//定义三个类型都是“type”的三个变量
var vname1, vname2,vname3 type
定义变量并初始化值。
//初始化“variableName”的变量为“value”值,类型是“type”
var variableName type= value
同时初始化多个变量。
/*
定义三个类型都是"type"的三个变量,并且它们分别初始化相应的值
vname1为v1,vname2为v2,vname3为v3
*/
var vname1, vname2, vname3 type= v1, v2, v3
你是不是觉得上面这样的定义有点繁琐?没关系,因为Go语言的设计者也发现了,有一种写法可以让它变得简单一点。我们可以直接忽略类型声明,那么上面的代码变成如下所示。
/*
定义三个变量,它们分别初始化相应的值
vname1为v1,vname2为v2,vname3为v3
然后Go会根据其相应值的类型来帮你初始化它们
*/
var vname1, vname2, vname3 = v1, v2, v3
你觉得上面的还是有些繁琐?好吧,让我们继续简化。
/*
定义三个变量,它们分别初始化相应的值
vname1为v1,vname2为v2,vname3为v3
编译器会根据初始化的值自动推导出相应的类型
*/
vname1, vname2, vname3 := v1, v2, v3
现在是不是看上去非常简洁了“?:=”这个符号直接取代了var和type,这种形式叫做简短声明。不过它有一个限制,那就是它只能用在函数内部;在函数外部使用则会无法编译通过,所以一般用var方式来定义全局变量。
_(下画线)是个特殊的变量名,任何赋予它的值都会被丢弃。在这个例子中,我们将值35赋予b,并同时丢弃34。
_, b := 34, 35
Go语言对于已声明但未使用的变量会在编译阶段报错,比如下面的代码就会产生一个错误:声明了i但未使用。
package main
func main() {
var i int
}
常量
所谓常量,也就是在程序编译阶段就确定下来的值,而程序在运行时则无法改变该值。在Go语言程序中,常量可定义为数值、布尔值或字符串等类型。
它的语法如下。
const constantName =value
//如果需要,也可以明确指定常量的类型:
const Pi float32 =3.1415926
以下是一些常量声明的例子。
const Pi = 3.1415926
const i = 10000
const MaxThread = 10
const prefix = "astaxie_"
本文节选自《Go Web编程》一书
谢孟军 著
电子工业出版社出版