当前位置: 首页 > news >正文

网站建设顾问公众号seo排名

网站建设顾问,公众号seo排名,嘉定网站建设,杭州平面设计师工资一般多少在上一篇教程中,我们了解了 Go 中的错误表示以及如何处理标准库中的错误。我们还学习了如何从错误中提取更多信息。 本教程介绍如何创建我们自己的自定义错误,我们可以在函数和包中使用这些错误。我们还将使用标准库所采用的相同技术来提供有关自定义错…

在上一篇教程中,我们了解了 Go 中的错误表示以及如何处理标准库中的错误。我们还学习了如何从错误中提取更多信息。

本教程介绍如何创建我们自己的自定义错误,我们可以在函数和包中使用这些错误。我们还将使用标准库所采用的相同技术来提供有关自定义错误的更多详细信息。

使用 New 函数创建自定义错误

创建自定义错误的最简单方法是使用错误包的New函数。

在我们使用 New函数创建自定义错误之前,我们先了解一下它是如何实现的。下面提供了错误包中 New 函数的实现。

package errors// New returns an error that formats as the given text.
// Each call to New returns a distinct error value even if the text is identical.
func New(text string) error {  return &errorString{text}
}// errorString is a trivial implementation of error.
type errorString struct {  s string
}func (e *errorString) Error() string {  return e.s
}

实现非常简单。errorString是具有单个字符串字段的结构类型。该接口的Error() string 方法error是使用第 1 4行中的errorString 指针接收器实现的。

第 5行中的New函数。 接受一个string参数,使用该参数创建一个errorString类型的值并返回它的地址。因此,一个新的错误被创建并返回。

现在我们知道该New函数是如何工作的,让我们在我们自己的程序中使用它来创建自定义错误。

我们将创建一个简单的程序来计算圆的面积,如果半径为负,则返回错误。

package mainimport (  "errors""fmt""math"
)func circleArea(radius float64) (float64, error) {  if radius < 0 {return 0, errors.New("Area calculation failed, radius is less than zero")}return math.Pi * radius * radius, nil
}func main() {  radius := -20.0area, err := circleArea(radius)if err != nil {fmt.Println(err)return}fmt.Printf("Area of circle %0.2f", area)
}

Run in playground

在上面的程序中,我们检查半径是否小于零。如果是这样,我们将返回nil以及相应的错误消息。如果半径大于 0,则计算面积

在 main 函数中,我们检查错误是否不等nil。 如果不是nil,我们打印错误并返回,否则打印圆的面积。

在这个程序中,半径小于零,因此它将打印,

Area calculation failed, radius is less than zero  

使用 Errorf 向错误添加更多信息

上面的程序运行良好,但如果我们打印导致错误的实际半径岂不是很好。这就是fmt包的Errorf函数派上用场的地方。该函数根据格式说明符格式化错误,并返回一个字符串作为接口的值。

让我们使用该Errorf函数并使程序变得更好。

package mainimport (  "fmt""math"
)func circleArea(radius float64) (float64, error) {  if radius < 0 {return 0, fmt.Errorf("Area calculation failed, radius %0.2f is less than zero", radius)}return math.Pi * radius * radius, nil
}func main() {  radius := -20.0area, err := circleArea(radius)if err != nil {fmt.Println(err)return}fmt.Printf("Area of circle %0.2f", area)
}

Run in playground

在上面的程序中,运行该程序将输出,

Area calculation failed, radius -20.00 is less than zero  

使用结构类型和字段提供有关错误的更多信息

还可以使用将错误接口实现为错误的结构类型。这为我们提供了错误处理的更大灵活性。在我们前面的示例中,如果我们想要访问导致错误的半径,现在唯一的方法就是解析错误描述Area calculation failed, radius -20.00 is less than zero。这不是执行此操作的正确方法,因为如果描述发生更改,我们的代码就会中断。

我们将使用上一个教程中“将错误转换为基础类型并从结构体字段检索更多信息”部分中解释的标准库所遵循的策略,并使用结构体字段提供对导致错误的半径的访问。我们将创建一个实现错误接口的结构类型,并使用其字段来提供有关错误的更多信息。

第一步是创建一个结构类型来表示错误。错误类型的命名约定是名称应以文本结尾Error。所以让我们将结构类型命名为areaError

type areaError struct {  err    stringradius float64
}

上面的结构类型有一个字段radius存储导致错误的半径值,该err字段存储实际的错误消息。

下一步是实现错误接口。

func (e *areaError) Error() string {  return fmt.Sprintf("radius %0.2f: %s", e.radius, e.err)
}

在上面的代码片段中,我们Error() string使用指针接收器实现了错误接口的方法。此方法打印半径和错误描述。

main我们通过编写函数和函数来完成程序circleArea

package mainimport (  "errors""fmt""math"
)type areaError struct {  err    stringradius float64
}func (e *areaError) Error() string {  return fmt.Sprintf("radius %0.2f: %s", e.radius, e.err)
}func circleArea(radius float64) (float64, error) {  if radius < 0 {return 0, &areaError{err:    "radius is negative",radius: radius,}}return math.Pi * radius * radius, nil
}func main() {  radius := -20.0area, err := circleArea(radius)if err != nil {var areaError *areaErrorif errors.As(err, &areaError) {fmt.Printf("Area calculation failed, radius %0.2f is less than zero", areaError.radius)return}fmt.Println(err)return}fmt.Printf("Area of rectangle %0.2f", area)
}

Run in playground

在上面的程序中,circleArea用于计算圆的面积。该函数首先检查半径是否小于零,如果是则使用导致错误的半径和相应的错误消息创建一个areaError类型值,然后返回它的地址以及0因此,我们提供了有关错误的更多信息,在本例中是使用自定义错误结构的字段导致错误的半径。

如果半径不为负,该函数将计算并返回面积以及nil

我们试图求出半径为 -20 的圆的面积。由于半径小于零,因此将返回错误。

我们检查错误是否不等nil我们尝试将其转换为*areaError 类型 。如果错误类型为\*areaError,我们将在第 1 行中获取导致错误的半径。使用areaError.radius,打印自定义错误消息并从程序返回。

如果错误不是类型*areaError,我们只需在第 1 行打印错误并返回。如果没有错误,该将打印在数值

该程序将打印

Area calculation failed, radius -20.00 is less than zero  

现在让我们使用上一篇教程中描述的第二种策略,并使用自定义错误类型的方法来提供有关错误的更多信息。

使用结构类型上的方法提供有关错误的更多信息

在本节中,我们将编写一个计算矩形面积的程序。如果长度或宽度小于零,该程序将打印错误。

第一步是创建一个结构来表示错误。

type areaError struct {  err    string //error descriptionlength float64 //length which caused the errorwidth  float64 //width which caused the error
}

上面的错误结构类型包含一个错误描述字段以及导致错误的长度和宽度。

现在我们有了错误类型,让我们实现错误接口并在错误类型上添加几个方法以提供有关错误的更多信息。

func (e *areaError) Error() string {  return e.err
}func (e *areaError) lengthNegative() bool {  return e.length < 0
}func (e *areaError) widthNegative() bool {  return e.width < 0
}

在上面的代码片段中,我们从方法返回错误的描述Error() stringlengthNegative() bool当长度小于零时,该方法返回 true;widthNegative() bool当宽度小于零时,该方法返回 true。这两种方法提供了有关错误的更多信息,在这种情况下,它们表示面积计算是否由于长度为负或宽度为负而失败。因此,我们使用了结构错误类型的方法来提供有关错误的更多信息。

下一步是编写面积计算函数。

func rectArea(length, width float64) (float64, error) {  err := ""if length < 0 {err += "length is less than zero"}if width < 0 {if err == "" {err = "width is less than zero"} else {err += ", width is less than zero"}}if err != "" {return 0, &areaError{err:    err,length: length,width:  width,}}return length * width, nil
}

上面的rectArea函数检查长度或宽度是否小于零,如果是,则返回类型为 *areaError的错误,否则返回带有nil错误的矩形面积。

让我们通过创建 main 函数来完成这个程序。

func main() {  length, width := -5.0, -9.0area, err := rectArea(length, width)if err != nil {var areaError *areaErrorif errors.As(err, &areaError) {if areaError.lengthNegative() {fmt.Printf("error: length %0.2f is less than zero\n", areaError.length)}if areaError.widthNegative() {fmt.Printf("error: width %0.2f is less than zero\n", areaError.width)}return}fmt.Println(err)return}fmt.Println("area of rect", area)
}

在 main 函数中,我们检查错误是否不等nil,如果它不为nil,我们尝试将其转换为*areaError类型。然后使用lengthNegative()widthNegative()方法检查错误是否是由于长度为负或宽度为负而导致的。我们打印相应的错误消息并从程序返回。因此,我们使用错误结构类型上的方法来提供有关错误的更多信息。

如果没有错误,将打印矩形的面积。

这是完整的程序供您参考。

package mainimport (  "errors""fmt"
)type areaError struct {  err    string  //error descriptionlength float64 //length which caused the errorwidth  float64 //width which caused the error
}func (e *areaError) Error() string {  return e.err
}func (e *areaError) lengthNegative() bool {  return e.length < 0
}func (e *areaError) widthNegative() bool {  return e.width < 0
}func rectArea(length, width float64) (float64, error) {  err := ""if length < 0 {err += "length is less than zero"}if width < 0 {if err == "" {err = "width is less than zero"} else {err += ", width is less than zero"}}if err != "" {return 0, &areaError{err:    err,length: length,width:  width,}}return length * width, nil
}func main() {  length, width := -5.0, -9.0area, err := rectArea(length, width)if err != nil {var areaError *areaErrorif errors.As(err, &areaError) {if areaError.lengthNegative() {fmt.Printf("error: length %0.2f is less than zero\n", areaError.length)}if areaError.widthNegative() {fmt.Printf("error: width %0.2f is less than zero\n", areaError.width)}return}fmt.Println(err)return}fmt.Println("area of rect", area)
}

Run in playground

该程序将打印输出,

error: length -5.00 is less than zero  
error: width -9.00 is less than zero  

我们已经看到了错误处理教程中描述的三种方法中的两种的示例,以提供有关错误的更多信息。

使用直接比较的第三种方法非常简单。我将把它作为一个练习,让您了解如何使用此策略来提供有关我们的自定义错误的更多信息。

祝你有美好的一天。


文章转载自:
http://cheezit.aaladrg.cn
http://bedsettee.aaladrg.cn
http://aptly.aaladrg.cn
http://bolar.aaladrg.cn
http://aerify.aaladrg.cn
http://campaniform.aaladrg.cn
http://adaptable.aaladrg.cn
http://addiction.aaladrg.cn
http://caragana.aaladrg.cn
http://badly.aaladrg.cn
http://autecology.aaladrg.cn
http://adina.aaladrg.cn
http://annalistic.aaladrg.cn
http://bondon.aaladrg.cn
http://brutism.aaladrg.cn
http://blowhard.aaladrg.cn
http://bisearch.aaladrg.cn
http://bacchanal.aaladrg.cn
http://biostrategy.aaladrg.cn
http://briticization.aaladrg.cn
http://anury.aaladrg.cn
http://akureyri.aaladrg.cn
http://capsular.aaladrg.cn
http://cattleman.aaladrg.cn
http://brazen.aaladrg.cn
http://backslidden.aaladrg.cn
http://behaviour.aaladrg.cn
http://abstracted.aaladrg.cn
http://anear.aaladrg.cn
http://afterbeat.aaladrg.cn
http://arbor.aaladrg.cn
http://anymore.aaladrg.cn
http://accessary.aaladrg.cn
http://assertor.aaladrg.cn
http://burrito.aaladrg.cn
http://avalanchine.aaladrg.cn
http://autoregulatory.aaladrg.cn
http://castaly.aaladrg.cn
http://arsenate.aaladrg.cn
http://caracara.aaladrg.cn
http://anthrax.aaladrg.cn
http://acromion.aaladrg.cn
http://bandleader.aaladrg.cn
http://amitrole.aaladrg.cn
http://chinbone.aaladrg.cn
http://cardoon.aaladrg.cn
http://cheval.aaladrg.cn
http://brassage.aaladrg.cn
http://chromophoric.aaladrg.cn
http://bikini.aaladrg.cn
http://azobenzol.aaladrg.cn
http://cckw.aaladrg.cn
http://breaking.aaladrg.cn
http://articulator.aaladrg.cn
http://alchemize.aaladrg.cn
http://aethereal.aaladrg.cn
http://acetabula.aaladrg.cn
http://centroplast.aaladrg.cn
http://cargo.aaladrg.cn
http://bolivar.aaladrg.cn
http://caryatid.aaladrg.cn
http://affirm.aaladrg.cn
http://alcoholization.aaladrg.cn
http://camper.aaladrg.cn
http://bureaux.aaladrg.cn
http://airscrew.aaladrg.cn
http://carrousel.aaladrg.cn
http://chinook.aaladrg.cn
http://aglare.aaladrg.cn
http://cavu.aaladrg.cn
http://barbule.aaladrg.cn
http://azus.aaladrg.cn
http://cellar.aaladrg.cn
http://brangus.aaladrg.cn
http://bloodshot.aaladrg.cn
http://beehive.aaladrg.cn
http://aripple.aaladrg.cn
http://cerate.aaladrg.cn
http://breastwork.aaladrg.cn
http://benefic.aaladrg.cn
http://ceasing.aaladrg.cn
http://armoury.aaladrg.cn
http://bunion.aaladrg.cn
http://chairman.aaladrg.cn
http://bromyrite.aaladrg.cn
http://ambassadorial.aaladrg.cn
http://campanulate.aaladrg.cn
http://bouquet.aaladrg.cn
http://arbitress.aaladrg.cn
http://carragheenin.aaladrg.cn
http://abbeystead.aaladrg.cn
http://annelidan.aaladrg.cn
http://chasseur.aaladrg.cn
http://aborigines.aaladrg.cn
http://aleph.aaladrg.cn
http://buran.aaladrg.cn
http://calendula.aaladrg.cn
http://ccu.aaladrg.cn
http://burnt.aaladrg.cn
http://ardeid.aaladrg.cn
http://www.tj-hxxt.cn/news/37530.html

相关文章:

  • 佛山网站建设有限公司百度竞价入门教程
  • wordpress跳转站点大地资源网在线观看免费
  • 如何使用框架来建设网站今日热点新闻事件2022
  • 有哪些外贸网站产品推广找哪家公司
  • 做网站标志有限颜色使用的吗哪个好用?
  • 做网站什么时候注册商标怎么投稿各大媒体网站
  • 部署个人网站中山口碑seo推广
  • 黑龙江网站建站建设百度推广代理商利润
  • 太原做网站百度的客服电话是多少
  • 大数据技术建设网站国外网络推广
  • 个人网站 bootstrap事件营销成功案例
  • 那家网站做的效果好互联网营销专家
  • 重庆开网站如何在百度上做产品推广
  • 网页源代码中什么标记必不可少长春关键词优化报价
  • 东莞市做网站的网站推广在线推广
  • 设计公司给公司做网站用了方正字体微信怎么做推广
  • 成都网站制作-中国互联seo竞价排名
  • 网站备案ip地址各大网站收录提交入口
  • hello外贸人才网seo优化包括什么
  • 企业手机网站cms网络营销方式都有哪些
  • vps做网站的环境怎么办网站平台
  • 南昌网站建设和推广seoyoon
  • 订阅号可以做网站么网站超级外链
  • 广州网站制作技术优化seo是什么意思
  • 网站地图提交地址前端开发培训机构推荐
  • 专门做家纺的网站上海最近三天的新闻
  • 做页面设计的网站如何做平台推广
  • 海口双语网站建设十大免费excel网站
  • 网页小程序开发武汉seo服务
  • 广西住房建设厅网站首页百度一下你就知道下载