准备冲锋

树活一张皮,人活一张脸。文章好不好,标题最重要。光起名就想了10几分钟,中国汉语博大精深,但适合做技术类标题的真心太难想了。标题不够,写诗来凑,所以来段绕口小段子算是开场:

守法朝朝忧闷,强盗夜夜欢歌。 损人利己骑马骡,正直公平却挨饿。 修桥补路瞎眼人,杀人放火事儿真多。我到西天问我佛,佛说:我TM也没辙。

看完,乐完。收拾心情,开始继续学Golang。

在上一节,你学会了写第一个Golang程序,也知道了Golang的程序结构。我不知道你是什么技术背景,也不知道有多少编码功底。所以有的地方写的比较啰嗦,懂了,就一笑而过。不懂,就好好看一下。知识多了,不丢人。不懂装懂,最可怕。

这一节,你将接触到Golang的基本数据类型。

自打有编程语言开始,基本类型就三类:布尔,字符/字符串,数值(和其它)。不同的语言,对类型有不同的分类标准,就会衍生出更为细致的分类,但本质就这么三类。其它语言,咱先不管。先来看看Golang的类型划分:

  • 布尔类型

只有两个值,true或者false。记住只有这两个值。别的语言可以通过0或者1来充当布尔判断,但在golang里面不行(笔杆子出真理,不行就自己写个代码来验证一下)。golang只认true or false。

  • 字符/字符串

字符多了就是字符串。 从内存上来说,字符串就是内存中连续排列的字符的集合。在内存当中保存的都是01这样的二进制,不会保留一个汉字或者字母。所以每个字符都对应着一个数字,这个数字就是ASCII码里面的值。比如十进制的33就是'!'。虽然字符对应的是数字,但Golang仍然赋予字符一个特定的类型叫做byte。你可以这么定义一个字符:

  1. var c byte
  2. c = 33

字符多了就是串,所以字符串类型string也可以理解成是[]byte(byte数组)。提醒一点,Golang的字符串是不可更改的。 记住即可,日常中不会体会到,除非装X较真的时候(比如面试)会提到。这里的不可更改指的是下面的场景:

  1. str := "Who said string cannot change?"
  2. str = "I don't konw"

str仍然是哪个str,但str指向的内存地址已经变了。str只是一个名字,一个代号而已,拿掉这个代号,str又是什么东西(写这段的时候,刚好旁边在放武林外传吕秀才口擒姬无命那段,所以直接用了,应该没有版权问题)? 上面说到字符串是内存中连续的字符集合,所以当你对字符串修改时,其实是将一段新的内存给了str。因此才会说字符串是不可更改的。因为从来都是给它赋新值,旧值直接被垃圾回收了。 这段记住即可,除了面试,其它没有会被提到的场合。

  • 数值类型

这个类型需要好好说一下了,因为衍生的类型太多了。但多归多,真正使用的就那么几个(谁用谁知道)。

整型值
序号类型和取值范围
1uint8 无符号8位整型 (0 to 255)
2uint16 无符号16位整型 (0 to 65535)
3uint32 无符号32位整型 (0 to 4294967295)
4uint64 无符号64位整型 (0 to 18446744073709551615)
5int8 有符号8位整型 (-128 to 127)
6int16 有符号16位整型 (-32768 to 32767)
7int32 有符号32位整型 (-2147483648 to 2147483647)
8int64 有符号64位整型 (-9223372036854775808 to 9223372036854775807)

一句话点明:无符号整型只能表示正数,有符号的可以表示负数。但数的个数是相同的(自己找个笔头,算算二进制就知道了)

浮点数
符号类型和取值范围
1float32 32位浮点数
2float64 64位浮点数
3complex64 实部虚部都是一个float32的复数
4complex128 实部虚部都是一个float64的复数

Golang里面没有float类型,所以需要浮点数的时候需要指明长度。 除了计算和钱有关的程序(计算利息,收益等等),基本上很少会用到浮点数。

其它数值类型
序号类型
1byte等同于uint8
2rune等同于 int32
3uint 等同于 32 or 64 bits
4int 等同于 uint
5uintpt 指针类型 CGO里面经常用到

上面列出了Golang当中所有的数值类型,大部分而且是绝大部分是不常用到的。经常用的就是int, byte再加上float32/64,没有其它。

甚至有的时候,你都不知道用的是什么类型,例如:

  1. i := 0

很可能你就直接声明了一个变量。这个变量什么类型, who care? 不能说你错,因为我也经常这么干。但我知道i 是int型🙄。 刚开始写golang,别被老司机带坏了。老老实实的声明变量类型,等你变老了,再去调戏小姑娘

  1. var i int
  2. i = 0

没有人会问到常量么? 在有的文章或者教程中,常量也被归纳到类型中.Golang官方里面没有这么提,所以尊重原创,我也不认为常量算是一种类型。

变量

类型是为变量服务的,类型是衣,变量是皮。前面你所写的golang代码中已经有变量了,但却只其有而不知它为啥有,看下面就让你知道变量是怎么回事。

说的官方点,变量只不过是给程序可以操作的存储区域的名称而已。Go中的每个变量都有一个特定类型,该类型决定变量内存的大小和布局,可以存储在该内存中的值的范围,以及可以应用于该变量的操作集。

这种话,说出来都绕口。 通俗大白话,变量就是一种保存在内存里的数据结构。

变量名只能有字母,数字或者下划线来组成。但必须以字母或者下划线开头,别找事,用数字开头。那就是自己挖坑自己遭殃。自己作孽自己die。因为Golang对大小写敏感,所以首字母是否要大写,根据是否可见来判断。 如果不保准,就小写。等着后悔了,改成大写也来得及。

Golang也允许定义各种其他类型的变量,例如枚举、指针、数组、结构和Union,为了体现本书内容的厚度,我们放在以后的章节中讨论这些变量。在本章中,将只关注基本的变量类型。

声明变量的基本格式是:

  1. var 变量名称 变量类型

也可以采用:

  1. 变量名称 := 初始值

但还是那句话,没练成老司机,就别调戏小姑娘。老老实实的用第一种吧。如果某天看到下面的声明方式也别奇怪:

  1. var i, j, k int

golang支持同时声明多个变量。 上面就声明了三个i、j和k三个int类型的变量。一般来说,声明完之后,就择机进行初始化。

  1. i = 4
  2. j,k = 5,6

可以单独给某个变量赋值,也可以同时给多个变量赋值。 喜欢哪个就用哪个,高兴就好。

像这种通过var来声明的变量,称之为静态变量。 也就是编译器在编译阶段就可以知道数据类型的变量。 反之就是动态变量,也就是通过 i := 0这种,运行时才能推导出变量类型。 不用担心,两者在效率上是否有区别。 现在的CPU老牛X了,不在乎这点差距。

介绍完常规命名方式,下面来介绍个"孔乙己"式的方式:

  1. var a, b, c = 3, 4, "foo"

花哨不实用,知道即可。非要练,请自便~ 小心被团队里的其它人打折腿。

Golang的变量还是很简单的,实用的就那么几招,学会了就真的学会了,没有花架子。

本节起名是准备冲锋。冲锋之前,送你一把称心称手的兵器。介绍一个IDE

Goland

IDE大厂JetBrains推出的专业Golang IDE。 现在还是预览版,所以不要钱。 趁着免费赶紧用吧。当哪天收费了,撸起袖子去找破解Key吧。

安装好Goland之后,基本上什么都不需要配置,开箱既用。唯独需要你自己维护一下GOPATH。 不知道何为GOPATH? 老铁,上点心,别吃完饭就忘… 翻到前面几节复习一下。

Goland的GOPATH设置在Preferences —> Go —> GOPATH. 里面有全局GOPATH也有项目GOPATH,根据自己的需要,自己维护一下。如果心情好,可以顺手去维护了GOROOT。反正是no zuo no die。 工程跑不起来,还是自己受伤💔。

所以只维护GOPATH就好。

第一式,亢龙有悔就结束了。 入门没入门? 没入门… 再从第一节读一遍,保证入门。 入了门? 看看有没有点star,没点赶紧点一个。每节最后我都提示一下,反正是为了凑字数..