最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Go語言的error類型

 更新時間:2020年12月19日 10:08:47   作者:fwhezfwhez  
這篇文章主要介紹了淺談Go語言的error類型,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

error類型是go語言的一種內(nèi)置類型,使用的時候不用特定去import,他本質(zhì)上是一個接口

 type error interface{
 Error() string //Error()是每一個訂制的error對象需要填充的錯誤消息,可以理解成是一個字段Error
}

怎樣去理解這個訂制呢?

我們知道接口這個東西,必須擁有它的實現(xiàn)塊才能調(diào)用,放在這里就是說,Error()必須得到填充,才能使用.

比方說下面三種方式:

第一種:通過errors包去訂制error

error := errors.New("hello,error")//使用errors必須import "errors"包
if error != nil {
 fmt.Print(err)
}

來解釋一下errors包,只是一個為Error()填充的簡易封裝,整個包的內(nèi)容,只有一個New方法,可以直接看

func New(text string) error

第二種:通過fmt.Errorf()去訂制

err := fmt.Errorf("hello error")
if err != nil {
 fmt.Print(err)
}

可以說和第一種雷同了.

第三種:就是通過自定義的MyError塊去訂制了

//一個包裹了錯誤類型對象的自定義錯誤類型
type MyError struct {
err error 
}
//訂制Error()
func (e MyError) Error() string {
 return e.err.Error()
}
func main() {
 err:=MyError{
 errors.New("hello error"),
 }
 fmt.Println(err.Error())
}

三種方式差異都不大,輸出結(jié)果都是 hello error

實際上error只是一段錯誤信息,真正拋出異常并不是單純靠error,panic和recover的用法以后總結(jié)。

補(bǔ)充:go error接口與errors包詳解

1 error接口

定義:

 type error interface{
 Error() string //Error()是一個方法,是每一個訂制的error對象需要填充的錯誤消息,可以理解成是一個字段Error
}

1.1 常見調(diào)用方式

模板

n, err := Foo(0) 
 
if err != nil { 
 // 錯誤處理 
} else { 
 // 使用返回值 n 
} 

練習(xí)1

package main
import ( 
 "fmt"
 "os"
)
func main() { 
 f, err := os.Open("/test.txt")
 if err != nil {
  fmt.Println(err)
  return
 }
 fmt.Println(f.Name(), "opened successfully")
}

[root@localhost error]# go run err3.go

open /test.txt: no such file or directory

1.2 自定義error方法

1.2.1 函數(shù)調(diào)用error

func Foo(param int)(n int, err error) { 
 // ... 
} 

1.2.2 自定義Error模板1

type fileError struct {
}
func (fe *fileError) Error() string {
 return "文件錯誤"
}

練習(xí)1

模擬一個錯誤

package main
import "fmt"
type fileError struct {
}
func (fe *fileError) Error() string { //自定義會覆蓋原來的Error接口
 return "文件錯誤"
}
//只是模擬一個錯誤
func openFile() ([]byte, error) {
 return nil, &fileError{}
}
func main() {
 conent, err := openFile()
 if err != nil {
  fmt.Println(err)
 } else {
  fmt.Println(string(conent))
 }
}

[root@localhost error]# go run err1.go

文件錯誤

1.2 自定義Error模板2

自定義中添加一個字符串

type fileError struct {
 s string
}
func (fe *fileError) Error() string {
 return fe.s
}

練習(xí)2

聲明fileError的時候,設(shè)置好要提示的錯誤文字

package main
import "fmt"
type fileError struct {
 s string
}
func (fe *fileError) Error() string {
 return fe.s
}
//只是模擬一個錯誤
func openFile() ([]byte, error) {
 return nil, &fileError{"文件錯誤,自定義"} 
}
func main() {
 conent, err := openFile()
 if err != nil {
  fmt.Println(err)
 } else {
  fmt.Println(string(conent))
 }
}

[root@localhost error]# go run err2.go

文件錯誤,自定義

練習(xí)3

添加一個時間刻度

package main
import (
 "fmt"
 "time"
)
type MyError struct {
 When time.Time
 What string
}
func (e MyError) Error() string {
 return fmt.Sprintf("%v: %v", e.When, e.What)
}
func oops() error {
 return MyError{
  time.Date(1989, 3, 15, 22, 30, 0, 0, time.UTC),
  "the file system has gone away",
 }
}
func main() { 
 if err := oops(); err != nil { 
  fmt.Println(err) 
 }
}

[root@localhost error]# go run err4.go

1989-03-15 22:30:00 +0000 UTC: the file system has gone away

練習(xí)三

沒有打開文件報錯

package main
import (
 "fmt"
 "os"
)
type PathError struct {
 Op string
 Path string
 Err error
}
func (e *PathError) Error() string { 
  return e.Op + " " + e.Path + ": " + e.Err.Error() 
} 
func main() {
 f, err := os.Open("/test.txt")
 if errObject, ok := err.(*os.PathError); ok {
 fmt.Println("錯誤輸出:",err, "文件路徑:", errObject.Path)
 return
 }
 fmt.Println(f.Name(), "opened successfully")
} 

[root@localhost error]# go run err5.go

錯誤輸出: open /test.txt: no such file or directory 文件路徑: /test.txt

2 errors包

2.1 獲取error包

go get github.com/pkg/errors

2.2 errors.New()

errors.New()接收合適的錯誤信息來創(chuàng)建

先聲明再使用

l練習(xí)1

package main
import (
 "errors"
 "fmt"
)
var errNotFound error = errors.New("Not found error")
func main() {
 fmt.Printf("error: %v", errNotFound)
}

[root@localhost error]# go run errs1.go

error: Not found error

練習(xí)2

函數(shù)如何調(diào)用err

直接使用

package main
import (
 "errors"
 "fmt"
)
func Sqrt(f float64) (float64, error) {
  if f < 0 {
   return 0, errors.New("math - square root of negative number")
  }else {
   return 1, errors.New("math - square root of 10")
  }
}
func main() {
 if _, err := Sqrt(-1); err != nil {
  fmt.Printf("Error: %s\n", err)
 }
}

[root@localhost error]# go run errs2.go

Error: math - square root of negative number

3 自定義error與errors.New()使用比較

比較自定義error與errors.New()函數(shù)根據(jù)需求其實各有優(yōu)點。

package main
import (
 "errors"
 "fmt"
)
type MsgError struct {
 Code int
 Msg string
}
func (msg *MsgError) Error() string {
 return fmt.Sprintf("%s", msg.Msg)
}
func f1(code int) (int, error) {
 if code == 1 {
 return -1, errors.New("msg test error")
 }
 return code, nil
}
func f2(code int) (int, error) {
 if code == 1 {
 return -1, &MsgError{code, "struct msg test error"}
 }
 return code, nil
}
func main() {
 for _, v := range []int{1, 2, 3, 4, 5, 6} {
  if code, err := f1(v); err != nil {
 fmt.Println(err)
 } else {
 fmt.Println("success:", code)
 }
 }
 for _, i := range []int{1, 2, 3} {
 if code, err := f2(i); err != nil {
 fmt.Println(err)
 } else {
 fmt.Println("success:", code)
 }
 }
}
[root@localhost error]# go run errs3.go
msg test error
success: 2
success: 3
success: 4
success: 5
success: 6
struct msg test error
success: 2
success: 3

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • 解決panic: assignment to entry in nil map問題

    解決panic: assignment to entry in nil

    這篇文章主要介紹了解決panic: assignment to entry in nil map問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2008-01-01
  • Go語言實現(xiàn)常見限流算法的示例代碼

    Go語言實現(xiàn)常見限流算法的示例代碼

    計數(shù)器、滑動窗口、漏斗算法、令牌桶算法是我們常見的幾個限流算法,本文將依次用Go語言實現(xiàn)這幾個限流算法,感興趣的可以了解一下
    2023-05-05
  • Go語言的io輸入輸出流方式

    Go語言的io輸入輸出流方式

    Go語言中,輸入輸出流的處理通過io庫中的Reader和Writer接口來實現(xiàn),Reader接口定義了Read方法,用于從流中讀取數(shù)據(jù)到程序中,Writer接口定義了Write方法,用于將數(shù)據(jù)寫入到底層的數(shù)據(jù)流中,這些接口被許多標(biāo)準(zhǔn)庫的類型所實現(xiàn)
    2024-10-10
  • 深入理解Golang中指針的用途與技巧

    深入理解Golang中指針的用途與技巧

    在 Go 語言中,指針是一種重要的概念,了解和正確使用指非常關(guān)鍵,因此本文小編就來和大家講講Golang 中指針的概念與用法,希望對大家有所幫助
    2023-05-05
  • Golang?實現(xiàn)Redis?協(xié)議解析器的解決方案

    Golang?實現(xiàn)Redis?協(xié)議解析器的解決方案

    這篇文章主要介紹了Golang???實現(xiàn)?Redis?協(xié)議解析器,本文將分別介紹Redis 通信協(xié)議 以及 協(xié)議解析器 的實現(xiàn),若您對協(xié)議有所了解可以直接閱讀協(xié)議解析器部分,需要的朋友可以參考下
    2022-10-10
  • 優(yōu)雅使用GoFrame共享變量Context示例詳解

    優(yōu)雅使用GoFrame共享變量Context示例詳解

    這篇文章主要為大家介紹了優(yōu)雅使用GoFrame共享變量Context示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Golang?Redis連接池實現(xiàn)原理及示例探究

    Golang?Redis連接池實現(xiàn)原理及示例探究

    這篇文章主要為大家介紹了Golang?Redis連接池實現(xiàn)示例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • K8s部署發(fā)布Golang應(yīng)用程序的實現(xiàn)方法

    K8s部署發(fā)布Golang應(yīng)用程序的實現(xiàn)方法

    本文主要介紹了K8s部署發(fā)布Golang應(yīng)用程序的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • Go內(nèi)存節(jié)省技巧簡單實現(xiàn)方法

    Go內(nèi)存節(jié)省技巧簡單實現(xiàn)方法

    這篇文章主要為大家介紹了Go內(nèi)存節(jié)省技巧簡單實現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Go中的fuzz模糊測試使用實戰(zhàn)詳解

    Go中的fuzz模糊測試使用實戰(zhàn)詳解

    這篇文章主要為大家介紹了Go中的fuzz模糊測試使用實戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12

最新評論

上杭县| 惠安县| 乾安县| 花莲县| 汉源县| 林甸县| 湘阴县| 潢川县| 吉隆县| 宣威市| 独山县| 额尔古纳市| 汤原县| 德阳市| 永川市| 将乐县| 芦山县| 密云县| 道孚县| 太谷县| 长顺县| 晋江市| 资源县| 资兴市| 三台县| 通河县| 鲁甸县| 桃园县| 漳州市| 庆云县| 名山县| 民勤县| 股票| 濮阳县| 武义县| 色达县| 吴忠市| 阿瓦提县| 莱西市| 东海县| 东光县|