Go语言学习总结(一)
Go语言学习总结(一)
一、Go语言简介
1. Go语言用途
搭载Web服务器,存储集群或类似用途的巨型中央服务器的系统编程语言
在高性能的分布式系统领域,Go语言比其他语言有着更高的开发效率
2. Go语言特点
自动垃圾回收、丰富的内置类型、函数多返回值、错误处理、数组安全
匿名函数和闭包、类型和接口、并发编程、反射、语言交互性等
3. 设计思想
目前主流的编程思想主要有面向对象编程、面向过程编程,但是Go语言在设计的过程中吸收了一些
小众的编程哲学思想,比如函数式编程思想(支持匿名函数与闭包), 面向消息编程思想(支持 goroutine
和通道),因此Go推荐使用消息而不是共享内存来进行并发编程
二、Go语言基础语法
1. 程序组成元素
(1)包声明
源文件中非注释的第一行指明这个文件属于哪个包,如package main, package main表示一个可独立执行的
程序,Go程序是通过package来进行组织的,只有package名称为main的源码文件可以包含main函数
(2)引入包
导入程序所要使用的包 fmt包格式化的输入输出
导入包时可以通过import关键字来单个导入,也可以同时导入多个,如:
//单个导入
import "fmt"
import "io"
//同时导入多个
import (
"fmt"
"math"
)
文件名与包名没有直接关系、同一个文件夹下只能有一个包名,否则编译报错
导入包时一般为 import "项目名/包名"
调用函数时则是通过PackageName.FunctionName() 来进行调用
(3)函数
fun main()是程序开始执行的函数,该函数也是每一个可执行程序所必须的,每个函数后都会有{},但是 " { "
是不能单独放置在一行中的,否则在运行时会产生错误
(4)标识符
以一个大写字母开头的标识符,可以被外部包的代码所使用,这被成为导出,类似于public
以一个小写字母开头的标识符,对外包则是不可见的,在整个包的内部是可见的,类似于private
(5)语句
每行一条语句,且不需要加分号
语句中适当使用空格能够让程序更加容易地阅读,但是变量的声明必须使用空格来进行隔开
2.程序的基本结构
程序的基本结构示例:
//当前程序的包名
package main
//导入其他包
import "fmt"
//常量的定义
const PI = 3.14
//全局变量的声明和赋值 在函数外部定义的变量
var name = "CSUYZZ"
//一般类型的声明
type newType int
//结构体的声明
type structName struct{}
//接口的声明
type golang interface{}
//函数的声明
fun funname(){}
//main函数、程序的入口点
fun main(){
fmt.Println("Hello World!")
}
3.Go语言数据类型
划分不同的数据类型就是为了最大限度的利用内存
(1)布尔型
布尔型值:true false 示例:var flag bool = false
(2)数字类型
整型:uint8 、uint16、uint32、uint64、int8、int16、int32、int64
浮点型:float32、float64、complex64(32位的实数和虚数)、complex128(64位的实数和叙述)
其他数字类型:byte、rune、uint(32位或64位)、int(32位或64位)、uintptr(指针)
(3)字符串类型
Go语言的字符串由单个字节连接,使用UTF-8编码来标识Unicode文本
==注意==:字符串类型在Go语言中是个结构,大小为16个字节
(4)派生类型
指针类型、数组类型、结构体类型、Channel类型、函数类型、切片类型、接口类型、Map类型
(5)类型转换
基本格式:type_name(expression)
4.变量&常量
(1)变量声明
变量声明可以先定义后初始化、也可根据值自动判定变量类型、还可以省略var,示例代码如下
Go语言是非常严格的,函数内部变量在声明之后必须被使用,全局变量允许声明但不使用
//1.指定变量类型定义,再初始化;如果不初始化则变量值为系统默认值
var vname vtype
vname = value
var v1,v2,v3 type
//常见数据类型的系统默认值
/*
数值类型 : 0
布尔类型 : false
字符串为 : ""
以下几种类型均为nil
var a *int
var a []int
var a map[string] int
var a chan int
var a func(string) int
var a error (接口)
*/
//2.根据值自动判别变量类型
var vname = value
var vname1,vname2,vname3 = v1,v2,v3
//3.省略var := 左侧如果没有声明新的变量,就会产生编译错误 首选形式
//该种方法只能用于函数体内,全局变量则不能使用
vname := value
//并行赋值
vname1,vname2,vname3 := v1,v2,v3
//交换两个变量的值
a,b = b,a
//空白标识符_被用于抛弃值,_实际上是一个只写变量,不能得到它的值
//Go语言中要求你必须使用所有被声明的变量,但有时并不需要得到一个函数的所有返回值
_,b = 5,7
//4.所有变量的声明置于{}中 一般用于全局变量的声明 程序更加结构化
var (
vname1 vtype
vname2 vtype
)
(2)常量
常量定义使用const关键字,定义的方式与变量相同
特殊常量:itoa ,可以被编译器自动修改的常量;itoa在const内部的第一行被重置为0,const中每新增一行常量
itoa加一,可以将它理解为iota的行索引,示例代码:
//itoa可以被用作枚举值
const (
a = itoa //a=0
b = iota //b=1
c = iota //c=2
)
//也可以简写为
const (
a = iota //a=0
b //b=1
c //c=2
)
5.条件语句
(1)if语句使用语法
- 不需要使用括号将条件包含起来
- 大括号{}必须存在,即使只有一行语句
- 左括号必须在if或者else的同一行
- 在if之后,条件语句之前,可以声明变量,但是其作用域只能够在该条件逻辑块内
- 在有返回值的函数中,最终的return 不能在条件语句中
(2)switch语句使用语法
- 每个case语句后默认自带break语句,匹配成功后就不执行其他语句
- 使用fallthrough会强制执行后面的case语句,不会判断下一条case语句的表达式结构是否为True
- switch支持多条件匹配
(3)select语句使用
select语句就是通信中的switch语句
每个case都必须是一个通信
所有channel 表达式都会被执行
所有被发送的表达式都会被求值
如果任意某个通信可以进行,它就执行,其他被忽略
如果有多个case可以执行,Select会随机公平地选出一个执行,其他不会执行
否则,如果有default语句,则执行该语句;
如果没有,select将阻塞,直到某个通信可以运行;Go不会对channel或值进行求值
6.循环语句
for循环的常见使用示例如下:
for init; condition; post {}
for condition{} //相当于while
for { } //相当于for(;;) 无限循环
//for循环的range形式可以对slice,map,数组,字符串等进行迭代循环
for key,value := range oldMap {
newMap[key] = value
}
三、Go语言数据类型详解
数组、指针、结构体、切片(Slice)、范围Range、Map集合、接口
四、Go语言特征详解
并发、错误处理