开心一刻
宿舍里有个室友喜欢早起锻炼,锻炼完买一屉小笼包,往桌子上一放,然后刷牙洗脸去了。回来一看,包子没了!他好生气。
于是第二天买回包子就当着所有人的面儿把包子舔了一遍。刷完牙回来一看,包子还在,但馅儿没了…
变量定义
- 函数中可以不使用var,直接使用:=让编译器推导变量类型并定义
- 在包中,必须使用var来定义变量并赋值,类型可以不写,不能用:=
- 变量定义了以后必须使用,否则就会出现编译错误,这是go语言比较严格的一点
- 变量定义多个写在一行的时候,可以初始化不同类型的值,这个时候不需要写变量类型
- go语言定义了变量之后都会有默认的初始值,和c语言不同
- go语言变量有确定的类型之后,再进行计算的时候不会进行隐式转换,必须强制类型转换才可以。
- nil 可以用作 interface、function、pointer、map、slice 和 channel 的“空值”。其他类型均不可以。
- 在golang中,常量是无法取出地址的,因为字面量符号并没有地址而言。
分支语句
- if分支中判断条件不加括号
- if语句可以加上执行语句,然后再写判断条件,执行语句要加分号,这样的话执行语句中定义的变量都只在if语句中起作用
- switch case语句中不需要写break,switch可以没有条件,直接在case中判断条件
循环语句
- 用于循环语句中的关键字只有for,没有while,因为for完全可以替换while
- for中的初始条件、循环条件、递增条件都有的时候就和c语言中的for一样;没有初识条件的时候要有分号;只有循环条件的时候分号也可以不写,三个条件都省的时候是死循环。
函数
- 返回值类型写在最后面
- 可返回多个值
- 函数可以作为参数
- 没有默认参数,但有可选参数
- go中函数调用有一种表达式调用,这种调用指的是直接使用类型名调用函数,但是此时T类型只能调用T类型的接收者,*T类型能调用T类型的接收者和*T类型的接收者。
package main
type Data struct{}
func (Data) TestValue(){}
func (*Data) TestPointer() {}
func main() {
var a Data = struct{}{}
a.TestValue()//这种叫做值调用
a.TestPointer()//这种叫做值调用,隐式转换成(&a).TestPointer()
var b = &Data{}
b.TestValue()//这种叫做值调用,隐式转换成(*b).TestValue()
b.TestPointer()//这种叫做值调用
Data.TestValue(a)//这种叫做表达式调用
//Data.TestPointer(a)//这种表达式调用会出错
(*Data).TestValue(&a)//正确,可以这样调用
(*Data).TestPointer(&a)//正确,可以这样调用
}
- 在函数有多个返回值时,只要有一个返回值有指定命名,其他的也必须有命名。 如果返回值有有多个返回值必须加上括号; 如果只有一个返回值并且有命名也必须加上括号。
结构体
- 结构体比较规则注意1:只有相同类型(相同类型指自定义类型名称一样)的结构体才可以比较,结构体是否相同不但与属性类型个数有关,还与属性顺序相关.
- 结构体比较规则注意2:自定义类型是相同的,但是结构体属性中有不可以比较的类型,如map,slice,则结构体也不能用==比较。