GO 学习笔记——第五天 / 异常,文本文件处理

1.error接口,panic,recover

  • error:输出错误信息
package main

import "fmt"
import "errors"

func main() {

	err1 := fmt.Errorf("ERROR")
	fmt.Println(err1)

	err2 := errors.New("THIS IS ERROR")
	fmt.Println(err2)

	result, err := Div(10, 2)
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println(result)
	}
}

//相除
func Div(a, b int) (result int, err error) {
	err = nil
	if b == 0 {
		err = errors.New("除数不能为0")
	} else {
		result = a / b
	}
	return result, err
}
  • panic
    • 致命错误
package main

import "fmt"

func main() {

	TestA()
	TestB()
	TestC()
}

func TestA() {
	fmt.Println("A")
}

func TestB() {
	fmt.Println("B")
	//panic会直接中断程序
	//panic("Error")
}

func TestC() {
	fmt.Println("C")

	//模拟数组越界
	x := [2]int{1, 2}
	x[3] = 10
}
  • recover
    • 出错但不停止程序
package main

import "fmt"

func main() {

	TestA()
	TestB(3)
	TestC()

	defer func() {
		if err := recover(); err != nil {
			fmt.Println(err)
		}

	}()
}

func TestA() {
	fmt.Println("A")
}

func TestB(x int) {
	fmt.Println("B")
	//panic会直接中断程序
	//panic("Error")

	//模拟数组越界
	i := [2]int{1, 2}
	i[x] = 10
}

func TestC() {
	fmt.Println("C")
}

2.字符串处理

  • 字符串操作
    • Contains:是否包含
    • Join:拼接
    • Index:位置
    • Repeat:拼接重复
    • Replace:替换
    • Split:分离
    • Trim:两头去除
    • Fieids:分离更加强大
package main

import "fmt"
import "strings"

//字符串操作
func main() {

	s := "Hello World"

	fmt.Println(strings.Contains(s, "W"))
	//true
	fmt.Println(strings.Contains(s, "A"))
	//false

	s1 := []string{"abc", "def", "ghi", "jk"}
	fmt.Println(strings.Join(s1, "&"))
	//abc&def&ghi&jk

	fmt.Println(strings.Index(s, "W"))
	//6

	s = strings.Repeat("go", 3)
	fmt.Println(s)
	//gogogo

	s = "Hello World"
	fmt.Println(strings.Split(s, " "))
	//[Hello World]

	fmt.Println(strings.Trim("    are you ok ? ", " "))
	//are you ok  ?

	fmt.Println(strings.Fields("    are you ok ?  "))
	//[are you ok ?]
}
  • 字符串转换
    • Append:将整数转换成字符串并且追加
    • Format:把其他类型转换成字符串
    • Parse:把字符串转换成其他类型
package main

import "fmt"
import "strconv"

//字符串转换
func main() {

	slice := make([]byte, 0, 1024)
	slice = strconv.AppendBool(slice, true)
	//十进制方式追加
	slice = strconv.AppendInt(slice, 1234, 10)

	fmt.Println(string(slice))
	//true1234

	var str string
	str = strconv.FormatBool(true)
	fmt.Println(str)
	//true
	str = strconv.FormatFloat(3.14, 'f', -1, 32)
	fmt.Println(str)
	//3.14
	str = strconv.Itoa(6556)
	fmt.Println(str)
	//6556

	var flag bool
	var err error
	flag, err = strconv.ParseBool("true")
	if err == nil {
		fmt.Println(flag)
		//true
	} else {
		fmt.Println(err)
	}

	i, err := strconv.Atoi("1867")
	if err == nil {
		fmt.Println(i + 9)
		//1876
	} else {
		fmt.Println(err)
	}

}

3.正则表达式

package main

import "fmt"
import "regexp"

func main() {

	buf := "abc azc a7c aac 888 a9c tac"
	reg := regexp.MustCompile(`a.c`)
	if reg == nil {
		fmt.Println("error")
		return
	}
	result := reg.FindAllStringSubmatch(buf, -1)
	fmt.Println(result)
	//[[abc] [azc] [a7c] [aac] [a9c]]

	//提取有效的小数
	buff := "3.14 ddd wr5 6. 7.12 www 92.1"
	rege := regexp.MustCompile(`\d+\.\d+`)
	if rege != nil {
		result := rege.FindAllStringSubmatch(buff, -1)
		fmt.Println(result)
		//[[3.14] [7.12] [92.1]]
	}

}

4.JSON处理

  • Json生成
package main

import "fmt"
import "encoding/json"

//Json 生成
func main() {

	//1.通过结构体生成
	s := IT{"大学", []string{"Java", "C/C++", "GO"}, true, 3.14}
	//buf, err := json.Marshal(s)
	//格式化打印
	buf, err := json.MarshalIndent(s, "", " ")
	if err == nil {
		fmt.Println(string(buf))
		//{"Company":"大学","Subjects":["Java","C/C++","GO"],"IsOk":true,"Price":3.14}
	} else {
		fmt.Println(err)
	}

	fmt.Println("-------------------------------------")

	//2.通过Map生成
	m := make(map[string]interface{}, 4)
	m["company"] = "大学"
	m["subjects"] = []string{"Java", "C/C++", "GO"}
	m["isOk"] = true
	m["price"] = 3.14
	buff, errs := json.MarshalIndent(m, "", " ")
	if errs == nil {
		fmt.Println(string(buff))
		//{"company":"大学","isOk":true,"price":3.14,"subjects":["Java","C/C++","GO"]}
	} else {
		fmt.Println(errs)
	}

	fmt.Println("-------------------------------------")
}

//成员变量名首字母必须大写
type IT struct {
	//需要小写字段 二次编码
	Company  string `json:"company"`
	Subjects []string
	//二次编码转换string
	IsOk  bool `json:",string"`
	Price float64
}
  • Json解析
package main

import "fmt"
import "encoding/json"

//Json 解析
func main() {

	sJson := `{"company":"大学","isOk":true,"price":3.14,"subjects":["Java","C/C++","GO"]}`

	//1.解析到结构体
	var tmp IT
	err := json.Unmarshal([]byte(sJson), &tmp)
	if err == nil {
		fmt.Println(tmp)
		//{大学 [Java C/C++ GO] true 3.14}
	}
	//2.解析到map
	m := make(map[string]interface{}, 4)
	json.Unmarshal([]byte(sJson), &m)
	if err == nil {
		fmt.Println(m)
		//map[subjects:[Java C/C++ GO] company:大学 isOk:true price:3.14]
		fmt.Println(m["company"])
		//大学
	}
}

type IT struct {
	Company  string   `json:"company"`
	Subjects []string `json:",subjects"`
	IsOk     bool     `json:",isOK"`
	Price    float64  `json:",price"`
}

5.文件操作

  • 设备文件:屏幕(标准输出设备),键盘(标准输入设备)
  • 磁盘文件:放在存储设备上的文件
package main

import "fmt"
import "os"
import "bufio"
import "io"

//Json 解析
func main() {

	//关闭后无法输出
	//os.Stdout.Close()
	fmt.Println("Hello")
	os.Stdout.WriteString("World\n")

	path := "./test.txt"

	//文件的写
	WhiteFile(path)
	//文件的读
	ReadFile(path)
	//换行读取
	ReadLineFile(path)
}

func ReadLineFile(path string) {
	file, err := os.Open(path)
	if err == nil {
		buf := make([]byte, 1024*2)
		//n代表读取内容的长度
		_, err1 := file.Read(buf)
		if err1 == nil {
			//新建一个缓冲区,内容先放在缓冲区
			r := bufio.NewReader(file)
			for {
				bufs, err2 := r.ReadBytes('\n')
				if err2 == nil {
					fmt.Println(string(bufs))
				} else {
					//文件结束
					if err2 == io.EOF {
						break
					}
					fmt.Println(err2)
				}
			}
		} else {
			fmt.Println(err)
		}
	} else {
		fmt.Println(err)
	}
	defer file.Close()
}

func ReadFile(path string) {
	file, err := os.Open(path)
	if err == nil {
		buf := make([]byte, 1024*2)
		//n代表读取内容的长度
		n, err1 := file.Read(buf)
		if err1 == nil {
			fmt.Println(string(buf[:n]))
		} else {
			fmt.Println(err)
		}
	} else {
		fmt.Println(err)
	}
	defer file.Close()
}

func WhiteFile(path string) {
	file, err := os.Create(path)
	if err == nil {
		for i := 0; i < 10; i++ {
			file.WriteString("Hello")
		}
	} else {
		fmt.Println(err)
	}
	defer file.Close()
}

6.拷贝文件案例

package main

import "fmt"
import "os"
import "io"

func main() {
	//获取命令行参数
	list := os.Args
	if len(list) == 3 {
		srcFileName := list[1]
		dstFileName := list[2]
		fmt.Println("srcFileName:", srcFileName, "dstFileName:", dstFileName)
		if srcFileName != dstFileName {
			//只读方式打开源文件
			sF, err1 := os.Open(srcFileName)
			if err1 == nil {
				dF, err2 := os.Create(dstFileName)
				defer sF.Close()
				defer dF.Close()
				if err2 == nil {
					//从源文件读 写入
					buf := make([]byte, 1024*4)
					for {
						n, err3 := sF.Read(buf)
						fmt.Println("n:", n)
						if err3 == nil {
							//写入
							dF.Read(buf[:n])
						} else {
							fmt.Println(err3)
							if err3 == io.EOF {
								break
							}
						}
					}
				} else {
					fmt.Println(err2)
				}
			} else {
				fmt.Println(err1)
			}
		} else {
			fmt.Println("name == name")
		}
	} else {
		fmt.Println("xxx srcFile dstFile")
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘某人程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值