德莱厄斯的GO语言学习笔记(1)| 青训营

go语言有大量的内置标准库

引入包 使用

go 复制代码
import (
    "fmt"
)
​

go是强类型语言,但是虽然是强类型,go依然支持在声明变量时不指定数据类型即

css 复制代码
var a = "init"
// 或
a := "init"
fmt.Println(a)

声明变量类型:

go 复制代码
var b, c int = 1,2
var e float64
f :=float32(e)

声明常量,常量可以不声明类型(自动推导)

c 复制代码
const s string = "constant"
// ||
const h = 5000

go的 if for 和switch

ruby 复制代码
if ?条件 {
...
}
for ?条件{
...
}
switch ?变量 {
 case 条件:
 // 不需要break
}

数组,因为数组长度是固定的,所以大多数时候不会直接使用数组,而是切片

less 复制代码
var a [5]int // 声明
a[4] = 100 // 赋值
b := [5]int{1,2,3,4,5}
var towD[2][3]int //二维数组

切片,切片即可变长度的数组

go 复制代码
s := make([]string ,3)

map 类似 js 里的 Object对象 即键值对集合,但是遍历时是乱序的

go 复制代码
m := make(map[string]int)
// 其中string表示key的类型,int表示value的类型
m["one"] = 1
m["tow"] = 2
delete(m,"one")

range 可以遍历map和数组 ,类似js的forEach循环(差别也很大)

go 复制代码
// range 需要用for关键字来启动
for ?k:_ , ?v = range m{
    fmt.Println(?k , ?v)
}

函数,go语言的函数天然支持返回多个值,一般来说,第一个返回值作为正常值,第二个作为错误信息。

go 复制代码
func add(a int, b int) int {
    return a + b
}
func exists(m map[string]string,k string)(v string ,ok bool){
    v,ok=m[k] // 可见go并不是严格意义上的强类型语言,使用非false值赋值给bool类型变量时会被转化为true
    return v,ok
}
v,ok := exists(map[sting]string{"a":"A"},"a")
fmt.Println(v,ok)// A true

指针,go的指针常用功能仅限于对传入的参数进行修改,这有点类似于 js 的浅拷贝,即变量引用。

go 复制代码
func add2ptr ( n *int){
  *n+=2  
}
n:=5
add2ptr(&n) //7

结构体,简单来说,结构体是一个带类型的字段的集合,有点类似js中的Object对象或者class,但是定义方式和ts中的type高度相似(看起来一模一样)

go 复制代码
type user struct{
    name string
    password string
}

和 ts 的 type 不同的是,go 中的结构体在代码中直接使用,而不是仅仅作为定义类型的工具(更像class一点)

下面的赋值定义都是合法的

css 复制代码
a := user{name:"wang" , password: "1024"}
b := user{"wang","1024"}
c := user{name:"wang"}
c.password = "1024"

结构体可以定义方法(更像class了),但是写法看起来很奇怪 (在结构体外面单独定义)

go 复制代码
func (u user) checkPassword(password string) bool {
 u.password == password
}
a.checkPassword("2048") //true

错误处理,上面提到了 函数天然支持返回多个值,在Go中,通常传入一个类型为error的变量作为返回的错误

go 复制代码
func foo(users []user , name string)(v *user ,err error){
    ...
    return ?v,?err
}
v ,err = foo([]user{{"wang","1024"}},"wang")

字符串处理、字符串格式化,在 "strings" 库中有很多字符串处理函数,不一一赘述了,需要的时候现搜就好。fmt库中也支持了很多字符串格式化的操作,但也仅限于打印使用,不再赘述

JSON处理

go 复制代码
// JSON.stringfy()
var jsonData = {...}
marshal := json.Marshal(jsonData)
string(marshal)

时间处理:

go 复制代码
t :=time.Now() // 当前时间 标准时

go 拥有世界上最奇葩的格式化操作:

arduino 复制代码
t.Format("2006-01-02 15:04:05")

2006-01-02 15:04:05不是一个随意的时间,他代表通常意义上的 yyyy-MM-dd hh:mm:ss ,给👴整笑了。

go 复制代码
diff := t2.Sub(t1) // 获取时间差
diff.Seconds() //获取时间差的秒数,其他同理

数字与字符串转换,strconv库中提供了转换的方法:

arduino 复制代码
strconv.ParseInt("111", 10, 64)
//10进制,这个64位
strconv.Atoi("123") // 123 快速转换

进程信息

go 复制代码
import(
    "os"
    "os/exec"
)
os.Args //获取go程序运行时写入的命令行参数
os.Getenv("PATH") //获取环境变量
os.Setenv("AA","BB") //写入环境变量
buf, err := exec.Command("grep","127.0.0.1","etc/hosts").CombinedOutput() //启动子进程,并获取其输入输出
相关推荐
CallBack8 个月前
Typora+PicGo+阿里云OSS搭建个人图床,纵享丝滑!
前端·青训营笔记
Taonce1 年前
站在Android开发者的角度认识MQTT - 源码篇
android·青训营笔记
AB_IN1 年前
打开抖音会发生什么 | 青训营
青训营笔记
monster1231 年前
结营感受(go) | 青训营
青训营笔记
翼同学1 年前
实践记录:使用Bcrypt进行密码安全性保护和验证 | 青训营
青训营笔记
hu1hu_1 年前
Git 的正确使用姿势与最佳实践(1) | 青训营
青训营笔记
星曈1 年前
详解前端框架中的设计模式 | 青训营
青训营笔记
tuxiaobei1 年前
文件上传漏洞 Upload-lab 实践(中)| 青训营
青训营笔记
yibao1 年前
高质量编程与性能调优实战 | 青训营
青训营笔记
小金先生SG1 年前
阿里云对象存储OSS使用| 青训营
青训营笔记