Go学习笔记——第2章 类型

注:GO系列文章是 雨痕《Go语言学习笔记》的读书笔记,仅用于个人学习记录,侵权删。

2.1 变量

定义

var x int	//自动初始化为0

var y = flase	//自动类型推断为bool类型

var x, y int	//相容类型的多个变量

var m, n = 100, "hello"  //不同类型的初始化  

简短模式

  • 简短模式的限制

    ​ ① 定义变量,同时显示初始化

    ​ ② 不能提供数据类型

    ​ ③ 只能在函数内部使用

  • 简短模式的优势

    定义在函数多返回值,以及if、for、switch等语句中定义局部变量非常方便

    x := 100  //简短模式单变量赋值	
    
    x, y := 1, 2 //多变量赋值
    
    x, y = y+3, x+2 //
    
  • 退化赋值

    最少有一个新变量被定义,且必须是同一作用域

    func main() {
    	x := 100
    	fmt.Println(&x, x)
    
    	x := 200 //注意: 语法错误
    
    	x, y := 200, "abc" //注意: x退化为赋值操作,仅有y是变量定义
    	fmt.Println(&x, x, y)
    }
    
    //运行结果
    0xc0000b4008 100
    0xc0000b4008 200 abc
    
    func main() {
    	x := 100
    	fmt.Println(&x, x)
    	
    	{
    		x, y := 200, 300  //不同的作用域,全是新变量的定义,两个x的地址不同
    		fmt.Println(&x, x, y)
    	}
    }
    
    //运行结果
    0xc000016058 100
    0xc000016068 200 300
    

2.2 命令

命名建议

  • 以字母或下画线开始,由多个字母、数字和下画线组合而成。
  • 区分大小写。
  • 使用驼峰( camel case )拼写格式。
  • 局部变量优先使用短名。
  • 不要 使用保留关键字。
  • 不建议使用与预定 义常量、类型、内置函数相同的名字。
  • 专有名词通常 会全部大写,例如escapeHTML。

符号名字首字母大小写决定了其作用域。首字母大写的为导出成员,可被包外引用,而小写则仅能在包内使用。

空标识符

  • "_"下划线通常作为忽略占位符使用,可做表示式左值,无法读取内容。
    import (
    	"fmt"
    	"strconv"
    )
    
    func main() {
    
    	x, _ := strconv.Atoi("12") //将字符串转成int
    	fmt.Println(x)
    }
    
    //运行结果
    12
    

空标识符可以用来临时规避编译器对未使用变量和导入包的错误检查。但空标识符是预置成员,不能重新定义。

2.3 常量

  • 定义
    常量值必须是编译期间可以确定的字符、字符串、数字或布尔值。
    const x, y  int = 123, 0x22
    
    const s = "hello, world"
    
    const c = 'c'
    

2.4基本类型

类型长度默认值说明
bool1false
byte10unit8
int,unit4,80默认整数类型,依据目标平台,32或64位
int8,unit810-128 ~ 127, 0 ~255
int16,unit1620-32768 ~ 127, 0 ~65535
int32,unit63240-21亿 ~ 21亿, 0 ~42亿
int64,unit6480
float3240.0
float6480.0
complex648
complex12816
rune40Unicode Code Point, int32
unitptr4,80足以存储指针的null
string”“字符串,默认值为空字符串,而非NULL
array数组
struct结构体
functionnil函数
interfacenil接口
mapnil字典,引用类型
slicenil切片,引用类型
channelnil通道引用类型
  • 别名
    byte alias for uint8
    rune alias for int32
    
    别名类型无须转换,可以直接赋值
    func test(x byte) {
    	println(x)
    }
    

2.5 引用类型

所谓的引用类型特指 slice、map、channel这三种预定义类型。引用类型拥有更加复杂的存储结构。
引用类型必须使用make函数创建,编译器会将make转换为目标类型专用的创建函数。

func mkmap() map[string]int {
	m := make(map[string]int)
	m["a"] = 1
	return m
}

func main() {
	m := mkmap()
	println(m["a"])
}

//运行结果
1

2.6 类型转换

隐式转换造成的问题远大于它带来的好处。
除了常量、别名类型以未命名类型外,Go强制要求使用显示类型转换。

a := 10
b := byte(a)
c := a + int(b) //混合类型表示式必须确保类型一致

2.7 自定义类型

使用关键字type定义用户自定义类型。

type flags byte

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页