特性
基本
变量
组成:以字母或下划线开头,由一个或多个字母、数字、下划线
使用:先定义在使用;声明后必须使用否则会编译错误,若想忽略参见 _ 的用法
声明方式
第一种,指定变量类型,声明后若不赋值,使用默认值
var a int
var s string
//Go语言定义完之后可以不赋值fmt.Println(“%d %q\n”,a,s) //q是将引号打出来 输出是:0 “
第二种,根据值自行判定变量类型(类型推断Type inference)
第三种,使用:=定义变量:a,b,I,s1,s2 := true,false,3,”hello”,”world” 但只能在函数内使用 注意:多个变量同时声明时,至少保证一个是新变量,否则会导致编译错误(简短声明)
多变量声明
第一种,以逗号分隔,声明与赋值分开,若不赋值,存在默认值
a,b,c,s := 3,4,true,”def” 第二种,直接赋值,下面的变量类型可以是不同的类型 第三种,集合类型可放在函数内,或直接放在包内;使用var()集中定义变量
注意:相同代码块不可对同名变量使用:=进行初始化声明(已经存在),可对其重新赋值比如:a = 10
_空白标识符
只写变量,不能得到其值。 用途: 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类型,可以自行进行显示指定类型 数字常量不会分配存储空间,无须像变量那样通过内存寻址来取值,因此无法获取地址
例子:
func enums() { const( cpp=0 java=1 python=2 golang=3 } fmt.Println(cpp,java,python,golang) //输出是:0,1,2,3 func enums() { const( cpp=iota _ python golang javascript } fmt.Println(cpp, javascript,python,golang)//输出是 0 4 2 3
内建变量类型
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语句
const filename=”abc.txt” if contents,err := ioutil.ReadFile(filename);err!=null{ fmt.Println(err) } else { fmt.Printf(“%s\n”,contents) }
switch语句
switch会自动break 除非使用fallthrough(必须在某个case最后一行,否则编译器会报错)
switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型。
switch x.(type){ case type: statement(s); case type: statement(s); /* 你可以定义任意个数的case */ default: /* 可选 */ statement(s); }
select语句
类似于 switch 语句,但是select会随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。
这里涉及到channel,稍后补充
var c1, c2, c3 chan int var i1, i2 int select { case i1 = <-c1: fmt.Printf("received ", i1, " from c1\n") case c2 <- i2: fmt.Printf("sent ", i2, " to c2\n") case i3, ok := (<-c3): // same as: i3, ok := <-c3 if ok { fmt.Printf("received ", i3, " from c3\n") } else { fmt.Printf("c3 is closed\n") } default: fmt.Printf("no communication\n") }
//结果:no communication
循环语句
for是唯一的循环语句。(Go没有while循环) for条件里可省略初始条件,结束条件,递增表达式
for init; condition; post { } for condition { } for {} //死循环
for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环
for key, value := range oldMap { newMap[key] = value }
break:跳出循环体。break语句用于在结束其正常执行之前突然终止for循环。
continue:跳出一次循环。continue语句用于跳过for循环的当前迭代。
goto:可以无条件地转移到过程中指定的行。