开始学习go语言,官方给了一个入门教程:
英文地址:https://tour.golang.org/list
中文地址:https://tour.go-zh.org/list
但是强烈建议看英文的,原因就不多说了
Day 0:
可能是go在大陆太火爆了,教程一开始就能看到熟悉的中文,左边是文字说明,右边是代码编辑与输出,可以在看完文字说明后立即上手练一练,非常方便
选择语言,强烈建议直接看英文的
官方除了在线的教程外,还提供离线的教程
这里说明了一下该教程是基于go游乐场的服务:
- 开始时间始终为2009-11-10 23:00:00 UTC(golang的生日),这一点很重要,因为你没有办法获取到变化的时间,也就没有办法通过时间获取随机数,这点后面会讲到
- 对运行时间、CPU、内存、外网访问都存在限制(白嫖的别期待太多)
- 始终使用最新版本的go
Here we go!
搞清楚三个名称: - 包名
- 路径名
- 文件名
文件名和包名、路径名的关系不大,基本可以认为随便起
示例代码中的math/rand为路径名,函数中的rand为包名
所以可以猜想src目录下文件结构为:
.
├── package.go
└── math
└── rand
└── xxxx.go
xxxx.go文件:
package rand
import (
...
)
func Intn() {
...
}
参考:https://www.jianshu.com/p/07ffc5827b26
虽然此处math是go自带的包
由于没有加随机种子,所以此处代码每次运行都始终是同一个值
所以我们可以通过获取当前时间,设置变化的随机种子
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
fmt.Println("My favorite number is", rand.Intn(10))
}
但你会发现还是一个固定值,这就是因为go游乐园的开始时间始终为2009-11-10 23:00:00 UTC
这里主要说明了import可以写在一起也可以分开写,官方更推荐写在一起,这和Python正好相反
这里和Python不一样,如果希望函数或者变量被其他包使用,则名字开头必须大写,否则会报错
函数结构包括:
- func关键字
- 函数名
- 用()包裹的参数(可以为空也可以多个)、参数类型
- 用{}包裹的函数体,如果函数有return,则在{}前需有返回值类型
参数的写法可以是
(x int, y int)
(x, y int)
返回值存在多个,则返回值类型也需要写多个,且使用()包裹
下面的返回值写法正确,但是不推荐使用
使用var关键字声明变量,var语句可以存在于函数体外也可以存在于函数体内
使用var声明变量的同时也可以进行初始化赋值,而且类型默认与赋值的类型一致
短变量声明 (直译过来真的很难理解)
简单来说就是用:=替代var
但是由于在函数体外,每一条语句开头都需要有关键字,所以:=不被允许
Python 3.8新加的海象运算符和这个功能可不太一样
if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")
参考:https://docs.python.org/3/whatsnew/3.8.html#assignment-expressions
基础类型
int、uint、uintptr长度随系统变化而变化,32位系统32字节,64位系统64字节
零值
变量如果没有初始化赋值则会被赋值为零值
- 数值类型的零值为0
- 布尔类型的零值为false
- 字符串类型的零值为""
类型转换
与C语言不同,Go语言在不同类型之间转换时需要显式类型转换
Python则是分情况
隐式:
num_int = 123
num_flo = 1.23
num_new = num_int + num_flo
显式:
num_str = "123"
num_flo = 1.23
num_new = int(num_str) + num_flo
类型推断
在声明变量时,如果没有指定类型,则会默认根据所赋值的类型进行类型推断
常量
使用const关键字进行声明
常量可以是字符、字符串、布尔以及数值类型
常量不能使用:=语法进行声明
数值常量
数值常量是高精度值
<<移位操作符,1 << 100就是将二进制数1左移100位,变为二进制数100…000,相对的>>是右移
参考:https://stackoverflow.com/a/23189744