手记

你好,Go


你好,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编程》一书

谢孟军 著

电子工业出版社出版

©著作权归作者所有:来自51CTO博客作者博文视点的原创作品,如需转载,请注明出处,否则将追究法律责任


0人推荐
随时随地看视频
慕课网APP