语言简介
1.Go语言即具备python等动态语言的开发速度,又拥有C/C++等编译型语言的性能与安全性。又被称作21世纪的C语言,不但能够访问底层操作系统还提供了强大的网络编程和并发编程,分布式编程。
为何创建GO
C语言,却难以开发,编译速度依赖性、运行时错误都非常多
java语言需要虚拟机才能运行代码
javascript和node.js 回调多,类型混乱,依赖性包查找也挺麻烦,更重包管理器
需要什么样的语言呢?
- 需要快编译,类似解释性语言, 那么就只有参考Python,js 了
- 不能类型混乱,可以参考Java ,C
- 不能依赖混乱,可以参考java
- 不能虚拟机,编译为字节码,装载为机器码;而是直接变为机器码
- 但是内存问题,不能学C,只能学Java,自带内存管理
- 响应大数据时代,突破线程限制,改用协程。协程很微型,不会占用电脑资源。一台电脑可以轻松开启成千上万个协程。
最终集合到的就是解释型的、强类型支持的,自带依赖包、内存管理 、直接机器码的
环境配置
下载
- 在go的官方网址上下载go最新版本golang.google.cn/。
- 或者 Go 的中文网上下载 studygolang.com/dl
环境变量配置
安装成功与否,go version 进行check
windows
配置 GOPATH, 可以自定义目录
Linux
压缩文件解压到指定目录
1 | sudo tar -xzf go1.13.4.linux-amd64.tar.gz -C /usr/local |
1 | vim .bashrc |
添加环境变量到 .profile 这个配置文件中
1 | #?? 为何 |
导入包
1 | import ( "fmt" "os" ) |
变量
定义
变量定义使用var
1 | var name string ; |
变量互换
不是从地址角度,从人角度,直接互换就行
1 | var a, b int = 100,200; |
匿名变量
_ 下划线表示”_” 也称为空白标识符,任何类型都可以使用它进行赋值,而且任何类型赋值后都将直接被抛弃,所以在使用匿名变量时,表示后续代码不需要再用此变量
常量
- 常量数值不能修改。
- 常量定义后可以不使用。
- 常量定义不能使用简短定义方式。
- 常量中使用的数据类型只能是 整型、布尔、浮点、复数类型、字符串类型
iota常量
iota是常量里面的计数器,初始值默认值是0,可以被编译器自动修改,每const定义一组常量时,iota逐行自增1。常被用作枚举值
数据类型
基本数据类型和复合数据类型, 数据类型要兼容才能转换,否则容易丢失数据精度;Type(x)是强制转换。
基本数据类型
整型
byte uint8 的别称 rune int32 的别称
数据类型 | 说明 | 取值范围 |
---|---|---|
有符号整数 | ||
int8 | 有符号 8位整数 | -128到 127 |
int16 | 有符号 16位整数 | -32768 到32767 |
int32 | 有符号 32位整数 | -2147483648到2147483647 |
int64 | 有符号 64位整数 | -9223372036854775808到9223372036854775807 |
无符号整数 | ||
uint8 | 无符号 8位整数 | 0到255 |
uint16 | 无符号 16位整数 | 0到65535 |
uint32 | 无符号 32位整数 | 0到4294967295 |
uint64 | 无符号 64位整数 | 0到18446744073709551615 |
浮点
float32 和 float64
在内存中占有的字节数不同
- 单精度浮点数在机内占4个字节。
- 双精度浮点数在机内占8个字节。
有效数字位数不同
- 单精度浮点数 有效数字7位。
- 双精度浮点数 有效数字16位。
使用情况区别
- 一般用来表示美元和分的时候用单精度类型。
- 超出人类经验的数字函数,例如 sin() cos() tan() sqrt() 都使用双精度值。
布尔
true 、false
字符串
字符
位操作赋
- ^ 异或 - 同为0 ,不同1
- &^ 位清空 - a&^b , b为0去a;b为1,取0;
- << , >>
error
复合数据类型
类型输出
占位符 | 说明 | 举例 | 输出 |
---|---|---|---|
%d | 十进制的数字 | fmt.Printf(“%d”,10) | 10 |
%b | 二进制的数字 | fmt.Printf(“%b”,5) | 101 |
%T | 取类型 | b :=true fmt.Printf(“%T”,b) | bool |
%s | 取字符串 | s :=”123” fmt.Printf(“%s”,s) | 123 |
%t | 取bool类型的值 | b:=true fmt.Printf(“%t”,b) | true |
%p | 取内存地址 | p :=”123” fmt.Printf(“%p”, &p) | 0xc0000461f0 |
标记
Go语言中有四类标记:标识符(identifiers)、关键字(keywords)、运算符(operators)标点符号(punctuation)以及字面量(literals)
逻辑控制
{} 代码块不可省略,但是() ,可以省略;
if
if条件判断语句中,可以插入一段执行赋值
1 | if err:= function(); err == nil {} |
for
简式声明可能常常出现在函数内部
1 | for i:= 0 ; i < 100;i ++ { |
switch
可以不用特意添加break,结束语句; fallthrought ,会强制执行下一条case, 不论真假条件
return
内置的包
strings - 字符串处理
strconv - 字符转基本类型
time - 时间日期处理
包管理
dep
和glide
在项目中加入了vender
目录来存储所有项目中需要引入的包。dep init 生成gopkg.lock(清单文件),gopkg.toml(描述文件)
1 | MacOS `brew install dep` |
mod
使用go mod
管理项目,不需要非得把项目放到GOPATH指定目录下,可以在电脑上任何位置新建一个项目。
mod初始化
使用mod需要注意的是:
- 如果Go的版本太低不能使用,建议将Go的版本升级到最新。
- 环境变量中可以增加
GOPROXY=https://goproxy.io
这样没有梯子的情况下可以正确的加载相应的包文件。 - 环境变量
GO111MODULE
不要设置,如果已经增加了这个变量请务必设置为GO111MODULE=auto
。 - 在项目的根目录下使用命令
go mod init projectName
函数
func 关键字, 如果是小写的,表示私有的函数,仅能够在本包中调用,相当于其他语言中的private。大写,等于public。
_
空白标识符,舍弃返回的数据。
函数也是一种类型,所以可以将一个函数作为另一个函数的参数传递func1()和func2()是两个函数,将func1函数作为func2这个函数的参数,func2函数就叫做高阶函数,因为他接收了一个函数作为参数。所以func1叫做回调函数,他作为另一个函数的参数
多个返回值
1 | func Test(age,tel int) (int, string){ |
defer
defer 表示延时推迟的意思,在go语言中用来延时一个函数或者方法的执行。如果一个函数或者方法添加了defer关键字,表示则暂时不执行,等到主函数的所有方法都执行完后才开始执行.当多个函数被defer的时候他们被添加到一个堆栈中,并且根据先进后出的原则执行。 即
Last In First Out(LIFO)
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏