Go基礎(chǔ)編程---異常處理和文件處理、json寝贡、字符串轉(zhuǎn)換..

異常處理

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
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市斋陪,隨后出現(xiàn)的幾起案子朽褪,更是在濱河造成了極大的恐慌,老刑警劉巖无虚,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缔赠,死亡現(xiàn)場離奇詭異,居然都是意外死亡友题,警方通過查閱死者的電腦和手機(jī)橡淑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咆爽,“玉大人梁棠,你說我怎么就攤上這事《饭。” “怎么了符糊?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長呛凶。 經(jīng)常有香客問我男娄,道長,這世上最難降的妖魔是什么漾稀? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任模闲,我火速辦了婚禮,結(jié)果婚禮上崭捍,老公的妹妹穿的比我還像新娘尸折。我一直安慰自己,他們只是感情好殷蛇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布实夹。 她就那樣靜靜地躺著橄浓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪亮航。 梳的紋絲不亂的頭發(fā)上荸实,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機(jī)與錄音缴淋,去河邊找鬼准给。 笑死,一個(gè)胖子當(dāng)著我的面吹牛重抖,可吹牛的內(nèi)容都是我干的圆存。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼仇哆,長吁一口氣:“原來是場噩夢啊……” “哼沦辙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起讹剔,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤油讯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后延欠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陌兑,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年由捎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兔综。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡狞玛,死狀恐怖软驰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情心肪,我是刑警寧澤锭亏,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站硬鞍,受9級特大地震影響慧瘤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜固该,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一锅减、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧伐坏,春花似錦怔匣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拴疤。三九已至永部,卻和暖如春独泞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背苔埋。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工懦砂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人组橄。 一個(gè)月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓荞膘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親玉工。 傳聞我的和親對象是個(gè)殘疾皇子羽资,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容