異常處理
error 接口 (非致命錯(cuò)誤)
err := fmt.Errorf( "%s", "提示erro")
// 第二種:
import "errors"
err2 := errors.New("this is normal err")
eg:
import (
"fmt"
"errors"
)
func main () {
a,b := 12 ,0
result, err := divide(a, b)
if err != nil{
fmt.Println(err)
}else{
fmt.Println(result)
}
}
func divide (a,b int) (result int, err error) {
err = nil
if b == 0 {
err = errors.New("分母不能為0")
}else {
result = a / b
}
return
}
panic( 致命錯(cuò)誤扒披,程序崩潰)
// 自己調(diào)用panic()
func aa(){
fmt.Println("aaaa")
}
func bb(){
panic("cuowu ")
fmt.Println("bbbb")
}
func cc(){
fmt.Println("cccc")
}
aa()
bb()
cc() // 只會(huì)打 aaa 然后報(bào)錯(cuò)值依,程序停止
// 內(nèi)部自動(dòng)調(diào)用的panic場景有圃泡,數(shù)組下標(biāo)訪問出界....
recover (防止程序崩潰導(dǎo)致不運(yùn)行)
func testc ( x int) {
defer func (){
if err := recover(); err !=nil{
fmt.Println(err)
}
}()
a := [10]int{}
a[x] = 11
}
func main () {
testc(20)
fmt.Println("ok----------------------------")
}
文件處理
字符串處理 需要 import "strings"
fmt.Println(strings.Contains("hellow", "hell")) // 包含返回true,否則返回false
s := []string{"abc","efg","hgk"}
fmt.Println(strings.Join(s,"#")) // abc#efg #hgk 將切片組合成字符串
fmt.Println(strings.Index("hellow","ow")) // 4 愿险,若查不到返回 -1
fmt.Println(strings.Repeat("he", 3)) // hehehe
fmt.Println(strings.Split("aa-bb-cc-dd", "-")) //[aa bb cc dd] 切片
fmt.Println(strings.Trim(" xx xx "," ")) // xx xx 去前后空格
fmt.Println(strings.Fields("xx bb cc dd ")) // [xx bb cc dd] 按照空格颇蜡,把元素放入到切片中
字符串轉(zhuǎn)換 import "strconv"
slice := make([]byte,0,1024)
slice = strconv.AppendBool(slice, true) //把bool類型轉(zhuǎn)為字符串類型
slice = strconv.AppendInt(slice, 112, 10) // 最后一個(gè)參數(shù)指定10進(jìn)制的方式追加
slice = strconv.AppendQuote(slice, "aaa") // 追加字符串
fmt.Println(string(slice)) // 轉(zhuǎn)換成字符串后打印---true112"aaa"
// 其他類型轉(zhuǎn)為字符串
var str string
str = strconv.FormatBool(false) // 把 bool轉(zhuǎn)為string
str = strconv.FormatFloat(3.14, 'f' , -1 ,64) //f 指打印格式价说,-1指小數(shù)點(diǎn)位數(shù),64以float64
str = strconv.Itoa(666) // 整型轉(zhuǎn)字符串 (常用)
// 字符串轉(zhuǎn)為其他類型
a,err := strconv.ParseBool("true") //true --- <nil>
a,err := strconv.Atoi("555") //555--- <nil>
fmt.Println(a,"---",err)
正則表達(dá)式 import "regexp"
buf := "avnvv sdsds adc"
reg := regexp.MustCompile(`a.c`) // 創(chuàng)建匹配規(guī)則
if reg == nil {
return
}
res := reg.FindAllStringSubmatch(buf, -1) // -1指從頭到尾
fmt.Println(res) // 返回一個(gè)分組的切片 [[adc]]
JSON處理
通過結(jié)構(gòu)體生成json
package main
import (
"encoding/json"
"fmt"
)
func main() {
type IT struct {
Company string `json:"company"` // 二次編碼风秤,改為小寫
Subjects []string `json:"-"` // - 代表此字段不輸出
IsOk bool `json:"isOk,string"` // 將布爾類型的以string輸出
Price float64 `json:"price"`
}
s := IT{"aas", []string{"go", "c++", "node", "web"}, true, 3.22}
//編碼鳖目,根據(jù)內(nèi)容生成json文本
// buf,err := json.Marshal(s) //json未格式化輸出 {"company":"aas","isOk":"true","price":3.22}
buf, err := json.MarshalIndent(s, "", " ") //json格式化代碼輸出,兩個(gè)參數(shù)表示每一行的前綴和縮進(jìn)方式,固定寫法
if err != nil {
return
}
fmt.Println("buf= ", string(buf))
/*
buf = {
"company": "aas",
"isOk": "true",
"price": 3.22
}
*/
}
通過map生成json
//創(chuàng)建一個(gè)map
m := make(map[string]interface{},4)
m["company"] = "aas"
m["subjectes"] = []string{"go","c++"}
m["isok"] = true
// 編碼成json
result, err := json.MarshalIndent(m,""," ")
if err != nil{
return
}
fmt.Println("res = ", string(result))
json解析到結(jié)構(gòu)體
jsonBuf :=`
"company": "aas",
"subjects" :[
"go",
"c++"
],
"isok" : true,
"price" : 1.33
`
// 定義結(jié)構(gòu)體:
type IT struct{
Company string `json:"company"` // 二次編碼,改為大寫
Subjects []string `json:"subjects"` // 定義多少字段會(huì)顯示多少字段
IsOk bool `json:"isok"`
Price float64 `json:"price"`
}
// 定義一個(gè)結(jié)構(gòu)體實(shí)體
var tmp IT
err := json.Unmarshal([]byte(jsonBuf), &tmp) // 第二個(gè)參數(shù)要傳地址
if err!= nil{
return
}
fmt.Printf("tmp= %+v\n", tmp)
json解析到map
jsonBuf :=`
"company": "aas",
"subjects" :[
"go",
"c++"
],
"isok" : true,
"price" : 1.33
`
m :=make(map[string]interface{},4)
err :=json.Unmarshal([]byte(jsonBuf), &m)
fmt.Printf("m = %+v \n", m)
//但是要用json數(shù)據(jù)的話就要使用類型斷言缤弦,一步步反推领迈,才可以,一般json轉(zhuǎn)結(jié)構(gòu)體碍沐。
文件操作 import "os"
os.Create(filename) // 返回一個(gè)文件對象和error狸捅,如果有清空,不存在就創(chuàng)建
path := "./demo.txt"
WriteFile(path)
// 寫文件
func WriteFile( path string){
f,err := os.Create(path)
if err != nil { return }
defer f.Close()
var buf string
for i:=0 ; i <10; i++{
buf = fmt.Sprintf("%d\n",i) // 將保存在buf里面
n, err := f.WriteString(buf)
if err ! = nil{ return }
}
}
// 讀文件
func ReadFile(path string){
f,err := os.Open(path)
if err != nil{ return}
defer f.Close()
buf := make([]byte,1024*2) // 定義一個(gè)2kb長的切片
n,err1 :=f.Read(buf) // n代表從文件讀取內(nèi)容的長度
if err1 !=nil && err1 != io.EOF{return } //文件出錯(cuò)同時(shí)也沒到結(jié)尾
fmt.Println("buf = ",string(buf[:n]))
}
// 按照行讀取累提,需要bufio這個(gè)庫尘喝,引入
import "bufio"
文件拷貝小列子
package main
import (
"fmt"
"os"
"io"
)
func main () {
orPath, newPath := getPath()
orf,err := os.Open(orPath)
if err != nil { return }
defer orf.Close()
// 創(chuàng)建新的文件目錄
f,err2 := os.Create(newPath)
if err2 != nil{ return }
defer f.Close()
// 創(chuàng)建buffer 大小4kb
buf := make([]byte, 4*1024)
for{
n, err := orf.Read(buf)
if err !=nil{
if err == io.EOF{ // 判斷讀取出錯(cuò)是否由于已經(jīng)讀完引起
break
}
}
f.Write(buf[:n]) // 有多少讀多少
}
}
// 獲取用戶刷
func getPath()(orPath, newPath string){
list := os.Args
if len(list) != 3{
fmt.Println("輸入錯(cuò)誤")
return
}
orPath = list[1]
newPath = list[2]
return
}