Go 语言入门指南:基础语法和常用特性解析(下)| 青训营

60 阅读6分钟

二、基础语法分析(下)

16.JSON

import (  
  "encoding/json"  
  "fmt"  
)

这里导入了两个包,encoding/json用于JSON编码和解码,fmt用于格式化输出。

type userInfo struct{  
  Name string  
  Age int `json:"age"`  
  Hobby []string  
}

定义了一个名为userInfo的结构体,它具有Name、AgeHobby三个字段。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()函数分别打印tt2的值,以及它们的年、月、日、时、分

  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 的值将为 0strconv.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 的环境变量,并将其值设置为 BBos.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语言系列可以告一段落啦!期待下一次分享......