go 基础变量

php 活不下去了,┭┮﹏┭┮,开始学习go了,其实还好,多一门语言,多一个视角,~希望2020年识货给我的礼物就是go 和 node 的编写技能

变量

slice 切片的申明

1
2
3
4
5
6
7
8
slice  底层是指向数组的指针,所以如果我们用 var 去声明的话,默认得到的是一个nil
相比较map 的nil, slice 的 nil 我们是可以append,map的nil 之后我们是没法属性或者给属性赋值的。

一般 arr := make(a, 0, 10)
arr := []int{1,2} // 这种方式也用的多,容易被忽略

ps: 在go中经常有 type cy int, 这种别名
[]cy{}, 这样给切片值其实很正常,类似 []int{}

map 的申明

1
2
map
map[string]string{"namme": "ccc"}

变量申明多种方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
var num int  // 没给初始值,默认 0
num := 1 // 这样更简洁更方便, 函数外不给使用

int, float64, bool 这都是和别的语言一样的,array , slice, map

arr1 := [...]int{1,2} // 因为不能扩展,用的比较少
slice1 := []int{1,2} // 关联数组
map1 := map1[string]string{} // 索引数组

// 换一种看法看go, 下面两种都代表数组,只是填充的对象是byte 或者是rune
[]byte{}
[]rune{}
(不管是byte 还是 rune,对应的字符序列都是 十进制,要想转换成 十六进制需要通过 hex.encodetostring ,或者 printf , 第一个只能对 slice 处理,第二个可以对数组)


// 结构体,类似
type cy struct {
name string `json:Name` // json 的时候生成key 的名称
}

cy1 := new(cy)
cy1.name = "haha"

fmt.Println(cy1.name)
//cy 类似类名,所以我们还需要变量名

// 别名
type

// map value 定义成某个字段太局限了,可以 map[string]interface{} 这样,更灵活
// := map[string]interface{}{} ,一定要给初始值

// go 中 printf %v struct 这种不够,因为 名称打印不出来,需要 %+v 打印

一次性给多个值

1
arr1, arr2 := []int{1,2}, []int{2,3}

因为go 中的异常机制和php还是有点区别的,很多函数在使用之后会有error 的返回,我们根据 error != nil ,就能知道是否错误

1
2
3
4
5
6
7
8
9

if _,error := test(x , y ); error != nil {
错误处理
}
:= ,只有多个变量中有一个是新的,:= 不会报错

真实因为go 的这种语言机制,导致 if 才能这样用,最多有两个表达式,第二个 值的内容是布尔 (上面 _ 属于匿名)

还有go 中和 js let 一样,都有块状作用域,比如那个 if 里面赋值的变量,只能在 {} 中使用

var 和 const 一次性声明多个值

1
2
3
4
5
6
7
8
9
10
var (
test1 int
test2 int
)

// 枚举,内部可以用iota
const (
test2 iota
test3
)

循环

go 中 if 和 for 都是不用括号包裹的

坚持原创技术分享,您的支持将鼓励我继续创作!
-------------本文结束感谢您的阅读-------------