此篇文章的内容为# 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 | 整型以十六进制、字母大写方式显示 |
| %U | Unicode 字符 |
| %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
}