从下载Go开始
用镜像站:https://golang.google.cn/dl/
一般直接上最新版
找到对应操作系统的版本下载
安装是傻瓜式的一直下一步,如果想改安装路径,那一定要记好放在哪里了
GoRoot
也就是我们的go开发包路径,环境变量配置还是那老一套
GoPath
现在已经不需要自己手动配置了,默认即可
GoProxy
因为默认的GoProxy配置是:GOPROXY=https://proxy.golang.org,direct
,国内访问不到https://proxy.golang.org
,所以就只能换一个Proxy,执行下面的命令修改Proxy
go env -w GOPROXY=https://goproxy.cn,direct
开始
init函数与main函数
init函数用于程序执行前做包的初始化的函数
main函数是程序的默认入口函数(主函数)
init函数可以用于任意包中,且可以重复定义多个
main函数只能用在main包中,且只能定义一个
基本数据类型
值类型
bool
int(由32位或64位操作系统决定的32 or 64), int8, int16, int32, int64
unit(由32位或64位操作系统决定的32 or 64), unit8(byte), unit 16, unit 32, unit64
float32, float64
string
complex64, complex128
array
正好最近学了计算机组成原理,就结合起来总结一下
整型int,unit
int后面的数字表示这个类型变量占用多少二进制位,int8也就是一字节有符号整数
unit同样也是整型,后面的数字同样是占用多少二进制位
这两个的区别主要在于有无符号位
int是有符号位的整数,
int8表示的范围是-128~127
,
八位二进制,首位表示正负号,
(
0111
1111
)
2
(0111\;1111)_2
(01111111)2也就是127
-128 是
(
1000
0000
)
2
(1000\;0000)_2
(10000000)2
unit是无符号位的整数,也就没有负数,
unit8表示的范围是0~255
(
1111
1111
)
2
(1111\;1111)_2
(11111111)2表示的就是255
浮点型float32,float64
float32精确到小数点后7位
float64精确到小数点后16位
IEEE 754标准,
32表示32位短浮点数格式
其中,最前1位为符号位,紧接着是阶码(指数位)8位,尾数位(有效数字位)23位
64表示64位长浮点数格式
其中,最前1位为符号位,紧接着是阶码(指数位)11位,尾数位(有效数字位)52位
字符串
Go的字符串是值类型!
字符串拼接用+
多行字符串可用
s := `第一行
第二行
第三行`
复数 complex
啧,这个东西,高中就让我烦,现在还是不太想看,就写一点吧
complex64 (32 位实数和虚数)
complex128 (64 位实数和虚数)
var c1 complex64 = 5 + 10i
数组
Go的array数组,长度也是类型的一部分,长度为8的array和长度为16的数组完全是两个类型
数组创建
var 数组名 [size]T = [size]T{t1,t2,t3,...}
数组长度len(arr)
输出数组时不用再遍历输出,直接fmt.Println(arr)
字符型 unit8(byte),rune
- unit8(byte)类型:代表ASCII码的一个字符
- rune类型:代表一个UTF-8字符
当需要处理中文时,就要用rune类型
rune实际上是一个int32
引用类型
slice 切片
切片是数组的一个引用,是引用类型,自身是结构体,里面由,指针,长度,最大长度构成
len()求长度
cap()求最大长度(最大扩张容量)
创建切片可通过
var slice []type = make(type, len)
slice := make([]type,len)
slice := make([]type,len,cap)
一旦超出slice的最大长度,将会导致重新分配底层数组
简单来说,给slice append元素时,一不小心超出了最大长度,slice会把原数组的值拷贝一份过来,对slice进行扩容,此时复制过来的值再修改时,不会影响到原数组
var arr1 [3]int = [3]int{1,2,3}
var slice1 []int = arr1[:]
slice1[0] = 2
fmt.Println(arr1) // [2,2,3]
fmt.Println(slice1) // [2,2,3]
// 超出最大容量
slice1 = append(slice1,4)
slice1[0] = 3
fmt.Println(arr1) // [2,2,3]
fmt.Println(slice1) // [3,2,3,4]
Map
键值对数组,,,
map[keyType]ValueType
用make()来分配内存
make(map[keyType]ValueType,[cap])
chan
var 通道名 chan 传输的数据类型
所有的类型都可以用于通道,甚至空接口也可以,函数当然也可以
c1 := make(chan string) // 创建一个字符串型的信道
创建有方向的chan
var send_only chan<- int // 只接收
var read_only <-chan int // 只发送
常量
const(
n1 = 100
n2 = "诶嘿
)
// 多个常量一起声明时,第一个常量赋值后,其它常量不赋值,表示的意思是,后面的常量值与第一个常量值一样
const(
n3 = 200
n4
n5
)
差不多了,下一篇继续水