golang 从安装到 hello world -- 循环判断与分支

2019-10-05 21:06:57   最后更新: 2019-10-14 09:09:56   访问数量:27




伴随着机器学习在全球范围的热潮,Python 以其丰富的机器学习算法库以及极度的简单易用登上了 IEEE 编程排名的第一把交椅

但是,面对国内动辄百万级 QPS 的服务端来说,Python 显露出了其性能上的巨大不足,由于 GIL 锁的存在难以实现真正意义上的多线程并发,只能使用单核 CPU 的特性无法发挥出机器的性能

那么,使用什么方案可以兼顾易用性与执行性能呢?golang 越来越多的展露出其优势,接下来我们就由浅入深来全面学习一下这门新兴的编程语言

 

 

golang 支持 Linux、Windows、FreeBSD、MacOS

可以通过系统包管理安装,也可以在官网下载源码编译安装:

https://golang.org/dl/

这里不细述安装过程

 

安装后,执行 go version 可以查看 golang 的版本,执行 go help 可以查看 golang 的参数:

Go is a tool for managing Go source code.

Usage:

        go command [arguments]

The commands are:

    build       compile packages and dependencies

    clean       remove object files

    env         print Go environment information

    fix         run go tool fix on packages

    fmt         run gofmt on package sources

    get         download and install packages and dependencies

    install     compile and install packages and dependencies

    list        list packages

    run         compile and run Go program

    test        test packages

    tool        run specified go tool

    version     print Go version

    vet         run go tool vet on packages

Use "go help [command]" for more information about a command.

Additional help topics:

    c           calling between Go and C

    gopath      GOPATH environment variable

    importpath  import path syntax

    packages    description of package lists

    testflag    description of testing flags

    testfunc    description of testing functions

Use "go help [topic]" for more information about that topic.

 

基本命令为:

go command [args]

 

command 有以下选项可选:

  1. build -- 编译包和依赖
  2. clean -- 移除对象文件
  3. doc -- 显示包或者符号的文档
  4. env -- 打印go的环境信息
  5. bug -- 启动错误报告
  6. fix -- 运行go tool fix
  7. fmt -- 运行gofmt进行格式化
  8. generate -- 从processing source生成go文件
  9. get -- 下载并安装包和依赖
  10. install -- 编译并安装包和依赖
  11. list -- 列出包
  12. run -- 编译并运行go程序
  13. test -- 运行测试
  14. tool -- 运行go提供的工具
  15. version -- 显示go的版本
  16. vet -- 运行go tool vet

 

从上述命令就可以看出 go 语言与 C 语言一脉相承的关系,golang 也是一种编译型语言,很多参数来源于 Makefile 的习惯命名

 

接下来我们来看一个最简单的 go 程序 -- hello world:

package main import "fmt" func main() { fmt.Println("hello world!") }

 

 

golang 的运行

通过上文命令行参数的介绍,我们可以通过下面两种方法来运行上述程序:

go build helloworld.go

 

上面的命令生成可执行文件 helloworld

也可以通过下面命令直接运行:

go run helloworld.go

 

从上面的 hello world 程序可以看出 golang 程序的基本结构:

  1. package 关键字声明当前代码所在包名
  2. import 关键字声明当前代码需要使用的导入包
  3. 组成程序的函数、变量、常量、类型声明(func、var、const、type 关键字)

 

golang 包 -- package

和 Java 一样,golang 也是通过包来组织代码的,通过 package 关键字来声明

同一文件夹下所有 go 文件均为相同的包

go 标准库中有一百多个包,提供通用的输入、输出、排序、文本处理等方法,上例中导入的 fmt 包就是标准库中提供输入输出的包

一个程序的 main 包是一个特殊的包,其中包含了整个程序的入口 -- main 函数

 

导入包 -- import 关键字

import 关键字声明了需要使用的导入包,他必须位于 package 关键字声明的包名行后

golang 要求所有导入包必须被使用,缺失导入或导入额外的包都会编译失败

 

函数的定义

函数定义以 func 关键字起始,后面是函数名、参数列表、返回值列表以及函数体

golang 解决了长久以来左大括号是否换行之争,因为他要求左大括号必须不换行,否则无法通过编译

x+y 操作,只能在 + 后面换行,不能在 + 前面换行

通过 gofmt 工具可以将代码格式化为标准格式

同时,golang 和 python 一样,除非将两句代码写到一行而需要在中间进行分隔,否则不需要末尾的分号

 

go 语言中只有一种循环关键字 -- for,但他有三种用法,分别对应传统编程语言中的 for 循环、while 循环和无限循环

 

for 循环

for initialization; condition; post { // 循环体 }

 

 

可以看到,这里的 for 循环和传统的 for 循环一样,由初始化语句、循环条件、每次循环后的操作与循环体四部分组成

 

示例

packae main import ( "fmt" "os" ) func main() { var s, sep string; for i := 1; i < len(os.Args); i++ { s += sep + os.Args[i] sep = " " } fmt.Println(s) }

 

 

上面的例子将多个命令行参数组成

golang 也拥有自增、自减操作,i++、i-- 分别相当于 i+=1,i -= 1,但 ++i、--i 是不存在的,且他们不具有返回值

 

传统 while 循环

for condition { // 循环体 }

 

 

示例

package main import ( "fmt" "os" ) func main() { s, sep := "", "" for _, arg := range os.Args[1:] { s += sep + arg sep = " " } fmt.Println(s) }

 

 

每一次迭代,range 都从其参数的数组中产生一对值:索引和这个索引对应元素的值,这个例子里,我们不需要索引,所以使用 _ 接收,表示忽略该变量,golang 不允许存在未使用的变量,否则无法通过编译

 

无限循环

for { // 循环体 }

 

 

去掉上面例子中的 condition 部分,for 循环就变成了一个无限循环,这很好理解

 

示例的优化

上述例子只是为了说明 for 循环的用法,事实上,完成相同功能拥有更为简洁且高效的做法:

func main() { fmt.Println(strings.Join(os.Args[1:], " ")) }

 

 

golang 中的条件语句和其他语言中基本是一样的,只是没有小括号

package main import ("fmt"; "os") func main() { for _, arg := range os.Args[1:] { if arg == "apple" { fmt.Println("input apple") } else if arg == "banana" { fmt.Println("input banana") } else { fmt.Println("input neither apple nor banana") } } }

 

 

执行 go run main.go apple 显示了:

input apple

 

golang 中的 switch-case 语句的基本语法与 C 语言中基本相同,但不同之处在于,golang 中的 switch 语句每个分支不会像 C 语言中的 switch 语句那样贯穿执行,因此不需要在每个条件的最后通过 break 语句显式中止

package main import ("fmt"; "os") func main() { for _, arg := range os.Args[1:] { switch arg { case "apple": fmt.Println("input apple") case "banana": fmt.Println("input banana") default: fmt.Println("input neither apple nor banana") } } }

 

 

执行 go run main.go apple 显示了:

input apple

 

上面的很多例子中,我们已经见到了很多变量声明,以下方式是等价的:

  • s := ""
  • var s string
  • var s = ""
  • var s string = ""

 

最常用的是前两种,后两种方式并不常用

第一种通常在函数内部使用,不适合包级别变量的声明

第二种是常用的包级别变量声明,编译器同样会将变量初始化为 ""

第三种常用在多个变量同时声明的场景下

第四种显式的变量类型和初始化声明是初始化语句返回值与变量类型不同时所必须的

 

欢迎关注微信公众号,以技术为主,涉及历史、人文等多领域的学习与感悟,每周三到七篇推文,只有全部原创,只有干货没有鸡汤

 

 

《Go 程序设计语言》

 






读书笔记      龙潭书斋      技术贴      helloworld      循环      golang      go      判断      分支      switch     


京ICP备15018585号