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() //启动子进程,并获取其输入输出