本文以语法定义等为主。说一下go中基本的语法糖。
基本类型
go中的基本类型主要有:
- 数值型:分为整数,小数,复数。默认值为0.
- 整数:int后面加个数字,如int8,int16等。
int
类型根据系统的位数变化,64位系统就是int64,32位就是int32。类型rune
==int32。 - 小数:只有
float32
和float64
- 复数:complex64和complex128
- 整数:int后面加个数字,如int8,int16等。
- 布尔型:bool。默认为false
- 字符串型:string。默认为""
在数值类型中,前面带u表示无符号数值,如int8的范围为-128127,而uint8的范围为0255.
定义与赋值
普通变量定义
如在java中int a=32,在go中有如下写法:
var a=32
var a int=32
a:=32
a:=int(32)
一共3种写法,可以看到第一种的int是可以忽略掉的。在局部变量时,var也可以省略。但在全局变量必须要有var。
在局部变量定义时,可以省略var,用: 来替代(参见第一行和第四行)。该方式适用于所有变量,包括后面的高级数据类型和对象,而且也是以后用的最多的一种。
如果是单纯的只定义a,如下(这个只有一种):
var a int
常量定义
常量的定义有以下两种方式:
const name string = "Q"
const name1 = "Q"
复合定义
普通变量复合定义
//全局或局部都可以使用 a=1,b=2
var a, b = 1, 2
//等效于
var (
a = 1
b = 2
)
//只能局部使用
c, d := 3, 4
常量复合定义
//a=1,b=2
const a, b = 1, 2
//等效于
const (
a = 1
b = 2
)
特殊定义
对于不想要的变量,可以赋值给_
,表示该值不可用。可以用于任何值的赋予,包括常量和普通变量。
在常量定义时,有特殊变量iota
。在每一次遇到const时,重置为0;在每一次换行后+1.
const (
a,b = iota,iota*2
c,d
_=iota
e=iota
)
//相应的打印控制台
fmt.Println(a, b, c, d, e)
输出为:0 0 1 2 3
在const括号中,没有再遇到const,所以换行后➕1.而_
那一行,表示跳过一个值。
因为a,b在同一行,且都在第一行,所以此时iota是起始值0,第二行iota是1,c=iota即1,d=iota*2即2,第三行iota=2但是跳过,第四行iota=3赋予给e。
对于const()
,如果上一行的变量有值或者表达式的赋予,则这一行默认的赋予为上一行的表达式或者值。
示例如下:
const (
a,b = 4,5
c,d
e=3
)
此时c,d=4,5
,而e
与上一行的格式不同,不能套用上面的规律,需要单独赋值。
加载顺序
- 程序的入口为
main()
方法,且必须为package main
; - 多个没有父子依赖关系的文件,按照字母顺序排列加载;
- 有依赖关系的文件,先加载父文件,再加载子文件。在加载时会读取
init()
方法(如果有的话); - 多次导入,只算第一次;
- 以下划线
_
为别名的import,只加载init()方法,其他方法忽视掉; - 加载的文件可以定义别名,在运算时,以别名为准,相同的才可以计算;
- 文件夹不必和package相同,但一个文件夹下不同文件的package必须相同;
go不解决循环依赖的问题。
底层推断
话外,此处提及一下go中的关于类型推断:
i:=33.0
//类型推断:输出类型
fmt.Println(reflect.TypeOf(i))
//字节推断:输出字节长度
fmt.Println(unsafe.Sizeof(i))
此处会输出类型,如果有指定,指定的优先。未指定则输出默认的类型,如整数默认是int,float根据系统位数来。
类型推断也会根据系统的位数,如64位系统,默认算出的int的为8字节,即int64(32位系统为int32)。推算中的浮点数为float64,也是8字节的。
温馨提示:
如果在看完后,有什么意见或者建议,欢迎留言。
网友评论