加载中
Go语言基础
环境配置
Linux下go环境安装
在官网上安装源码.tar.gz文件
将文件解压到系统中
配置环境变量
在 ~/.bashrc中添加以下几行
go语言特性
静态编译型语言
- 静态:强类型,在编译的时候就确定
- 编译型:相对于解释型少一个解释器,直接由源代码编译得到二进制程序
第一个go语言程序
编译工具
- go run命令直接编译执行:go run HelloGo.go
- go build 命令先编译得到可执行文件
- go build -o HelloGo HelloGo.go 或者 go build HelloGo.go 会生成一个HelloGo可执行文件。
基本语法
变量声明和初始化
基本样式
- var name TYPE
- var name TYPE = 表达式
- var a = 100 或 b:= "hello"
注意::= 不能用于全局变量的声明和初始化,同时其左值中的变量最少有一个变量必须是未定义过的变量
多重赋值
- *交换a,b的值可以使用 **a,b = b,a
匿名变量
- *函数使用多返回值时,使用 **a,_:=getName() _为匿名变量,不占用命名空间和内存
数据类型
整型
- 按长度:int8,int16,int32,int64
- 按有无符号:uint8,uint16,uint32,uint64
浮点型
两种:float32和float64
布尔型
true和fasle
注意:bool与整型不能转换,bool型不能参与数值运算
字符串型
String
注意遍历字符串的时候可以以byte和rune两种方式,具体参考字符类型:byte和rune
默认for range遍历使用rune方式
类型断言
- 断言x不为nil且x为T类型
- 如果T不是接口类型,则该断言x为T类型
- 如果T类接口类型,则该断言x实现了T接口
直接赋值的方式,如果断言为true则返回该类型的值,如果断言为false则产生runtime panic;j这里赋值直接panic
不过一般为了避免panic,通过使用ok的方式
另外一种就是variable.(type)配合switch进行类型判断
泛型
指针
具体内容和C语言差不多,只不过限制了指针类型的偏移和运算能力,增加了自动垃圾回收机制
【实例】使用flag从命令行中读取参数
- *在命令行中输入 **go run Flag.go -surname="苍" -personalName="小屋" -id=100 得到输出:I am 苍 小屋,and my id is 100
Flag支持
常量与类型别名
常量
使用const关键字
类型别名
- 定义类型别名:·type name = TYPE·
- 定义新类型:·type name TYPE·
分支循环
条件语句
- If else条件语句注意与if匹配的"{"和if在同一行;else必须与上一个分支的"}"位于同一行
- switch语句不需要用break,可以用fallthrough关键字连接两个case;可以对字符串和复杂表达式进行判断;可以写成if-else类型:switch后没有变量,case后接条件判断表达式。
循环
只有一种for循环
常见容器
数组
声明初始化的几种方式
var name [size]TYPE
name := [...]string{"xiaoming","xiaohong","xiaoli"}
name := new([size]TYPE)
使用指针操作数组时不支持偏移和运算。
切片
从原生数组中生成切片
slice := source[begin:end]包括begin不包括end;修改切片相当于修改数组
动态创建切片
make([]TYPE,size,cap)得到的切片会被初始化为其类型的初始值
声明新的切片
var name []TYPE相当于声明数组时没有设置大小
向切片中添加元素
使用append函数
size<=cap时:更新原数组
size>cap时:申请新空间
**可以使用 **copy(destSli,srcSli []TYPE) 复制切片
列表与字典
列表
双向有序链表,每个节点可以是不同的数据类型
引入container/list包
初始化:var name list.List or name := list.New()
对应函数:
- PushBack(element)
- PushFront(element)
- Remove(element)
- 头元素:Front()
- 下一个元素:Next()
字典
初始化
判断map中某个键是否存在
value,ok := classmate2[1] if 存在 then ok为true.
容器遍历
使用for-range遍历
注意:遍历循环体中对k,v修改不会影响到原容器的内容
函数与接口
函数的声明和参数传递
具体样式
可返回多个参数
注意:如果函数需要在包外的代码使用,则函数名要大写
匿名函数和闭包
匿名函数:初始化和调用一起
主要用于回调函数和闭包
回调函数
函数作为参数传递,实现回调。
闭包
携带状态的函数叫做闭包,包的是函数和变量环境
接口声明和嵌套
接口:调用方和实现方约定的一种合作协议。调用者不关心接口的实现方式,实现者通过接口暴露自己的内在功能。每个接口有一个或多个方法
注意:只有当接口名和方法名的首字母都为大写的时候,表示公开,包外可以被访问
样式
接口是可以嵌套的
函数体实现接口
go语言中的所有类型都可以实现接口
首先定义一个接口:
将函数定义为类型之后实现接口:
具体使用:
结构体和方法
结构体定义
样式
注意:结构体公开则其名首字母大写;字段公开则字段名首字母大写
结构体的实例化和初始化
实例化
声明实例化
函数实例化
取址实例化
初始化
方法和接收器
方法定义样式
注意:接收器最好选用指针类型
结构体实现接口
接口Cat,Dog定义+实现结构体CatDog定义+接口(方法)实现
具体实现:
内嵌和组合
结构体内部可以内嵌结构体,也可有匿名字段
继承
上一篇
Go语言进阶
下一篇
Golang
Loading...