前端analysis | 3w & 1h

go学习笔记二

2022-08-02

语言简介

1.Go语言即具备python等动态语言的开发速度,又拥有C/C++等编译型语言的性能与安全性。又被称作21世纪的C语言,不但能够访问底层操作系统还提供了强大的网络编程和并发编程,分布式编程。

为何创建GO

C语言,却难以开发,编译速度依赖性、运行时错误都非常多

java语言需要虚拟机才能运行代码

javascript和node.js 回调多,类型混乱,依赖性包查找也挺麻烦,更重包管理器

需要什么样的语言呢?

  • 需要快编译,类似解释性语言, 那么就只有参考Python,js 了
  • 不能类型混乱,可以参考Java ,C
  • 不能依赖混乱,可以参考java
  • 不能虚拟机,编译为字节码,装载为机器码;而是直接变为机器码
  • 但是内存问题,不能学C,只能学Java,自带内存管理
  • 响应大数据时代,突破线程限制,改用协程。协程很微型,不会占用电脑资源。一台电脑可以轻松开启成千上万个协程。

最终集合到的就是解释型的、强类型支持的,自带依赖包、内存管理 、直接机器码的

环境配置

下载

环境变量配置

安装成功与否,go version 进行check

windows

配置 GOPATH, 可以自定义目录

Linux

压缩文件解压到指定目录 

1
sudo tar -xzf go1.13.4.linux-amd64.tar.gz -C /usr/local
1
2
3
4
5
vim .bashrc
export GOROOT=/usr/local/go # 安装目录。
export GOPATH=$HOME/go # 工作环境
export GOBIN=$GOPATH/bin # 可执行文件存放
export PATH=$GOPATH:$GOBIN:$GOROOT/bin:$PATH # 添加PATH路径

添加环境变量到 .profile 这个配置文件中 

1
2
#?? 为何
export GOROOT="/usr/local/go"

导入包

1
import ( "fmt" "os" )

变量

定义

变量定义使用var

1
2
3
var name string ;

age := 12;

变量互换

不是从地址角度,从人角度,直接互换就行

1
2
var a, b int = 100,200;
a,b = b,a;

匿名变量

_ 下划线表示”_” 也称为空白标识符,任何类型都可以使用它进行赋值,而且任何类型赋值后都将直接被抛弃,所以在使用匿名变量时,表示后续代码不需要再用此变量

常量

  • 常量数值不能修改。
  • 常量定义后可以不使用。
  • 常量定义不能使用简短定义方式。
  • 常量中使用的数据类型只能是 整型、布尔、浮点、复数类型、字符串类型

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
2
3
4
5
for i:= 0 ; i < 100;i ++ {
if i == 5 {
break; // 只能结束当前一层循环
}
}

switch

可以不用特意添加break,结束语句; fallthrought ,会强制执行下一条case, 不论真假条件

return

内置的包

strings - 字符串处理

strconv - 字符转基本类型

time - 时间日期处理

包管理

depglide在项目中加入了vender目录来存储所有项目中需要引入的包。dep init 生成gopkg.lock(清单文件),gopkg.toml(描述文件)

1
2
3
4
5
MacOS `brew install dep`

Linux `curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh`

Windows `go get -u github.com/golang/dep/cmd/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
2
3
4
5
func Test(age,tel int) (int, string){
return 12,'a';
}

x,name = Test(1);

defer

defer 表示延时推迟的意思,在go语言中用来延时一个函数或者方法的执行。如果一个函数或者方法添加了defer关键字,表示则暂时不执行,等到主函数的所有方法都执行完后才开始执行.当多个函数被defer的时候他们被添加到一个堆栈中,并且根据先进后出的原则执行。 即 Last In First Out(LIFO)

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏