二、基础语法分析(下)
16.JSON
import (
"encoding/json"
"fmt"
)
这里导入了两个包,encoding/json用于JSON编码和解码,fmt用于格式化输出。
type userInfo struct{
Name string
Age int `json:"age"`
Hobby []string
}
定义了一个名为userInfo的结构体,它具有Name、Age和Hobby三个字段。Age字段使用了结构体标记json:"age",表示在JSON编码和解码时,将使用age作为字段的键。
func main() {
a := userInfo{Name: "wang", Age: 18, Hobby: []string{"Golang", "TypeScript"}}
在main函数中,创建了一个userInfo类型的变量a,并初始化了它的字段值。
buf, err := json.Marshal(a)
if err != nil {
panic(err)
}
使用json.Marshal函数将结构体a编码为JSON格式的字节切片。如果编码过程中发生错误,使用panic函数抛出异常。
fmt.Println(buf)
fmt.Println(string(buf))
打印输出编码后的JSON字节切片。由于buf是字节切片,直接打印会输出一串数字。使用string函数将字节切片转换为字符串后再打印。
buf, err = json.MarshalIndent(a, "", "\t")
if err != nil {
panic(err)
}
fmt.Println(string(buf))
使用json.MarshalIndent函数将结构体a编码为带有缩进的JSON格式。第二个参数""表示不使用缩进字符串,第三个参数"\t"表示使用制表符作为缩进字符串。
var b userInfo
err = json.Unmarshal(buf, &b)
if err != nil {
panic(err)
}
fmt.Printf("%#v\n", b)
使用json.Unmarshal函数将JSON字节切片解码为userInfo类型的变量b。如果解码过程中发生错误,使用panic函数抛出异常。最后,使用fmt.Printf函数打印输出b的值,其中%#v表示以Go语言的语法格式打印结构体值。
17.时间处理
这段代码展示了Go语言中如何使用time包来处理时间和日期。
func main() {
now := time.Now()
fmt.Println(now)
time.Now()函数返回当前的时间,并将其赋值给变量now。然后使用fmt.Println()函数将now打印输出。
t := time.Date(2022, 3, 27, 1, 25, 36, 0, time.UTC)
t2 := time.Date(2022, 3, 27, 2, 30, 36, 0, time.UTC)
fmt.Println(t)
fmt.Println(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute())
time.Date()函数创建了一个自定义的时间对象,并将其赋值给变量t。该日期是2022年3月27日1时25分36秒,时区为UTC。同样的方法,也创建了变量t2,其时间为2时30分36秒。
然后使用fmt.Println()函数分别打印t和t2的值,以及它们的年、月、日、时、分。
fmt.Println(t.Format("2006-01-02 15:04:05"))
diff := t2.Sub(t)
fmt.Println(diff)
fmt.Println(diff.Minutes(), diff.Seconds())
使用t.Format()函数将t的值格式化为字符串,并按照"2006-01-02 15:04:05"的格式打印输出。这里的日期格式使用了特定的参考时间"2006-01-02 15:04:05",这是因为Go语言的时间格式化是基于一个参考时间的。
time.Duration类型表示时间间隔,可以通过t2.Sub(t)方法获取t2相对于t的时间间隔,并将其赋值给变量diff。然后使用fmt.Println()函数打印输出diff的值,并调用diff.Minutes()和diff.Seconds()方法分别获取时间间隔的分钟数和秒数。
t3, err := time.Parse("2006-01-02 15:04:05", "2022-03-27 01:25:36")
if err != nil {
panic(err)
}
fmt.Println(t3 == t)
fmt.Println(now.Unix())
}
使用time.Parse()函数将字符串"2022-03-27 01:25:36"解析为时间对象,并将其赋值给变量t3。如果解析过程中发生错误,使用panic()函数抛出异常,并将错误信息打印出来。
然后使用t3 == t的方式比较t3和t是否相等,并使用fmt.Println()函数打印输出结果。
最后,使用now.Unix()方法获取当前时间的Unix时间戳,并将其打印输出。
18.数字解析
import (
"fmt"
"strconv"
)
这是导入所需的包,fmt 用于打印输出,strconv 用于字符串和数字之间的转换。
func main() {
f, _ := strconv.ParseFloat("1.123", 64)
fmt.Println(f)
这行代码将字符串 "1.123" 解析为浮点数,并将结果存储在变量 f 中。strconv.ParseFloat 函数的第一个参数是要解析的字符串,第二个参数是解析结果的位数。在这里,我们将结果存储在 64 位的浮点数中。_ 是一个占位符,用于忽略函数的第二个返回值。最后,使用 fmt.Println 打印出 f 的值。
n, _ := strconv.ParseInt("111", 10, 64)
fmt.Println(n)
这行代码将字符串 "111" 解析为十进制整数,并将结果存储在变量 n 中。strconv.ParseInt 函数的第一个参数是要解析的字符串,第二个参数是字符串的基数(这里是十进制),第三个参数是结果的位数(这里是 64 位)。_ 是一个占位符,用于忽略函数的第二个返回值。最后,使用 fmt.Println 打印出 n 的值。
n, _ = strconv.ParseInt("1000", 16, 64)
fmt.Println(n)
这行代码将字符串 "1000" 解析为十六进制整数,并将结果存储在变量 n 中。strconv.ParseInt 函数的第一个参数是要解析的字符串,第二个参数是字符串的基数(这里是十六进制),第三个参数是结果的位数(这里是 64 位)。_ 是一个占位符,用于忽略函数的第二个返回值。最后,使用 fmt.Println 打印出 n 的值。
n2, _ := strconv.Atoi("123")
fmt.Println(n2)
这行代码将字符串 "123" 解析为整数,并将结果存储在变量 n2 中。strconv.Atoi 函数的参数是要解析的字符串。_ 是一个占位符,用于忽略函数的第二个返回值。最后,使用fmt.Println打印出 n2 的值。
n2, err := strconv.Atoi("AAA")
fmt.Println(n2, err)
}
这行代码尝试将字符串 "AAA" 解析为整数,并将结果存储在变量 n2 中。由于 "AAA" 不是有效的整数表示,所以解析失败,n2 的值将为 0。strconv.Atoi 函数还返回一个错误,表示解析过程中发生了错误。err 变量用于存储这个错误。最后,使用 fmt.Println 打印出 n2 的值和 err 的值。
19.进程信息
fmt.Println(os.Args)
这行代码打印出程序运行时的命令行参数。os.Args 是一个字符串切片,包含了命令行参数的所有元素。
fmt.Println(os.Getenv("PATH"))
这行代码打印出环境变量PATH的值。os.Getenv 函数接受一个环境变量的名称作为参数,并返回该环境变量的值。
fmt.Println(os.Setenv("AA","BB"))
这行代码设置一个名为 AA 的环境变量,并将其值设置为 BB。os.Setenv 函数接受两个参数,第一个参数是环境变量的名称,第二个参数是要设置的值。该函数返回一个错误,表示设置环境变量时是否发生了错误。
buf,err := exec.Command("grep","127.0.0.1","/etc/hosts").CombinedOutput()
if err!=nil{
panic(err)
}
fmt.Println(string(buf))
这段代码执行一个命令,并获取其输出。exec.Command 函数接受一个命令和一些参数作为参数,并返回一个 *exec.Cmd 类型的值。我们可以调用 CombinedOutput 方法来执行命令并获取其输出。该方法返回一个字节切片和一个错误。在这里,我们将结果存储在 buf 变量中,并通过 string 函数将其转换为字符串。如果执行命令时发生错误,我们使用 panic 函数中断程序的执行。最后,我们打印出命令的输出。
终于Go语言系列可以告一段落啦!期待下一次分享......