Go语言基础 Part3

说明

本文为GO语言基础的学习笔记,涉及异常处理和文件读写。

异常处理和文件读写

error 接口

error 用于提示编译时异常和运行时异常等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package main

import (
"fmt"
"errors"
)
func divide(a int, b int) (value int, err error) {

if b == 0 {
err = errors.New("0不能作为除数")
return
} else {
value = a / b
return
}
}
func main() {
value,err:=divide(10,0)
//err不过不等于空表示有错误信息
if err != nil{
fmt.Println(err)
}else {
fmt.Println(value)
}
}

panic 异常处理

1
2
3
4
5
6

func main(){
//Do SomeThing
panic("hello, world") //调用后程序终止运行
//以后的代码不会被运行
}

defer 延迟调用

defer函数会在程序运行结束前调用,

1
2
3
4
5
6
7
8
9
10
11
12
13
func main() {
a := 10
b := 20
defer func(a int , b int) {
fmt.Println(a)
fmt.Println(b)
}(a,b) //虽然是延迟调用,但是传入参数已经提前确定
a = 100
b = 200
fmt.Println(a)
fmt.Println(b)
}
//输出顺序100, 200, 10, 20

Stdin 标准输入

os.Stdin中读取

os.Stdin.Read()

1
2
3
4
5
6
7
8
9
10
11
12
func main() {
//申请缓存空间
var buffer [512]byte
//将输入读入缓存
n, err := os.Stdin.Read(buffer[:])
if err != nil {
fmt.Println("read error:", err)
return
}

fmt.Println("count:", n, ", msg:", string(buffer[:]))
}

bufio读取输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main
import (

"bufio"
"fmt"
"os"
)

func main() {

reader := bufio.NewReader(os.Stdin)

result, err := reader.ReadString('\n')
if err != nil {
fmt.Println("read error:", err)
}
fmt.Println("result:", result)

}

文件

文件创建

创建文件: fp,err = os.Creat(“文件路径”)
打开文件: fp.OpenFile()
文件关闭: fp.Close()
文件写入: fp.WriteString(“content”) fp. Write([]byte)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func fileCreate(){
fp, err := os.Create("F:/test.txt")
if err!= nil {
fmt.Println("create file failed")
return
}
defer fp.Close()
n ,_ := fp.WriteString("Hello Nanari\r\n")
fmt.Println(n)
fp.WriteString("O hai yo\r\n")
//通过字符串获取字符切片
b := []byte("Good morning Nanari")
fp.Write(b)

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
func fileOpen(){
fp, err := os.Open("F:/test.txt")
if err!=nil {
fmt.Println("Open File Error")
return
}
b :=make([]byte,256)

//fp.Read(b)
//fmt.Println((string(b)))

//for循环调用两次
// err 的值变化: nil ——> EOF
for{
n,err := fp.Read(b)
if err == io.EOF{
break
}
fmt.Println((string(b[:n])))
}
}

文件读写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
func Openwrite(){
//os.OpenFile()可以设置读写权限
//os.Open()是只读的
fp, err := os.OpenFile("F:/test.txt",os.O_RDWR,6)
if err!= nil{
fmt.Println("Open Fail")
return
}
defer fp.Close()

//建立缓存用于接收输入
b := make([]byte,256)
os.Stdin.Read(b)
// 找到文件末尾,在其 0 byte之后写入
n,_ := fp.Seek(0,io.SeekEnd)
fp.WriteAt(b,n )

fmt.Println(string(b))
}

文件拷贝

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
func copyFile(){
fp1, err1 := os.Open("F:/test.txt")
if err1 != nil {
fmt.Println("Open Error")
return
}
fp2, err2 := os.Create("F:/copy.txt")
if err2 != nil {
fmt.Println("Craate Error")
return
}
defer fp1.Close()
defer fp2.Close()

b := make([]byte,256)
for{
n,err := fp1.Read(b)
if err== io.EOF{
break
}
fp2.Write(b[:n])
}
fmt.Println("copy success")
}

字符串处理

查找子串: sub := strings.Contains(str,”subString”) //返回值为布尔类型
查找子串并返回下标: index := strings.Index(str,”substring”)
拼接子串: str_join := strings.Join(str,” “)
字符串重复: str := strings.Repeat(str,2)
字符串替换: str := strings,Replace(sourceStr,toBereplacedStr,ReplaceStr,RepalceTime)

* ReplaceTime = -1 表示全部替换  

字符串切割,返回[]string: s := strings.Split(sr,”-“)
字符串去首尾: s:= strings.Trim(str,”sub”)
字符串去空格: s:= strings.Fields(str)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
func stringsDemo(){
//查找
str := "Hello"
value := strings.Contains(str,"lo")
i := strings.Index(str,"lo")
fmt.Println(i) //3
if value {
fmt.Println(str,"contain","lo") //Hello contain lo
} else {
fmt.Println("no find")
}

//拼接
str2 := []string{"I","am","ironman"}
str3 := strings.Join(str2," ")
fmt.Println(str3) //I am ironman

//重复
str4 := strings.Repeat(str,2)
fmt.Println(str4) //HelloHello

//替换
str5 := strings.Replace(str4,"He","She",-1)
fmt.Println(str5) //ShelloShello

//切割
number := "123-345-567-789"
str6 := strings.Split(number,"-")
fmt.Println(str6) //[123 345 567 789]

//去首尾
str7 :="++++++++Cplusplus+++++++"
str8 := strings.Trim(str7,"+")
fmt.Println(str8)//Cplusplus

//去空格
str9 :="karata dai jyo bu ?"
str10 := strings.Fields(str9)
fmt.Println(str10)//[karata dai jyo bu ?]
}