day05
一、异常处理
1. error接口
不致命的错误多用error接口
import (
"errors"
"fmt"
)
func main() {
//var error1 error= fmt.Errorf("%s", "this is a normal error")
error1 := fmt.Errorf("%s", "this is a normal error1")
fmt.Println(error1)
error2 := errors.New("this is a normal error2")
fmt.Println(error2)
fmt.Println(error2.Error())
}
2. error接口的应用
func div(a, b int) (result int, err error) {
if b == 0 {
err = errors.New("除数不能为0")
} else {
result = a / b
}
return
}
func main() {
result, err := div(9, 3)
if err != nil {
fmt.Printf(err.Error())
} else {
fmt.Println(result)
}
}
3. panic函数
func testA() {
fmt.Println("aaaaaaaaaaaa")
}
func testB() {
//显示调用panic,中断程序执行
panic("this is a panic test")
}
func testC() {
fmt.Println("cccccccccccc")
}
func main() {
testA()
testB()
testC()
}
//aaaaaaaaaaaa
//panic: this is a panic test
//goroutine 1 [running]:
//main.testB()
// D:/Project/GoProject/005/src/03显示调用panic函数.go:14 +0x40
//main.main()
// D:/Project/GoProject/005/src/03显示调用panic函数.go:23 +0x2c
//exit status 2
4. 数组下标越界panic(内部panic)
func testA(x int) {
var a [10]int
a[x] = 999
}
func main() {
testA(10)
}
//这里的panic是系统内部机制实现的
//panic: runtime error: index out of range
//goroutine 1 [running]:
//main.testA(...)
// D:/Project/GoProject/005/src/04panic数组下标越界.go:5
//main.main()
// D:/Project/GoProject/005/src/04panic数组下标越界.go:9 +0x31
//exit status 2
5. recover函数
recover只有在defer调用的函数中有效
func testA() {
fmt.Println("aaaaaaaaaaaa")
}
func testB(x int) {
//设置recover
defer func() {
// recover()
// fmt.Println(recover())
if err := recover(); err != nil {
fmt.Println(err)
}
}() //不能忘了(),调用此匿名函数
//显示调用panic,中断程序执行
var a [10]int
a[x] = 999
}
func testC() {
fmt.Println("cccccccccccc")
}
func main() {
testA()
testB(20)
testC()
}
二、文本文件处理(字符串操作)
6. 字符串操作(Contains)
fmt.Println(strings.Contains("hello world go", "hello")) // true
fmt.Println(strings.Contains("hello world go", "asd")) // false
fmt.Println(strings.Contains("hello world go", " ")) // true
fmt.Println(strings.Contains("hello world go", " ")) // false
fmt.Println(strings.Contains("hello world go", "")) // true
fmt.Println(strings.Contains("", ""))
7. 字符串操作(Join)
s := []string{"hello", "world", "go", "abc"}
str := strings.Join(s, "@")
fmt.Println(str) //hello@world@go@abc
8. 字符串操作(Index)
工查询字符位置从0开始,不包含返回-1
fmt.Println(strings.Index("hello world go", "he")) //0
fmt.Println(strings.Index("hello world go", "o")) //4
fmt.Println(strings.Index("hello world go", "or")) //7
fmt.Println(strings.Index("hello world go", "abs")) //-1
fmt.Println(strings.Index("hello world go", "")) //0
9. 字符串操作(Repeat)
str := strings.Repeat("go", 3)
fmt.Println(str) //gogogo
str = strings.Repeat("go", 1)
fmt.Println(str) //go
str = strings.Repeat("go", 0)
fmt.Println(str) //
10. 字符串操作(Replace)
11. 字符串操作(Split)
str := "hello@world@go"
s := strings.Split(str, "@")
fmt.Println(s) //[hello world go]
str = "hello world go"
s = strings.Split(str, " ")
fmt.Println(s) //[hello world go]
str = "helloworldgo"
s = strings.Split(str, "")
fmt.Println(s) //[h e l l o w o r l d g o]
str = "helloworldgo"
s = strings.Split(str, "|")
fmt.Println(s) //[helloworldgo]
12. 字符串操作(Trim)
去掉两边指定字符
str := " ab c d e "
s := strings.Trim(str, " ")
fmt.Println(s) //ab c d e
13. 字符串操作(Fields)
s := strings.Fields(" are you ok ")
for _, data := range s {
fmt.Println(data)
}
// are
// you
// ok
//
14. 字符串转换(Append)
15. 字符串转换(Format)
16. 字符串转换(Parse)
把字符串转换为其它类型
17. 正则表达式
三、文本文件处理(json操作)
20. Json处理
21. 结构体生成Json
import (
"encoding/json"
"fmt"
)
type IT struct {
Company string
Subjects []string //切片
IsOK bool
Price float64
}
func main() {
s := IT{"ZhaoShiJiTuan", []string{"go", "c++", "java", "python"}, true, 16.55}
//编码,根据内容生成Json
// buff, err := json.Marshal(s) //生成json
buff, err := json.MarshalIndent(s, "", " ") //生成的同时格式化
if err != nil {
fmt.Println(err)
} else {
// fmt.Println(buff) //反回的byte切片,所以显示出来是数字,转换成字符串类型就可以正常显示了
// fmt.Println(string(buff)) //{"Company":"ZhaoShiJiTuan","Subjects":["go","c++","java","python"],"IsOK":true,"Price":16.55}
fmt.Println(string(buff))
// {
// "Company": "ZhaoShiJiTuan",
// "Subjects": [
// "go",
// "c++",
// "java",
// "python"
// ],
// "IsOK": true,
// "Price": 16.55
//}
}
}
21. struct_tag的使用
type IT struct {
Company string `json:"-"` //此字段不会输出到屏幕
Subjects []string `json:"subjects"` //两次编码,输入的名字就是小写的了,记住是反引号,不是单引号
IsOK bool `json:",string"` //以字符串形式输出
Price float64 `json:",string"`
}
func main() {
s := IT{"ZhaoShiJiTuan", []string{"go", "c++", "java", "python"}, true, 16.55}
//编码,根据内容生成Json
// buff, err := json.Marshal(s) //生成json
buff, err := json.MarshalIndent(s, "", " ") //生成的同时格式化
if err != nil {
fmt.Println(err)
} else {
fmt.Println(string(buff))
// {
// "subjects": [
// "go",
// "c++",
// "java",
// "python"
// ],
// "IsOK": "true",
// "Price": "16.55"
//}
}
22. Map生成json
import (
"encoding/json"
"fmt"
)
func main() {
//创建map
m := make(map[string]interface{}, 4)
m["company"] = "ZhaoShiJiTuan"
m["subjects"] = []string{"go", "c++", "java", "python"}
m["isOK"] = true
m["price"] = 16.55
//生成json
mapstring, err := json.MarshalIndent(m, "", " ")
if err != nil {
fmt.Println(err)
} else {
fmt.Println(string(mapstring))
}
//{
// "company": "ZhaoShiJiTuan",
// "isOK": true,
// "price": 16.55,
// "subjects": [
// "go",
// "c++",
// "java",
// "python"
// ]
//}
}
23. Json解析到结构体和map
import (
"encoding/json"
"fmt"
)
type IT struct {
Company string `json:"company"` //此字段不会输出到屏幕
Subjects []string `json:"subjects"` //两次编码,输入的名字就是小写的了,记住是反引号,不是单引号
IsOK bool `json:",price"` //以字符串形式输出
Price float64 `json:",price"`
}
func main() {
jsonBuf := `
{
"company": "ZhaoShiJiTuan",
"isOK": true,
"price": 16.55,
"subjects": [
"go",
"c++",
"java",
"python"
]
}`
var temp IT //定义一个结构体变量
// m := make(map[string]interface{}, 2) //定义一个map(map大小不影响)
err := json.Unmarshal([]byte(jsonBuf), &temp) //第二个参数要传指针
// err := json.Unmarshal([]byte(jsonBuf), &m)
if err != nil {
fmt.Println("error", err)
} else {
fmt.Println(temp) //{ZhaoShiJiTuan [go c++ java python] true 16.55}
// fmt.Println(m) //map[subjects:[go c++ java python] company:ZhaoShiJiTuan isOK:true price:16.55]
//map解析时要做类型断言
}
}
四、文本文件处理(文件操作)
设备文件:
屏幕(标准输入设备) fmt.Println() 往标准输出设备写内容
键盘(标准输入设备) fmt.Scan() 从标准输入设备读取内容
磁盘文件(放在存储设备上的文件):
1>文本文件 (以记事本打开能看到内容,不是乱码)
2>二进制文件 (以记事本打开能看到内容,是乱码)
24. 设备文件文件的操作
import (
"fmt"
"os"
)
func main() {
// os.Stdout.Close() //关闭标准设备文件的输出设备文件
// fmt.Println("ara u ok ?") //往标准输出设备(屏幕)写内容 如果关闭标准设备输出文件,不输出
//标准设备文件(os.Stdout),默认已经打开,用户可直接使用
os.Stdout.WriteString("are you ok?\n") //在屏幕上打字字符
//我看了下源码fmt.print应该也是使用的os.stdout.的一些写入
os.Stdin.Close() //关闭标准设备文件的输入设备文件
var a int
fmt.Println("请输入a")
fmt.Scan(&a) //从标准输入设备读取内容 如果关闭标准设备输入文件,不输入
fmt.Println("您输入的是", a)
//我看了下源码fmt.Scan应该也是使用的os.stdin.的一些读取方法
25. 建立、打开文件
文件操作需要使用os包
Create新建文件时,如果文件不存在就新建,如果文件存在就清空原文件,参数names是文件名(其中可以包括路径),返回值是一个文件批针和错误信息。内部其实调用了打开文件的openfile函数
NewFile不常用
Open函数打开的方式是只读
26. 写文件
Write是处理二进制的,参数是切片
WriteString写入string到文本文件,参数是string。返回值 ret是写入了多长的字符,err是错误信息
import (
"fmt"
"os"
)
func WriteFile(filePath string) {
//新建文件,同时打开了文件
file, err := os.Create(filePath)
if err != nil {
fmt.Println("error:", err)
return
}
//使用完闭需要关闭文件
defer file.Close()
//写入内容
file.WriteString("haha")
}
func main() {
filePath := "./demo.txt"
WriteFile(filePath)
}
27. 读文件
import (
"fmt"
"io"
"os"
)
func ReadFile(filePath string) {
//打开文件
file, err := os.Open(filePath)
if err != nil {
fmt.Println("error:", err)
return
}
//使用完闭需要关闭文件
defer file.Close()
var b []byte = make([]byte, 1024*2)
num, readErr := file.Read(b)
if readErr != nil && readErr != io.EOF { //判断条件:文件出错和没有读到结尾 io.EOF 代表结束符
fmt.Println(readErr)
return
}
content := string(b[:num])
fmt.Println(content)
}
func main() {
filePath := "./demo.txt"
ReadFile(filePath)
}
28. 删除文件
29. 通过bufio实现整行读取
30. 文件拷贝
a