Go基础语法篇
变量、内建变量类型、常量与枚举、条件语句、循环、函数、指针
语法
变量
组成:以字母或下划线开头,由一个或多个字母、数字、下划线
使用:先定义在使用;声明后必须使用否则会编译错误,若想忽略参见空白字符_用法
作用域
变量可以在三个地方声明:局部变量(函数内定义)、全局变量(函数外定义)、形式参数(函数定义中)
局部变量:作用域在函数体内,参数和返回值变量也是局部变量
全局变量:首字母大写全局变量可在包甚至外部包(被导出后)使用
形式参数:会作为函数的局部变量来使用
声明方式:var
第一种,指定变量类型,声明后若不赋值,使用默认值
第二种,根据值自行判定变量类型(类型推断Type inference
第三种,使用:=定义变量 只能在函数内使用,否则会报错
多变量声明
第一种,以逗号分隔,声明与赋值分开,若不赋值,存在默认值 第二种,直接赋值,下面的变量类型可以是不同的类型 第三种,集合类型可放在函数内,或直接放在包内;使用var()集中定义变量 注:相同代码块不可对同名变量使用:=进行初始化声明(已经存在),可对其重新赋值 注:变量必须定义之后使用,定义了必须使用
_空白标识符
只写变量,不能得到其值。 用途: 1)声明后不想使用所有,比如不需要从一个函数得到所有值 2)并行赋值
常量
数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型
注:不曾使用的常量,在编译的时候,是不会报错的
const identifier [type] = value 显式类型定义: const b string = "abc" 隐式类型定义: const b = "abc"
特点
常量定义枚举类型,Go无枚举关键字
Const数值可作为各种类型使用
使用iota表示自增值
Go语言大小写有含义,常量不需要全部大写
常量组中如不指定类型和初始化值,则与上一行非空常量右值相同
iota
特殊常量,可以认为是一个可以被编译器修改的常量
在每一个const关键字出现时,被重置为0,然后再下一个const出现之前,每出现一次iota,其所代表的数字会自动增加1
iota 可以被用作枚举值
注意: 如果中断iota自增,则必须显式恢复。且后续自增值按行序递增 自增默认是int类型,可以自行进行显示指定类型 数字常量不会分配存储空间,无须像变量那样通过内存寻址来取值,因此无法获取地址
例子:
内建变量类型
bool
布尔型的值只可以是常量 true 或者 false
Numeric Types
int8,int16,int32,int64,int (注:int根据系统32还是64决定)
int8 有符号 8 位整型 (-128 到 127) int16 有符号 16 位整型 (-32768 到 32767) int32 有符号 32 位整型 (-2147483648 到 2147483647) int64 有符号 64 位整型 (-9223372036854775808 到 9223372036854775807)
uint8,uint16,uint32,unint64,unit
uint8 无符号 8 位整型 (0 到 255) uint16 无符号 16 位整型 (0 到 65535) uint32 无符号 32 位整型 (0 到 4294967295) uint64 无符号 64 位整型 (0 到 18446744073709551615)
int 与 unit 都是 32位或者64位
uintptr 无符号整型,用于存放一个指针
float32,float64
float32 IEEE-754 32位浮点型数 float64 IEEE-754 64位浮点型数
complex64,complex128
complex64 32 位实数和虚数 complex128 64 位实数和虚数
byte 类似unit8
rune 类似int32 (注:Go中没有char )
string
一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的,字节使用UTF-8编码标识Unicode文本。
分支循环
if 语句
If的条件里可以赋值;赋值的变量作用域在该if语句
语法:
switch语句
switch会自动break 除非使用fallthrough(必须在某个case最后一行,否则编译器会报错)
注:如果switch没有表达式,它会匹配true,Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动下面语句
switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型。
例子:
select语句
类似于 switch 语句,但是select会随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。
循环语句
for是唯一的循环语句。(Go没有while循环)
for条件里可省略初始条件,结束条件。 for 初始条件; 循环条件; 结束条件 { } ,初始化语句只执行一次
for循环条件可选:for condition { } 相当于while 。注:for { } 相当于死循环,效果等同于for(;;)
注意:在for循环中声明的变量仅在循环范围内可用。因此,i不能在外部访问循环。
for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环
break:跳出循环体。break语句用于在结束其正常执行之前突然终止for循环。
continue:跳出一次循环。continue语句用于跳过for循环的当前迭代。
goto:可以无条件地转移到过程中指定的行。
函数
函数返回多个值时可以起名字,仅用于非常简单函数(对调用者无区别)
可变参
定义 func myfunc(arg ...int) {} 函数体中变量arg是一个int的slice
参数传递
Go语言函数参数传递也存在:值传递和引用传递
比如: func add1(a *int) int 定义了一个引用传递,其返回值是 return *a 使用方法是 x := add1(&x0)
闭包
Go支持匿名函数,可作为闭包
匿名函数
指针
指针作为接收者:
工程目录结构:
atomic.go学习
读取文件
打印文件
打印跨行字符串
branch.go
convertToBin
func.go学习
basic.go
triangle_test.go
输出是: