Go语言笔记-类型

类型

变量

简短模式:

简短模式的限制 - 定义变量,同时显式初始化 - 不能提供数据类型 - 只能用在函数内部

简短模式也可以是部分退化的赋值操作,即一部分变量定义,一部分只是赋值

func main() {
	x := 100
	println(&x)

	x,y := 200, "abc"
	println(x,y)

	y,z := "asd", 100
	println(y,z)
}

在退化赋值中,靠左变量定义和靠右变量定义都可以.

可以看出,赋值退化的前提条件是,至少有一个新变量被定义,并且必须是同一作用域 退化赋值的常用场景是在接受错误类型时,我们可以重复使用err变量

多变量赋值

func main(){
  x,y:= 1,2
  x,y:= y+2, x+3
  println(x,y)
}

底层过程是先算出所有右值,再进行赋值操作

#### 未使用错误 编译器将未使用的局部变量

常量

常量必须是编译期可确定的基础数字类型(字符、字符串、数字和布尔值)。 可以在函数代码块中定义常量

func main(){
	const x  = "abc"
	println(x)

	{
		const x  = 100
		println(x)
		const y  = 1.1
	}
}

output:

abc
100

在常量组中,如果不指定类型和初始化值,则与上一行非空常量右值相同

import "fmt"

func main() {
	const (
		x uint16 = 120
		y
		s = "abc"
		z
		p
	)
	fmt.Printf("%T, %v\n", y, y)
	fmt.Printf("%T, %v\n", z, z)
	fmt.Printf("%T, %v\n", p, p)
}

output:

uint16, 120
string, abc
string, abc

枚举

Go语言没有明确的emun类型,但是可以借助iota标识符实现一组自增量来实现枚举类型。 iota的自增作用范围为常量组,可在多常量定义中使用多个iota。他们单独计数,只需确保组中每行常量个数相同。

import "fmt"

func main() {
	const (
		_, _ = iota, iota * 10
		a, b
		c, d
		e, f = 10, iota
	)
	fmt.Println(a, b)
	fmt.Println(c, d)
	fmt.Println(e, f)
}

output

1 10
2 20
10 3

展开

常量会在编译器预处理阶段直接展开,作为指令使用。数字常量不会分配存储空间,因此无法获取地址。

基本类型

别名

byte alias for unit8
rune alias for int32

但相同底层结构一致不一定是别名。

## 引用类型 特指slicemapchannel这三种预定义类型。 与基本类型相比,它们拥有更复杂的存储结构,除了分配内存以外,还需初始化指针、长度、甚至哈希分布、数据队列等。

类型转换

强制要求显式类型转换。