从 0 到 1 学习 Go 语言 已翻译 100%

oschina 投递于 2018/12/25 15:25 (共 35 段, 翻译完成于 01-04)
阅读 2996
收藏 74
6
加载中

图片:Gopher 吉祥物和旧 logo

简要介绍下 Go(Golang)语言。Go 语言的是由谷歌的工程师 Robert Griesemer、Rob Pike 和 Ken Thompson 创造的一种静态类型编译语言。首个开源版本发布于2012年3月。

“Go 是一种开源编程语言,可以轻松构建简单、可靠、高效的软件。”

— GoLang

mufengs
mufengs
翻译于 2018/12/26 10:58
0

在诸多编程语言中,解决给定问题的方法有很多,程序员需要花很多时间思考关于解决问题的最佳方法。

但是,Go 相信更少的功能 - 只有一种正确的方法来解决问题。

这节省了开发人员的时间,并使大型代码库易于维护。 Go 中没有 maps 和 filters 等“富有表现力”的功能。

“当你需要增加功能的丰富性,往往伴随着开销的增加”

- Rob Pike

golang 最新发布的 logo: https://blog.golang.org/go-brand

mufengs
mufengs
翻译于 2018/12/26 13:37
0

入门

Go 程序由包组成。编译器会将 main 包编译成可执行程序,而不是共享库。main 包是整个应用的入口。main 包的定义如下:

package main

接下来,咱们在 Go 的工作空间中创建一个叫做 main.go 的文件,来实现一个简单的 hello world 例子。

kjmeng
kjmeng
翻译于 2018/12/26 13:08
0

工作空间(Workspace)

Go 的工作空间可以通过环境变量 GOPATH 定义。

你需要在这个工作空间中编写你自己的代码。Go 为搜索 GOPATH 以及 GOROOT 指定的目录中的所有包,GOROOT 变量是在安装 GO 时设置的,也就是 go 语言安装的目录。

将 GOPATH 设置到预期目录。现在,增加一个文件夹 ~/workspace

# export env
export GOPATH=~/workspace

# go inside the workspace directory
cd ~/workspace

接下来在这个工作空间中创建 main.go ,写入下面的代码。

kjmeng
kjmeng
翻译于 2018/12/26 13:14
0

Hello World!

package main

import (
 "fmt"
)

func main(){
  fmt.Println("Hello World!")
}

在上面的示例代码中,fmt 是 Go 的一个内置包,主要实现格式化 I/O 的功能。

在 Go 语言中,通过 import 关键字引入一个包。func main 是可执行代码的入口。fmt 中的 Println 函数实现 “hello world” 的打印。

下面尝试运行这个文件。我们可以通过两种方法运行一个 Go 命令。我们知道 Go 是一个编译性语言,所以,在执行之前我们先来编译它。

> go build main.go

上面的命令就生成了一个可执行文件 main ,接下来我们运行这个文件:

> ./main
 # Hello World!

接下来看另外一种更加简单的执行方式。go run 命令将编译步骤抽象。那么,通过下面的命令就可以执行这个程序。

go run main.go
 # Hello World!

注意:可以使用 https://play.golang.org 尝试上面的代码。

kjmeng
kjmeng
翻译于 2018/12/26 14:10
0

变量

Go 的变量必须显式声明。Go 是静态类型的语言,也就是说,在变量声明时要检查变量类型。可以如下声明一个变量:

var a int

在这种情况下,变量的值会被设为0。也可以通过下面的语法声明变量并初始化为不同的值:

var a = 1

在这里,变量自动被判断为一个整形变量。我们可以通过简化形式来声明变量:

message := "hello world"

也可以在一行声明多个变量:

var b, c int = 2, 3
kjmeng
kjmeng
翻译于 2018/12/26 15:43
0

数据类型

和其他编程语言一样,Go 语言也有不同的数据类型。接下来就来看一下:

数字(Number)、字符串(String)和布尔(Boolean)

可支持数字存储类型有 int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, uintptr…

字符串以字节序列的形式存储。用string关键字表示和声明。

布尔型变量的关键字是 bool 。

Go 还支持以 complex64 和 complex128 声明的复杂数字类型。

var a bool = true
var b int = 1
var c string = 'hello world'
var d float32 = 1.222
var x complex128 = cmplx.Sqrt(-5 + 12i)
kjmeng
kjmeng
翻译于 2018/12/26 15:51
0

数组、切片、集合

数组是相同数据类型的元素序列。数组具有在声明中定义的固定长度,因此不能进行扩展。数组声明为:

var a [5]int

数组也可以是多维的。我们可以使用以下格式创建它们:

var multiD [2][3]int

当数组的值在运行时更改时,数组限制了这种情况。 数组也不提供获取子数组的能力。 为此,Go 有一个名为 slices 的数据类型。 切片存储一系列元素,可以随时扩展。 切片声明类似于数组声明 - 没有定义容量:

var b []int

这将创建一个零容量和零长度的切片。切片也可以定义容量和长度。我们可以使用以下语法:

numbers := make([]int,5,10)

这里,切片的初始长度为5,容量为10。

mufengs
mufengs
翻译于 2018/12/26 17:01
0

切片是数组的抽象。切片使用数组作为底层结构。切片包含三个组件:容量,长度和指向底层数组的指针,如下图所示:

图片来源: https://blog.golang.org/go-slices-usage-and-internals

通过使用append或copy函数可以增加切片的容量。 append函数可以为数组的末尾添加值,并在需要时增加容量。

numbers = append(numbers, 1, 2, 3, 4)

增加切片容量的另一种方法是使用复制功能。只需创建另一个具有更大容量的切片,并将原始切片复制到新创建的切片:

// create a new slice
number2 := make([]int, 15)
// copy the original slice to new slice
copy(number2, number)
mufengs
mufengs
翻译于 2018/12/26 21:52
0

我们可以创建切片的子切片。这可以使用以下命令完成:

// initialize a slice with 4 len and values
number2 = []int{1,2,3,4}
fmt.Println(numbers) // -> [1 2 3 4]
// create sub slices
slice1 := number2[2:]
fmt.Println(slice1) // -> [3 4]
slice2 := number2[:3]
fmt.Println(slice2) // -> [1 2 3]
slice3 := number2[1:4]
fmt.Println(slice3) // -> [2 3 4]

集合是Go中的数据类型,它将键映射到值。我们可以使用以下命令定义映射:

var m map[string]int

这里m是新的集合变量,它的键为字符串,值为整数。我们可以轻松地将键和值添加到地图中:

// adding key/value
m['clearity'] = 2
m['simplicity'] = 3
// printing the values
fmt.Println(m['clearity']) // -> 2
fmt.Println(m['simplicity']) // -> 3
mufengs
mufengs
翻译于 2018/12/28 17:03
0
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(6)

iGoo
iGoo

引用来自“寂寞的大师”的评论

用学习go和用go来写项目,差的不是一点半点。一个phper的心声。。。
说出了大实话
小卡车呼呼呼
你们不要学,我刚学完。
寂寞的大师
寂寞的大师
用学习go和用go来写项目,差的不是一点半点。一个phper的心声。。。
来自山卡拉的你
来自山卡拉的你

引用来自“天天笑笑”的评论

什么乱七八糟的,方法有时大写开头,有时又是小写开头?
golang大写开头的方法是暴露给其他包使用时需要的, 如果同一个包名, 小写即可
天天笑笑
天天笑笑
什么乱七八糟的,方法有时大写开头,有时又是小写开头?
mufengs
mufengs
#Go#不是很完整,感觉还需要完善。回头多琢磨琢磨
返回顶部
顶部