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

82 阅读4分钟

此篇文章的内容为# Go 语言入门指南:基础语法和常用特性解析(1)的后续内容,对go语言的基础语法和常用特性的笔记进行完善

strings

go中的strings包中含有许多对字符串处理的方法,通过import的方式引入该包。

package main
import(
	"fmt"
	"strings"
)
func main(){
	a := "hello"

	//判断是否包含指定内容,返回bool类型
	fmt.Println(strings.Contains(a,"ll"))   //true
	
	//计数
	fmt.Println(strings.Count(a,"l"))       //2

	//是否包含指定开头
	fmt.Println(strings.HasPrefix(a,"he"))  //true

	//是否包含指定结尾
	fmt.Println(strings.HasSuffix(a,"llo")) //true

	//出现的位置
	fmt.Println(strings.Index(a,"ll"))      //2

	//分隔符
	fmt.Println(strings.Join([]string{"he","llo"},"-"))  //he-llo

	//重复
	fmt.Println(strings.Repeat(a,2))        //hellohello
	
	//替换
	fmt.Println(strings.Replace(a,"e","E",-1))   //hEllo

	//去除分隔符
	fmt.Println(strings.Split("a-b-c","-"))  // [a b c]
	
	//小写
	fmt.Println(strings.ToLower(a))           //hello

	//大写
	fmt.Println(strings.ToUpper(a))           //HELLO

	//计算长度,按字节算,go使用utf-8,一个中文三个字节
	b := "你好"
	fmt.Println(len(b))                       //6
}

字符串格式化

格式化字符串(Format String)是在编程过程中,允许编码人员通过特殊的占位符,将相关对应的信息整合或提取的规则字符串。 由于目前软件使用场景的发展,几乎已经很少有用户仍旧使用控制台(终端)交互程序,而是更多地使用图形界面程序,传统的printf、scanf等格式化字符相关函数的应用已经十分少见。

然而,在程序内部,仍然存在着对字符串本身进行较为复杂的读取、解析操作,在这个过程中,仍旧存在着大量的对格式化字符串的使用场景。比如,通过fscanf从文件中读取字符串,比如,通过sprintf使用格式化字符串规则生成预期目标字符串。

而即使是对于传统的控制台通过格式化字符串实现的IO操作,printf、scanf,在很多系统底层开发中,仍旧充当着不可替代的角色。

格  式描  述
%v按值的本来值输出
%+v在 %v 基础上,对结构体字段名和值进行展开
%#v输出 Go 语言语法格式的值
%T输出 Go 语言语法格式的类型和值
%%输出 % 本体
%b整型以二进制方式显示
%o整型以八进制方式显示
%d整型以十进制方式显示
%x整型以十六进制方式显示
%X整型以十六进制、字母大写方式显示
%UUnicode 字符
%f浮点数
%p指针,十六进制方式显示
package main
import(
	"fmt"
)

type point struct{
	x,y int
}

func main(){
	p := point{1, 2}
	a := 1
	b := "aaa"

	fmt.Printf("a=%v\n", a)  //a=1
	fmt.Printf("b=%v\n", b)  //b=aaa
	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}
}

JSON处理

JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。它基于 ECMAScript(European Computer Manufacturers Association, 欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率

package main
import(
	"encoding/json"
	"fmt"
)

type userInfo struct{
	Name string
	Age int 'josn:"age"'   //通过单引号将序列化输出的Age改成age
	Hobby []string
}

func main(){
	a := userInfo{"wang", 18, []string{"Golang", "TypeScript"}}
	buf, err := json.Marshal(a) //将a序列化
	if err != nil{
		panic(err)
	}
	fmt.Println(buf)   //[123 34 78 97 ...]  十六进制形式
	fmt.Println(string(buf))//{"Name":"wang","age":"18","Hobby":["Golang","TypeScript"]}

	var b userInfo
	err = json.Unmarshal(buf,&b) //反序列化
	if err != nil{
		panic(err)
	}
	fmt.Printf("%#v\n",b) //main.userInfo{...}
}

时间处理

package main
import(
	"fmt"
	"time"
)

func main(){
	now := time.Now() //获取当前时间
	fmt.Println(now)  //2023-07-31 23:09:58.7863725 +0800 CST m=+0.003676201
	t := time.Date(2023,7,31,23,9,58,0,time.UTC) //创建时间对象
	t2 := time.Date(2023,7,31,24,0,0,0,time.UTC)
	fmt.Println(t)   //2023-07-31 23:09:58 +0000 UTC

	fmt.Println(t.Year(),t.Month(),t.Day(),t.Hour(),t.Minute())
	//2023 July 31 23 9

	fmt.Println(t.Format("2006-01-02 15:04:05")) //格式化
	//2023-07-31 23:09:58

	diff := t2.Sub(t)  //计算时间差 
	fmt.Println(diff)  //50m2s

	t3, err := time.Parse("2006-01-02 15:04:05","2023-07-31 23:09:58")
	if err != nil{
		panic(err)
	}
	fmt.Println(t3 == t) //true

}

数字解析(字符串←→数字)

package main
import(
	"fmt"
	"strconv"
)
func main(){
	f,_ := strconv.ParseFloat("1.234",64)
	fmt.Println(f)  //1.234

	n,_ := strconv.ParseInt("111", 10, 64)  //参数2:进制 参数3:精度
	
	n,_ := strconv.PaeseInt("0x1000",0,64)  //参数2可省略写0  4096

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

	n2,err := strconv.Atoi("AAA")//会返回错误给err
}