Go语言基础

环境配置

Linux下go环境安装

在官网上安装源码.tar.gz文件
将文件解压到系统中
配置环境变量
在 ~/.bashrc中添加以下几行

go语言特性

静态编译型语言
  • 静态:强类型,在编译的时候就确定
  • 编译型:相对于解释型少一个解释器,直接由源代码编译得到二进制程序

第一个go语言程序

编译工具

  1. ​go run​命令直接编译执行:go run HelloGo.go​
  1. ​go build​ 命令先编译得到可执行文件
    1. ​go build -o HelloGo HelloGo.go​ 或者 go build HelloGo.go​ 会生成一个HelloGo可执行文件。

基本语法

变量声明和初始化

基本样式

  1. ​var name TYPE​
  1. ​var name TYPE = 表达式​
  1. ​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...
文章列表

加载中