Go 介绍与常见数据类型

前言

时至今日,如果你想当一名程序员,入门学习编程。你有众多的开发语言可以选择,从 Tiobe 编程语言趋势版可以看到,比较流行的有:Python、C、C++、Java、C#、JavaScript、SQL、Swift...

做选择从来不是容易的事情,所以你可能会问,我该学哪一门语言?

在我们问自己该学哪一门语言之前,不如再往前追问一句:为啥会有这么多语言?

其实,每一门语言被设计出来都是有原因的,都是为了解决不同的问题,取决与你想做什么(移动开发、后端开发、前端开发、桌面应用、游戏开发...)。

甚至在为了方便自己更好的工作,你可能会学习一门或多门语言。

都 2021 年了,如果你还在纠结学哪门语言开始入门,那么,我会推荐 Go 语言。

为什么选 Go 语言

话说在 2007 年的一个云淡风轻的下午,谷歌的三位工程师(Robert Griesemer、Rob Pike 和 Ken Thompson)由于对其内部的各种系统(主要使用 C++ 语言构建)和工具感到沮丧,产生了从头开始重新设计一门新的编程语言的想法。这三位大佬觉得这门语言应该是用来解决其他语言的弊端,同时保留其有用且优秀的功能。

程序那些事儿:

Go 来自于一个相当令人印象深刻的团队。肯-汤普森(Unix 和 C 语言的设计者和创造者),罗伯-派克(UTF-8 和 Unix 格式的共同创造者),以及罗伯特-格里瑟默(谷歌工程师)。如果想看看 Go 的前世今生,可以看看 " Go at Google:软件工程服务中的语言设计 ",这篇文章讨论了 Go 最初是如何为解决 Google 的问题而构思的。

所以 Go 被设计出来:

  • 使用静态类型,拥有 C 语言的运行时效率

  • 具备 Python 和 JavaScript 等语言的可读性和实用性

  • 在网络和多处理方面表现出卓越的性能

  • 为云时代而生,为大规模多线程和并发性而设计的精简的语言

  • 专门设计用于构建快速、可扩展的应用程序。

2008 年初,Unix 之父 Ken Thompson 实现了第一版 Go 编译器,用于验证之前的设计。这个编译器先将 Go 代码转换为 C 代码,再由 C 编译器编译成二进制文件。

到 2008 年中旬,Go 的第一版设计基本结束了。这时,同样在谷歌工作的 Ian Lance Taylor 给 Go 语言的三位作者发了一封电子邮件。他宣称为 Go 语言实现了一个 gcc 的前端,这也是 Go 语言的第二个编译器。

2009 年,谷歌正式开源了 Go 语言,也是目前发展迅速的编程语言之一。

截至目前,众多大公司在使用这门语言,这要归功于云计算和微服务的激增。Google、Uber、Dropbox、Alibaba、Riot Games、Tencent、ByteDance...

Go 安装

听到这,你是否很想在你的电脑上进行 Go 语言编程。所以 Let's Go~

安装 Go 的最简单方法是进入官网 下载 安装包。该网站会自动检测你所使用的操作系统并显示你应该下载的 Go 的安装程序:

如果上面的网站访问不了的话,推荐选择 Go 语言中文网进行下载,点 此处 进入如下下载界面 :

当前最新的 Go 版本是 1.17.5 版本:

MAC :https://studygolang.com/dl/golang/go1.17.5.darwin-amd64.pkg

Linux:https://studygolang.com/dl/golang/go1.17.5.linux-amd64.tar.gz

Windows:https://studygolang.com/dl/golang/go1.17.5.windows-amd64.msi

下载完 Go 安装程序后,双击安装程序,开始直接的安装过程。建议直接使用默认的安装设置,不需要改变任何这些设置。直到安装完成。

Go 版本

使用 go version 命令,查看 Go 是否安装成功:

$ go version
go version go1.16.3 linux/amd64

Hello World 程序

  1. 首先创建一个存放 Go 源代码的文件夹:
$ mkdir -p GoProjects/Go/src/
  1. 创建 Hello.go 文件
$ cd ~/GoProjects/Go/src/
$ touch hello.go
  1. 使用文本编辑器打开 hello.go 文件,编辑第一个程序内容,点击保存
package main

import "fmt"

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

如图所示:

保存完后运行,命令为: go run hello.go ,就能看到输出 Hello World 显示在屏幕了。

$ go run hello.go
Hello World

Go 包括:可执行程序和库程序。

可执行程序:我们可以直接从命令行运行。(Windows 一般为 .exe 后缀的文件,Linux 一般不带后缀)。在 Linux 中,我们可以使用 go build 命令生成可执行程序 hello,然后运行这个程序,同样也能在控制台中打印出 Hello World 。

$ go build hello.go 
$ ls
hello  hello.go
$ ./hello
Hello World

: 代码的集合,把所有的代码打包放到一块,方便我们能够在其他代码中使用。

现在,让我们来解释一下 Hello.go 程序:

package main 是我们第一行的程序,每一个 Go 程序必须由一个 package 声明,各种各样的包是 Go 程序组织和复用代码的方式。

import "fmt" : import 关键字能从其他的 packages 引入代码为我所用,fmt 包其实是英文 format 的缩写,顾名思义,这个包实现了输入和输出的格式化。

func main() { } : 函数块有输入、输出和一系列逐步执行的语句。

  • func 定义了一个函数块,后面是函数名,所以这个函数叫 main 函数
  • () 内可以包括零个或多个参数,括号后可以有返回类型。
  • {} 内部是函数体。本例中的函数没有参数,也没有返回值,只有一个打印语句。

fmt.Println("Hello World") ,该声明由三个部分组成:

  • 首先,我们访问 fmt 包中的另一个函数 Println(即 fmt.Println 部分,Println 表示打印行)。
  • 然后我们创建一个包含 Hello World 的新字符串,并以该字符串作为第一个也是唯一的参数调用(也称为调用或执行)该函数。

总结起来就是:创建一个新的可执行程序,该程序引用 fmt 库并包含一个名为 main 的函数。 该函数不接受任何参数,不返回任何内容,并执行以下操作:访问 fmt 包中包含的 Println 函数并使用一个参数调用它 - 字符串 Hello World。

Go 的基本数据类型

数字类型

Go 有几种不同的类型来表示数字。 通常我们将数字分为两种不同的类型:整数和浮点数。

整型

整数,没有小数部分的数字, 1, 2, 3,4,5.

与我们用来表示数字的基数为 10 的十进制系统不同,计算机使用基数为 2 的二进制系统。我们的系统由 10 个不同的数字组成。 一旦我们用尽了可用的数字,我们就通过使用 2 个(然后是 3、4、5 ……)个彼此相邻的数字来表示更大的数字。 例如 9 后的数字是 10,99 后的数字是 100 等等。 计算机也这样做,但它们只有 2 位数字而不是 10。所以计数看起来像这样:0、1、10、11、100、101、110、111 等等。

Go 的整数类型有:uint8、uint16、uint32、uint64、int8、int16、int32 和 int64。

8、16、32 和 64 告诉我们每种类型使用多少位。

uint 表示“无符号整数”,而 int 表示“有符号整数”。 无符号整数只包含正数(或零)。

另外还有两种别名类型:与 uint8 相同的 byte 和与 int32 相同的 rune。

字节是计算机上使用的极其常见的度量单位(1 字节 = 8 位,1024 字节 = 1 KB,1024 KB = 1 兆字节,……)

因此 Go 的字节数据类型经常用于其他类型的定义。 还有 3 种依赖于机器的整数类型:uint、int 和 uintptr。 它们依赖于机器,因为它们的大小取决于您使用的架构类型。

浮点型

浮点数是包含小数部分(实数)的数字。 (1.234,123.4,0.00001234,12340000) 它们在计算机上的实际表示相当复杂,并不是真正需要知道如何使用它们。 所以现在我们只需要记住以下几点:

浮点数是不精确的。 有时无法表示一个数字。 例如,计算 1.01-0.99 会得到 0.020000000000000018——一个非常接近我们预期的数字,但并不完全相同。

像整数一样,浮点数也有一定的大小(32 位或 64 位)。 使用更大的浮点数会增加它的精度。 (它可以代表多少位数)

除了数字之外,还有其他几个可以表示的值:“非数字”(NaN,对于 0/0 之类的东西)以及正无穷大和负无穷大。 (+∞ 和 −∞)

Go 有两种浮点类型:float32 和 float64(通常也分别称为单精度和双精度)以及两种用于表示复数(带虚部的数字)的附加类型:complex64 和 complex128。 通常我们在处理浮点数时应该坚持使用 float64。

package main

import (
    "fmt"
)

func main() {
    a := 3
    b := 4
    fmt.Println("1 + 1 =", 1+1)
    fmt.Println("a + b =", a+b)
    fmt.Println("1.0 + 1.0 =", 1.0+1.0)
}

结果为:

1 + 1 = 2
a + b = 7
1.0 + 1.0 = 2

和 Hello World 程序一样,它包含相同的 package main 行、相同的 import 行、相同的函数声明并使用相同的 Println 函数。

这次不是打印字符串 Hello World,而是打印字符串 1 + 1 = 后跟表达式 1 + 1 的结果。

该表达式由三部分组成:数字文字 1(类型为 int)、 + 运算符(表示加法)和另一个数字文字 1。

字符串类型

正如我们在前文中看到的,字符串是用于表示文本的具有确定长度的字符序列。 Go 字符串由单个字节组成,通常每个字符一个。 (中文等其他语言的字符用一个以上的字节表示)可以使用双引号 "Hello World" 创建字符串文字。

它们之间的区别在于双引号字符串不能包含换行符,并且它们允许特殊的转义序列。 例如,\n 被换行符替换,\t 被替换为制表符。

对字符串的几种常见操作包括查找字符串的长度:

  • len("Hello World"),访问字符串中的单个字符

  • "Hello World"[1],访问字符串的第二个位置上的元素

  • 将两个字符串连接在一起:"Hello " + "World" .

让我们修改我们之前创建的程序来测试这些:

package main

import "fmt"

func main() {
    fmt.Println(len("Hello World"))
    fmt.Println("Hello World"[1])
    fmt.Println("Hello" + "World")
}
// 结果为:
// 11
// 101
// HelloWorld

解释:

  • 空格也被认为是一个字符,所以字符串的长度是 11 而不是 10

  • 字符串从 0 开始“索引”而不是 1。 [1] 给你第二个元素而不是第一个。 另请注意,当您运行此程序时,您看到的是 101 而不是 e。 这是因为字符由一个字节表示(记住一个字节是一个整数)。

  • 连接使用与加法相同的符号。Go 编译器根据参数的类型计算出要做什么, 由于 + 的两侧都是字符串,因此编译器假定您的意思是连接而不是加法。 (加法对字符串没有意义)

布尔型

布尔值(以 George Boole 命名)是一种特殊的 1 位整数类型,用于表示真假( ture 和 false)。

通常可以把三个逻辑运算符与布尔值一起使用:

  • && (与,and)

  • || ( 或,or)

  • ! (非,not)

package main

import "fmt"

func main() {
    
    fmt.Println(true && true)
    fmt.Println(true && false)
    fmt.Println(true || true)
    fmt.Println(true || false)
    fmt.Println(!true)
}

运行后的结果为:

true
false
true
true
false

总结

本篇文章首先介绍了 Go 语言的一些来龙去脉、 Go 语言的特点与优点,紧接着说明了 Go 的安装方法,并开始编写了第一个 Hello World 程序,最后介绍了基本数据类型。

这可以说是快速入门的第一步,知道了 Go 是咋回事,Go 有哪些基础数据。下一篇我们继续探索 Go 语言更多知识。敬请期待!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容