这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
基本语法
声明
可以使用 var 和 := 两种方式来定义变量,常量是const定义。
- 使用
:=运算符来定义变量时,Go语言会自动推断变量的类型,不需要显示声明变量类型 - 使用
:=定义变量只能在函数内部使用,而var定义变量可以在函数内外都使用
var s1 string
s1 = "Learn Go!"
var b, c int = 1, 2
s1 := "Learn Go!" // string
b, c := 1, 2 // int
d := true // bool
const pi = 3.14
primes := [...]int{2, 3, 5, 7, 11, 13}
var twoDimension [2][3]int
循环
a := 10
if a > 20 {
fmt.Println(">")
} else if a < 20 {
fmt.Println("<")
} else {
fmt.Println("=")
}
数组、切片
- 数组是一组相同类型的元素的集合,数组是固定长度的,它的长度在定义时就已经确定
- 切片是一种动态数组,它可以在程序运行过程中动态增加和删除元素。
- 切片是一种引用类型,它只存储数组的指针,并不直接存储数组。
var arr [3]int
var slice []int slice = append(slice, 1)
结构体
- 一种自定义类型,可以用于存储多个不同类型的字段,关键字有type和struct
- 可以定义schema一类的,一系列字段组成,每个字段都有自己的名字和类型
- 其他的一些使用和Java类似,都是XX.xx去使用
type Person struct {
name string
age int
}
接口
一种特殊的类型,它定义了一组方法,但没有实现。通过type和interface关键字声明接口
type Shape interface {
area() float64
}
收获
风格差异
感觉比较不一样的是Go语言和Java的风格有点不太一样,虽然可以在导入语句的前面添加.,这样子可以直接使用,但是出现同名还是得包.xx去使用。
指针
其他区别比较大的是指针的使用,指针是一种特殊的变量,它存储了另一个变量的地址,这样子就可以通过指针来操作那个变量。通过*T的语法声明指针。
var p *int
这表示 p 是一个指向 int 类型的指针。
x := 1
p = &x
这样我们就获取了 x 变量的地址,并将其存储到了 p 指针变量中,可以通过 * 号来访问指针变量
我觉得使用指针的优势比较重要的一点就是在函数之间传递参数的时候,使用指针可以避免内存中复制变量的副本,这样子做可以提高程序的效率,下面是一个简单的add函数例子,直接传入的是地址,从根本上修改了x变量
func add(x *int, y int) {
*x += y
}
x := 1
add(&x, 2)
fmt.Println(x) // 3