Go语言-五天学习
介绍、安装
1 | go//package demo_fiveday |
go语言命名
25个关键字
关键字用途
数据类型
- bool 中 true false小写
- 字符串类型可相加
- 不同类型不能相加 需转换比如转成int int(a)
语言命名规范
go语言内置类型和函数
内置类型
内置函数
内置接口error
标准输入输出
1 | var s1,s2 string |
变量
变量是什么
1、变量必须先定义在使用
2、变量不能被重复定义
3、首字母大写 共有 首字母小写 私有
声明单个变量
- 基本定义:var a int = 10;
- 类型推导: var a = 10
- 简便写法: a:= 10
1 | // 变量声明 |
声明多个变量
1 | // 声明多个变量 |
常量
关键字: const
定义后 不能改变其值
1 | //常量定义 |
函数
函数定义
func 函数名(函数参数名 类型 , 参数名 类型) 返回值类型{
}
1 | /* |
匿名函数
没有名字的函数
1 | // 匿名函数,没有名字的函数,定义在函数内部 |
闭包函数
闭包:定义在函数内部 对外层作用域有引用
1 | /* |
可变长参数
1 | // 可变长参数 |
if-else
1 | // if-else 注意: i1>i2 后面不能换行 |
循环
没有while循环,只有for循环
1 | //循环 |
1 | //用for模拟while 会死循环 |
switch-case
1 | var s1 = 4 |
fallthrough
穿透下面那层 不论符合不符合 无条件执行
1 | var s1 = 4 |
数组
数组声明
1、数组有长度 有类型
2、int类型空值 0 字符串空值 “”
3、不能直接扩容 只能重新定义一个新的把数据copy过来
4、类型相同 长度不同的数组 不能直接赋值 比如: b = a
5、长度 len
6、循环两种方式: 一种for循环 另一种 range
7、给某个值赋初始值 var b7[7] int = [7]int{3:88, 2:77}
1 | var b1[3] int |
range
1 | //数组是值类型 |
多维数组
1 | // 多维数组 |
切片
可以动态往里面添加值
可以自动扩容
1、[]int 切片类型
2、切片底层依附于数组,改值 数组也会变化
3、切片动态的追加值 超过数组的len 数组不会变化 不会在依附于此时的数组 会重新定义一个长度为原来数组的两倍的新数组
切片会依赖于新数组 在改值 原来旧数组不会变 变化的是新数组
定义
1 | /* |
copy
1 | // copy |
切片当做参数传给函数
1 | //切片当做参数传给函数 函数修改 切片会被修改 |
map
1、key-value 对
2、Map是引用类型
3、判断map相等不能用== ==只能用来判断map是否为nil
4、map是无序的
1 | /* |
指针
1、符号 & 表示取地址
2、符号 * 表示通过地址取值
3、指针不支持运算 不支持增加、减少
4、数组类型指针可以直接当做数组来修改,赋值
5、切片类型指针 如要修改切片,需要反解回来 再修改
6、指向数组的指针
7、指针数组
1 | // 指针 |
Defer
1 | func defer_Test(){ |
Panic
主动抛出异常
Recover
恢复程序
一般写在defer里面 写外面不执行
1 | // panic recover |
小练习
1 | // 测试练习 |
文件
读文件
1、普通读文件 ioutil 一次性读出来 不需要手动关闭 内部自己关闭了
2、分片读文件 每次读自定义的个数 os
3、按行读文件 os
1 | /* |
写文件
1、按字节写入文件
2、按字符串写入文件
3、追加文件
1 | //写入文件 |
结构体
1 | // 结构体定义 : type 名 struct{} |
1 | package main |
方法
方法其实就是函数,在 func 这个关键字和方法名中间加了一个特殊的接收器类型。接收器可以是结构体类型或者是非结构体类型。接收器可以在放大的内部访问的。
1、基本使用
2、指针接收器和值接受器
3、函数使用指针接收器
4、自定义类型加方法
函数传参数时,有自动类型转换
不同类型不能直接相比较
1 | // 定义 -- 非结构体 |
指针接收器、值接收器
值接收器是值的copy 拷贝的结构体代价过于昂贵
指针接收器 耗费的空间很小 以后做的都用指针接收器
1 | // 定义 -- 结构体 -- 值接受器 |
接口
1、定义
2、空接口(匿名接口)interface{}
3、类型断言
4、接口的嵌入结构
5、空接口值为nil
协成(goroutin)
并发:立即处理多个任务的能力,单位时间内可以干多少的事 串串执行
并行:同时处理多个任务
1 | fmt.Println("---------协成-----------") |
通信(channel)
select
mutex
反射
总结
代码-0428
1 | //package demo_fiveday |
运行结果-0428
1 | 10 |
代码-0429
1 | package main |
运行结果-0429
1 | 排序前 [4 5 6 7 23 90 39 456 56 432] |
代码-0507
1 | package main |
运行结果-0507
1 | 2 3 4 |
代码-0510
1 | package main |
运行结果-0510
1 | -------开始导入包-----没有弄出来 不会-------------匿名字段-------------{Animal 2 都会叫 {小狗 wangwangwang}}都会叫wangwangwangtrue------------方法的使用-------------方法- {BigDog wangwangwang}-函数- {Litter Litter Dog wangwangwang}--方法-- BigDog--函数-- Litter Litter Dog---指针接收器-*c-- wangwangwang---指针接收器-c-- wangwangwang---指针接收器-*c-- wangwangwang---指针接收器-c-- wangwangwang-函数指针- wangwangwang16 |
代码-0519
1 | package main |
运行结果-0519
1 | -------接口-------- |
代码-0531
1 | package main |
运行结果-0531
1 | ----名字---- |