GO语言基础(三)|青训营笔记

84 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
一、本堂课重点内容:

  • 基础语法(下)

二、详细知识点介绍:

  • 基础语法(下)
  1. 错误处理
    Go 语言通过内置的错误接口提供了非常简单的错误处理机制。
    error类型是一个接口类型,这是它的定义:
type error interface {
    Error() string
}

我们可以在编码中通过实现error接口类型来生成错误信息。
函数通常在最后的返回值中返回错误信息。使用errors.New可返回一个错误信息:

func Sqrt(f float64) (float64, error) {
    if f < 0 {
        return 0, errors.New("math: square root of negative number")
    }
}
  1. 字符串操作
    定义并初始化字符串a
a := "hello"

以下操作需包含"strings"包。
判断字符串a中是否有字符串"ll"

strings.Contains(a,"ll")//true

对字符串a中的字符串"l"计数:

strings.Count(a,"l")//2

查找字符串a中的字符串"ll"的位置:

strings.Index(a,"ll")//2

将字符串"he"llo之间以字符串"-"连接:

strings.Join([]string{"he","llo"},"-")//he-llo

将字符串a重复两遍:

strings.Repeat(a,2)//hellohello

判断字符串a是否有前缀"he":

strings.HasPrefix(a,"he")//true

判断字符串a是否有后缀"llo":

strings.HasSuffix(a,"llo")//true

在字符串a中,将所有(因为第四个参数n<0,若n>0则转换前n个字符串"e") 字符串"e"转换为字符串"E"

strings.Replace(a,"e","E",-1)//hEllo

将字符串"a-b-c"以字符串"-"切割,并返回切割后的字符串切片

strings.Split("a-b-c","-")//[a b c]

将字符串a中的全部字母转换为小写字母。

strings.ToLower(a)//hello

将字符串a中的全部字母转换为大写字母。

strings.ToUpper(a)//HELLO
  1. 字符串格式化
    fmt.Println:打印多个变量,变量之间换行。
    fmt.Printf:类似于C的printf,不同的是go中所有的变量类型都可以使用%v,且可以使用%+v%#v等显示更多信息。使用%.2f保留两位小数与C相同。
type point struct{
    x,y int
}

func main(){
s:="hello"
n:=123
p:=point{1,2}
fmt.Println(s,n)//hello 123
fmt.Println(p)//{1 2}

fmt.Printf("s=%v\n",s)//s=hello
fmt.Printf("n=%v\n",n)//n=123
fmt.Printf("p=%v\n",p)//p={1 2}
fmt.Printf("p=%+v\n",p)//p={x:1 y:2}
fmt.Printf("p=%#v\n",p)//p=main.point{x:1,y:2}

f:=3.141592653
fmt.Println(f)//3,141592653
fmt.Println("%.2f\n",f)//3,14
}
  1. JSON处理
    可以使用包encoding/json中的函数json.Marshal()其中字段首字母全大写的结构体进行序列化,序列化后会变为16进制编码的JSON字符串。
    同样可以使用其中的json.Unmarshal()进行反序列化。
package main

import (
	"encoding/json"
	"fmt"
)

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

func main() {
	a := userInfo{Name: "wang", Age: 18, Hobby: []string{"Golang", "TypeScript"}}
	buf, err := json.Marshal(a)
	if err != nil {
		panic(err)
	}
	fmt.Println(buf)         // [123 34 78 97...]
	fmt.Println(string(buf)) // {"Name":"wang","age":18,"Hobby":["Golang","TypeScript"]}

	buf, err = json.MarshalIndent(a, "", "\t")
	if err != nil {
		panic(err)
	}
	fmt.Println(string(buf))

	var b userInfo
	err = json.Unmarshal(buf, &b)
	if err != nil {
		panic(err)
	}
	fmt.Printf("%#v\n", b) // main.userInfo{Name:"wang", Age:18, Hobby:[]string{"Golang", "TypeScript"}}
}
  1. 时间处理
    需要使用"time"包。
    使用time.Now()获取当前时间作为time
    使用time.Date()构造一个带时区的time
    使用time.Sub()使两个time相减得到一个time
    使用time.Format()格式化一个time到字符串中。
    使用time.Parse()将一个字符串解析为time
    使用time.Unix()获取此time的时间戳。
package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now()
	fmt.Println(now) // 2022-03-27 18:04:59.433297 +0800 CST m=+0.000087933
	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)                                                  // 2022-03-27 01:25:36 +0000 UTC
	fmt.Println(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute()) // 2022 March 27 1 25
	fmt.Println(t.Format("2006-01-02 15:04:05"))                    // 2022-03-27 01:25:36
	diff := t2.Sub(t)
	fmt.Println(diff)                           // 1h5m0s
	fmt.Println(diff.Minutes(), diff.Seconds()) // 65 3900
	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)    // true
	fmt.Println(now.Unix()) // 1648738080
}
  1. 数字解析
    需要使用"strconv"(string convert)包。 将字符串"1.234"转换为64位精度的浮点数:
f, _ := strconv.ParseFloat("1.234", 64)
	fmt.Println(f) // 1.234

将10进制字符串"111"转换为64位精度的整数:

n, _ := strconv.ParseInt("111", 10, 64)
	fmt.Println(n) // 111

由计算机推断进制的字符串"0x1000"转换为64位精度的整数:

n, _ = strconv.ParseInt("0x1000", **0**, 64)
	fmt.Println(n) // 4096

可以使用strconv.Atoi()来快速将一个十进制字符串转为数字。
若输入不合法会返回错误。

n2, _ := strconv.Atoi("123")
	fmt.Println(n2) // 123

	n2, err := strconv.Atoi("AAA")
	fmt.Println(n2, err) // 0 strconv.Atoi: parsing "AAA": invalid syntax

同样可以使用strconv.Itoa()将数字快速转为字符串。
20. 进程信息
以下需要os包。
使用os.Args获取进程相关参数。
使用os.Getenv()os.Setenv()获取和写入环境变量。
以下需要os/exec包。
使用exec.Command()来快速启动子进程并获取其输入输出。

package main

import (
	"fmt"
	"os"
	"os/exec"
)

func main() {
	// go run example/20-env/main.go a b c d
	fmt.Println(os.Args)           // [/var/folders/8p/n34xxfnx38dg8bv_x8l62t_m0000gn/T/go-build3406981276/b001/exe/main a b c d]
	fmt.Println(os.Getenv("PATH")) // /usr/local/go/bin...
	fmt.Println(os.Setenv("AA", "BB"))

	buf, err := exec.Command("grep", "127.0.0.1", "/etc/hosts").CombinedOutput()
	if err != nil {
		panic(err)
	}
	fmt.Println(string(buf)) // 127.0.0.1       localhost
}

三、引用参考: