Go语法快速入门 | 青训营笔记

78 阅读1分钟

Go语法快速入门 | 青训营笔记

这是我参与「第五届青训营」伴学笔记创作活动的第1天

从一个Javaer的角度来学习Go

变量

在Go语言中,变量可以通过var来声明,而数据类型也可以根据值进行推断,这一点确实比Java省事了不少

var a int
var b = 2

var也可以通过:=来进行替代

c := 3

除此之外,还可以一次声明多个变量

var d, e int = 4, 5

常量

常量的定义与变量类似,不过需要将var替换为const

const s string = "constant"

判断

同Java一样,Go也是使用if else来进行条件判断,但Go中的if else后的判别式不需要用()括住,另外就是之前刷题时为了图省事,经常if后的大括号就省略了,但在Go中这样是不允许的

num := 99
if num%2 == 0 {
    fmt.Println("even number")
} else {
    fmt.Println("odd number")
}

循环

Go语言中只有for循环,同样无需加(),也可以使用continue和break

sum := 0
for i := 1; i <= 100; i++ {
    sum += i
}
fmt.Println(sum)

switch

Go中的switch相比于Java来说更为强大,第一是因为switch case无需手动break,第二是switch后可以不加任何变量,作为if else的替代

数组与切片

在Go中,数组的定义就显得不太灵活,因为数组的长度不可改变。在Java中我们有各种容器类,来满足我们动态修改的需求,所以在Go中引入了切片。

var arr [10]int //数组定义
s := make([]int, 2) //切片定义
s[0] = 0
s[1] = 1
s = append(s, 2) //动态追加元素
fmt.Println(s) //打印结果为[0 1 2]
fmt.Println(s[1:2]) //打印结果为[1 2]

切片在底层其实对应着三个元素:指针、长度和容量,指针指向切片首位元素在存储元素数组中的地址,长度为对应切片的长度,而容量则对应从切片首位元素到数组末位元素的长度。通过内置的len函数和cap函数可以查看长度和容量

map

对于哈希表,Go中也提供了相应的实现,即map,map的定义在下方给出

m := make(map[string]int)
m["one"] = 1
m["two"] = 2
fmt.Println(m) //map[one:1 two:2]

快速遍历

在Java中,我们如果想要遍历数组,一般是通过fori或者增强for的方式遍历,而在Go中,提供一个更为简单的方式——range

for i, num := range arr {
    fmt.Println(i, num)
}

函数

Go中的函数可以有多个返回值

func 函数名(参数名 参数类型, ... , 参数名 参数类型) (返回值类型, ... , 返回值类型) {
    //function
}

但在业务代码中,我们一般只返回两个值,第一个作为返回结果,第二个作为错误信息

指针

由于Go的函数参数本质上为值传递,所以需要引入指针来满足一些特殊功能,比如交换两个数

如果函数的参数类型均为int,那么对于main函数中的两个变量,其实数值是没有发生变化的,我们需要借助指针来将地址传入

func swap(x *int, y *int) {
    tmp := *x
    *x = *y
    *y = tmp
}
func main() {
    x, y := 1, 2
    swap(&x, &y)
    fmt.Println(x, y) //输出: 2 1
}

目前看来,Go的书写确实比其他语言简化了不少,但仍有些内容还需要一段时间的适应