这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
基础语法
结构体
type User struct {
Name string
Password string
}
方法
格式
func funcName() bool {
...
}
如果不需要返回值的话则在方法名后不需要设置,如果需要返回多个值须在返回值外加()
func funcName() (ok bool,err error) {
...
}
如果要编写结构体的成员方法,则需在func前加上结构体变量内容,如以下两种方式
User是已定义结构体
func (user User) getName() string {
...
}
func (user *User) setName(name string) bool {
...
}
map
使用make进行赋值
m := make(map[string]int)
m["hello"] = 1
m["sry"] = 0
r, ok := m["hello"]
fmt.Println(r, ok)
json
序列化
Marshal(v any) ([]byte, error):将 v 转成 JSON 数据,以 []byte 的形式返回。
在结构体字段后附加json:"名称"可指定序列化后的字段名
如果 JSON 标签的值为 -,则在转换 JSON 时忽略此字段。
b, err := json.Marshal(u)
if err == nil {
fmt.Print(string(b))
}
注意:
-
不可导出字段(字段名以小写字母开头),是不能被转成
JSON的key的,以小写字母开头的变量或结构体字段等,不能在包外被访问。如果字段名为小写开头,导出结果为空
-
转换后的字段名,与结构体字段的名字一样。
-
如果字段是指针类型,转换后的值为指针指向的字段值。
反序列化
json.Unmarshal(b, &u)
fmt.Printf("%#v\n", u)
同时注意:
- 使用
Unmarshal函数时,我们需要传入结构体的指针类型,Unmarshal函数会将json字符串进行反序列化后的结果赋值给所传入的结构体指针所指向的变量
-
JSON解析时,JSON的key与结构体字段的匹配规则是:- 优先查找
JSON标签值和key一样的,找到则将value赋值给对应字段。 - 如果没有
JSON标签值与key相匹配,则根据字段名进行匹配。
- 优先查找
如果结构体字段是非导出字段或 JSON 标签的值为 -,将不会被匹配到。
字符串转换
进行字符串与数字的转换要使用strconv包
数字转换成字符串
将数字转换为字符串将使用strconv.Itoa()方法
package main
import "fmt"
import "strconv"
func main() {
str := strconv.Itoa(100)
str = "hello" + str
fmt.Println(str)
}
代码输出结果:
hello100
同时也可以使用strconv.PareseInt()方法
该方法需要三个参数:
- 需要转换的字符串
- 转化后所需要的进制(2到32进制)
- 转换后数据大小限制
字符串转换成数字
将数字转换为字符串将使用strconv.Atoi()方法
package main
import "fmt"
import "strconv"
func main() {
num,_ := strconv.Atoi("123")
res := num + 100
fmt.Println(res)
}
时间处理
里,在go语言里面最常用的就是time.now0来获取当前时间,然后你也可以用time.date去构造一 个带时区的时间,构造完的时间。上面有很多方法来获取这个时间点的年月日小时分钟秒,然后也能用点sub去对两个时间进行减法,得到一个时间段。同时通过时间段可以获得具体相差的小时分钟亦或秒
获取时间
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println(time.Now())
}
//输出:2023-01-15 23:22:21.3288118 +0800 CST m=+0.002049901
这是当前系统时区下的结果,time.Now()的打印中会标注+0800 CST。
注意,在使用 Docker 容器时,系统默认的时区就是 UTC 时间(0 时区),和我们实际需要的北京时间相差八个小时,这是导致八小时时间差问题的经典场景。
我们除了可以通过time.Now()获取当前时间,也可以通过 Date 函数,根据年、月、日等时间和时区参数获取指定时间
func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time {}
通过以下方法可获取当前时间戳
func (t Time) Unix() int64 {} // 从 Unix 时间 0 经过的秒数
func (t Time) UnixMicro() int64 {} // 从 Unix 时间 0 经过的微秒数
func (t Time) UnixMilli() int64 {} // 从 Unix 时间 0 经过的毫秒数
func (t Time) UnixNano() int64 {} // 从 Unix 时间 0 经过的纳秒数
格式化时间
相比其它语言使用模板来格式化时间,如yyyy-MM-dd hh:mm:ss,go使用固定的时间(需要注意,使用其他的时间是不可以的)作为布局模板Mon Jan 2 15:04:05 MST 2006或者2006-01-02 15:04:05
不可使用模板进行格式化
在 time 库中,Go 提供了一些预定义的布局模板常量,这些可以直接拿来使用。
const (
Layout = "01/02 03:04:05PM '06 -0700" // The reference time, in numerical order.
ANSIC = "Mon Jan _2 15:04:05 2006"
UnixDate = "Mon Jan _2 15:04:05 MST 2006"
RubyDate = "Mon Jan 02 15:04:05 -0700 2006"
RFC822 = "02 Jan 06 15:04 MST"
RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
RFC850 = "Monday, 02-Jan-06 15:04:05 MST"
RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST"
RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
RFC3339 = "2006-01-02T15:04:05Z07:00"
RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
Kitchen = "3:04PM"
// Handy time stamps.
Stamp = "Jan _2 15:04:05"
StampMilli = "Jan _2 15:04:05.000"
StampMicro = "Jan _2 15:04:05.000000"
StampNano = "Jan _2 15:04:05.000000000"
)
以下为布局参数对照表:
年 06/2006
月 01/1/Jan/January
日 02/2/_2
星期 Mon/Monday
小时 03/3/15
分 04/4
秒 05/5
毫秒 .000/.999
微秒 .000000/.999999
纳秒 .000000000/.999999999
am/pm PM/pm
时区 MST
时区小时数差-0700/-07/-07:00/Z0700/Z07:00
进行时间格式化有两个方法可供使用,分别为Parse和Format
t := time.Now()
t.Format(time.Layout)
time.Parse(time.Layout, t.String())
时区转换
需要获取同一个 time.Time 在不同时区下的结果,我们可以使用它的 In 方法
func main() {
fmt.Println(time.Now())
t := time.Now()
// t.Format(time.Layout)
// fmt.Println(t)
time.Parse(time.Layout, t.String())
fmt.Println(t)
l, _ := time.LoadLocation("UTC")
t = t.In(l)
fmt.Println(t.String())
}
输出如下:
2023-01-15 23:45:05.5330948 +0800 CST m=+0.002099401
2023-01-15 23:45:05.5433268 +0800 CST m=+0.012331301
2023-01-15 15:45:05.5433268 +0000 UTC