what

研究了一下 golang 相关的文档,写下这篇 golang 入门日记,包含 golang 基础教程,这是 golang 语言初探第一篇。

why

周末的时候研究了一下 golang 相关的文档,根据自己的工作经验,我觉得这门语言在未来一定会大放异彩,其实现在也比较热门了。主要有以下几个特点:

  • 语法简单,golang 的关键字才 25 个,入门也非常简单
  • 天然支持高并发,适用于大型微服务应用
  • 跨平台,可编译出支持各大主流平台的应用,且毫无依赖

经过对 golang 的这些了解,顿时感觉有点兴趣了,在这里记录一些入门的资料。

how

设置 golang 镜像代理

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

基本数据类型

程序实体与关键字

任何Go语言源码文件都由若干个程序实体组成的。在 Go 语言中,变量、常量、函数、结构体和接口被统称为“程序实体”,而它们的名字被统称为“标识符”。

标识符可以是任何 Unicode 编码可以表示的字母字符、数字以及下划线“_”。不过,首字母不能是数字或下划线。

注意:在 Go 语言中,我们对程序实体的访问权限控制只能通过它们的名字来实现。名字首字母为大写的程序实体可以被任何代码包中的代码访问到。而名字首字母为小写的程序实体则只能被同一个代码包中的代码所访问。

Go 语言还规定了一些特定的字符序列。它们被称为“关键字”。编程人员不能把关键字作为标识符。 Go 语言的关键字如下图:

关键字

变量和常量

用于声明变量的关键字 var ,以及用于声明常量的关键字 const 。

var num1 int = 1 
var num2, num3 int = 2, 3 // 注释:平行赋值    
var ( // 注释:多行赋值
    num4 int = 4
    num5 int = 5
)

要注意,对于常量不能出现只声明不赋值的情况。

整数类型

Go语言的整数类型一共有10个。

其中计算架构相关的整数类型有两个,即:有符号的整数类型 int 和无符号的整数类型 uint 。

有符号的整数类型会使用最高位的比特(bit)表示整数的正负。显然,这会对它能表示的整数的范围有一定的损耗(使其缩小)。而无符号的整数类型会使用所有的比特位来表示数值。如此类型的值均为正数。这也是用“无符号的”来形容它们的原因。

在不同的计算架构的计算机之上,它们体现的宽度是不同的。请看下表。

golang-int

除了这两个计算架构相关的整数类型之外,还有8个可以显式表达自身宽度的整数类型。如下表所示。

golang-int

它们的宽度意味着其自身的范围:

golang-int

除十进制外,还有八进制、十六进制的表示方法

var num1 int = 12
num1 = 014 // 用“0”作为前缀以表明这是8进制表示法。
num1 = 0xC // 用“0x”作为前缀以表明这是16进制表示法。

浮点数类型

浮点数类型有两个,即 float32 和 float64 。存储这两个类型的值的空间分别需要 4 个字节和 8 个字节。
浮点数类型的值一般由整数部分、小数点“.”和小数部分组成。其中,整数部分和小数部分均由 10 进制表示法表示。不过还有另一种表示方法。那就是在其中加入指数部分。指数部分由“ E ”或“ e ”以及一个带正负号的 10 进制数组成。比如,3.7E-2 表示浮点数 0.037 。又比如,3.7E+1 表示浮点数 37 。

有时候,浮点数类型值的表示也可以被简化。比如,37.0 可以被简化为 37 。又比如, 0.037 可以被简化为 .037 。

有一点需要注意,在 Go 语言里,浮点数的相关部分只能由 10 进制表示法表示,而不能由 8 进制表示法或 16 进制表示法表示。比如,03.7 表示的一定是浮点数 3.7 。

复数类型

复数类型同样有两个,即 complex64 和 complex128 。存储这两个类型的值的空间分别需要 8 个字节和 16 个字节。实际上,complex64 类型的值会由两个 float32 类型的值分别表示复数的实数部分和虚数部分。而 complex128 类型的值会由两个 float64 类型的值分别表示复数的实数部分和虚数部分。

复数类型的值一般由浮点数表示的实数部分、加号“+”、浮点数表示的虚数部分,以及小写字母“i”组成。比如,3.7E+1 + 5.98E-2i。正因为复数类型的值由两个浮点数类型值组成,所以其表示法的规则自然需遵从浮点数类型的值表示法的相关规则。

var num3 = 3.7E+1 + 5.98E-2i
// 37+0.0598i

byte 与 rune

byte 与 rune 类型有一个共性,即:它们都属于别名类型。 byte 是 uint8 的别名类型,而 rune 则是 int32 的别名类型。
一个 rune 类型的值即可表示一个 Unicode 字符。 Unicode 是一个可以表示世界范围内的绝大部分字符的编码规范。关于它的详细信息,大家可以参看其官网(http://unicode.org/)上的文档,或在 Google 上搜索。用于代表 Unicode 字符的编码值也被称为 Unicode 代码点。一个 Unicode 代码点通常由“ U+ ”和一个以十六进制表示法表示的整数表示。例如,英文字母“ A ”的 Unicode 代码点为“ U+0041 ”。
rune 类型的值需要由单引号“ ’ ”包裹。例如,’ A ‘或’ 郝 '。这种表示方法一目了然。不过,我们还可以用另外几种形式表示 rune 类型值。

golang-int

另外,在 rune 类型值的表示中支持几种特殊的字符序列,即:转义符。它们由“ \ ”和一个单个英文字符组成。

golang-int

字符串类型

一个字符串类型的值可以代表一个字符序列。这些字符必须是被 Unicode 编码规范支持的。虽然从表象上来说是字符序列,但是在底层,一个字符串值却是由若干个字节来表现和存储的。一个字符串(也可以说字符序列)会被 Go 语言用 Unicode 编码规范中的 UTF-8 编码格式编码为字节数组。

注意,我们在一个字符串值或者一个字符串类型的变量之上应用 Go 语言的内置函数 len 将会得到代表它的那个字节数组的长度。这可能与我们看到的表象是不同的。

字符串的表示法有两种,即:原生表示法和解释型表示法。若用原生表示法,需用反引号“ ` ”把字符序列包裹起来。若用解释型表示法,则需用双引号“ " ”包裹字符序列。

二者的区别是,前者表示的值是所见即所得的(除了回车符)。在那对反引号之间的内容就是该字符串值本身。而后者所表示的值中的转义符会起作用并在程序编译期间被转义。所以,如此表示的字符串值的实际值可能会与我们看到的表象不相同。

总结

本篇结束,篇幅较长,请看下一篇

(完)


作者: Kavience 本文链接: http://www.kavience.com/backend/a-preliminary-study-of-golang-language1.html 转载请注明:《Golang语言初探一》转自 http://www.kavience.com/backend/a-preliminary-study-of-golang-language1.html,原作者:Kavience 版权声明: 自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)