go简单入门
go简介
go4个好处:
- 不依赖别的库, 拿来就可以跑.
- 静态语言, 又有动态语言的特性.
- 并发
- GC
用在: 服务器, 分布式, 云平台, 网络平台, 内存数据库cache
语法
变量声明/常量声明
1 | // 变量 |
匿名变量_
: 用来丢弃不处理, 常用在处理函数返回值
常量自动生成iota
: 4点
- 遇到
const
自动重新开始0 - 可以只写一行
iota
, 下面的行默认加上去 - 以行为单位递增
go的常用变量类型bool
int32
float64
byte
string
类比c 一个是单个字符, 一个是字符串, 多一个\0
单双引号
%T
%c %s %d %f %t
%v
‘a’这种也就是整型 int32
输入输出使用
1 | fmt.Printf() |
int() 强转, 注意不兼容类型 int 和 bool go的bool和int不兼容啊
byte int
类型别名, type来定义下
1 | type bigint int64 |
操作符同c javascript 一样啦 没有 ===
流程控制
1 | // 没括号 |
for 初始条件; 判断条件; 条件变化 同c 就是少个括号()
range 迭代
1 | // 返回一个元素位置和一个元素本身 |
go的不定参数, (a …int) 而(a…)是展开,
更高级的是指定从哪个下标开始到结束用[)
比如 (a[2:]...)
从下标2开始包括2到最后
比如 (a[:2]...)
到下标为2不包括2
1 | func a()(res int) { // 定义了返回的类型 |
函数名首字母是大写表示私有, 大写表示公有的函数.
函数类型
1 | type FFF func(int, int) int // 输入2个, 输出1个 |
格式对好就行, 然后相同参数返回值的函数, 到时候调用. 先声明赋值后, 直接就可以像原来的函数调用一样. 更具有普遍性.
t=add t(1,2)
涉及多态, 就是不写死. 比如sort()
闭包, 匿名函数, 立即调用func () {}
闭包以引用的方式捕获外部变量,
传统的局部变量是调用时才分配空间,然后调用完就回收了
defer
延时调用,在调用完前处理东西,只能用在函数内部。
类似异步后放最后用,然后多个defer
是按照后进先出,的顺序的!!就是入栈了先!
然后defer
是肯定能执行,发生错误也能。就是栈。
defer func()
这种个匿名函数一起用。
注意传入的参数是那个时候的。
命令行参数,用导入os的包import 'os'
,然后os.Args
。字符数组。
局部变量和全局变量
在{}
中就是局部,块
工作区src
GOPATH
1 | import ( |
import . "fmt"
不建议,这个调用就不用包名了, 直接用比如println
别名 import lll "fmt"
忽略包 import _ "fmt"
一般使用这个包的init
函数
工程文件下要有src
,GOPATH
就是工程的路径,不进去src
同一个路径下package <nane>
这个<name>
要一样。同一个目录下调用别的文件的,不需导入包名,直接调用好了。
不同目录包名不一样,同fmt一样导入好了,然后使用,但要注意,函数名要大写开头。私有公有的问题。
init
函数,会在那个包的所有函数之前运行,执行一次好了,就是每个包运行前会执行init
所以那个import _ "fmt"
只是用来执行init的
GOBIN
设置后用go install
生成pkg bin
文件夹,一个放依赖,一个命令可执行程序。
复合结构
point array slice map struct
指针point不支持->
这种算法
go中的是nil,不是null
- & 这种和c语言一样(只是没有
->
)
new(int)
分一个int大小的空间, 操作内存.
数组, 同一个类型的, 要固定长(常量 ), 不能变, 同c len()
初始化不同 {}
1
var a [12]int
数组声明同时赋值
1 | var a [5]int = [5]int{1, 2, 3, 4, 5} |
二维数组(了解), 看有多少个[]
多少维 多少循环
同一维 是用来初始化, 和c不同
1 | // 表示下标1的行那4个 |
数组比较==
和 !=
比较的事每个数组元素是不是一样
随机数
- 设置种子
rand.Seed(666)
如果种子一样, 每次的随机数就一样, 所以用时间来做随机种子time.Now().UnixNano()
- 产生随机数
rand.Int()
rand.Intn(100)
限制在100内
数组做函数参数, 是值传递, 不是引用哦, 相当于copy一份, 注意哦. 当然可以用指针的方式去
1 | // 按值 |
slice 弥补数组缺点, 通过内部指针和相关属性引用数组片段, 以实现变长方案.
1 | array := [...]int{10, 20, 30, 0, 0} |
切片和数组的区别: 数组的len是固定常量, 不能修改. 切片 方括号里面是空或…
1 | [6]int{} |
切片创建
// 自动推导
// 用make
1 | // 类型, 长度, 容量 |
截取:
1 | [low:high:max] |
切片会改变原来的数组
append
在slice末尾加一个元素, 会扩容的, 超过cap会以2倍扩容.
copy
1 | copy(dst, src) |
当函数参数的话, slice是引用传递, 不是值传递. 不用加&, 直接变量传过去.
map就是无序key-value
1 | // map[keyType] valueType 只有len没有cap, 用make的话那个是指定容量了, 还会扩容 |