为了账号安全,请及时绑定邮箱和手机立即绑定

Go 快速入门指南 - 零值和错误

标签:
Go

零值

当一个变量使用 var 进行声明后并未进行初始化 (变量后面没有赋值符 =) 操作,会默认分配一个零值 (zero value)。

不同类型对应的零值

类型 零值
bool false
int 0
float 0
string “”
byte (uint8) 0
pointer nil
func nil
interface nil
slice nil
channel nil
map nil

例子

bool 类型

package main

import "fmt"

func main() {
    var b bool
    fmt.Printf("b = %t\n", b)
}

// $ go run main.go
// 输出如下
/**
  b = false
*/

byte 类型

package main

import "fmt"

func main() {
    var b byte
    fmt.Printf("b = %c\n", b)
}

// $ go run main.go
// 输出如下
/**
  b =
*/

func 类型

package main

import "fmt"

func main() {
    var f func()
    fmt.Printf("f = %v\n", f)
}

// $ go run main.go
// 输出如下
/**
  f = <nil>
*/

channel 类型

package main

import "fmt"

func main() {
    var ch chan bool
    fmt.Printf("ch = %v\n", ch)
}

// $ go run main.go
// 输出如下
/**
  ch = <nil>
*/

例子

errors.New() 创建错误

package main

import (
    "errors"
    "fmt"
)

// 自定义除法函数
func myDivide(dividend, divisor float64) (float64, error) {
    if divisor == 0 { // 除数不能为 0
        return 0, errors.New("divide by zero") // 返回一个错误
    }
    return dividend / divisor, nil
}

func main() {
    divide, err := myDivide(100, 0)
    if err != nil {
        fmt.Printf("Error: %s\n", err) // 输出错误信息
    } else {
        fmt.Printf("100 / 0 = %.2f\n", divide) // 代码执行不到这里
    }
}

// $ go run main.go
// 输出如下
/**
  Error: divide by zero
*/

fmt.Errorf() 创建错误

不同于 errors.New(), fmt.Errorf() 在构建错误时,可以进行格式化。

package main

import (
    "fmt"
)

// 自定义除法函数
func myDivide(dividend, divisor float64) (float64, error) {
    if divisor == 0 { // 除数不能为 0
        return 0, fmt.Errorf("%.2f divide by zero", dividend) // 返回一个错误
    }
    return dividend / divisor, nil
}

func main() {
    divide, err := myDivide(100, 0)
    if err != nil {
        fmt.Printf("Error: %s\n", err) // 输出错误信息
    } else {
        fmt.Printf("100 / 0 = %.2f\n", divide) // 代码执行不到这里
    }
}

// $ go run main.go
// 输出如下
/**
  Error: 100.00 divide by zero
*/

最佳实践

永远不要忽略错误,否则可能会导致程序崩溃!

例子

errors.New() 创建错误

package main

import (
    "errors"
    "fmt"
)

// 自定义除法函数
func myDivide(dividend, divisor float64) (float64, error) {
    if divisor == 0 { // 除数不能为 0
        return 0, errors.New("divide by zero") // 返回一个错误
    }
    return dividend / divisor, nil
}

func main() {
    divide, err := myDivide(100, 0)
    if err != nil {
        fmt.Printf("Error: %s\n", err) // 输出错误信息
    } else {
        fmt.Printf("100 / 0 = %.2f\n", divide) // 代码执行不到这里
    }
}

// $ go run main.go
// 输出如下
/**
  Error: divide by zero
*/

fmt.Errorf() 创建错误

不同于 errors.New(), fmt.Errorf() 在构建错误时,可以进行格式化。

package main

import (
    "fmt"
)

// 自定义除法函数
func myDivide(dividend, divisor float64) (float64, error) {
    if divisor == 0 { // 除数不能为 0
        return 0, fmt.Errorf("%.2f divide by zero", dividend) // 返回一个错误
    }
    return dividend / divisor, nil
}

func main() {
    divide, err := myDivide(100, 0)
    if err != nil {
        fmt.Printf("Error: %s\n", err) // 输出错误信息
    } else {
        fmt.Printf("100 / 0 = %.2f\n", divide) // 代码执行不到这里
    }
}

// $ go run main.go
// 输出如下
/**
  Error: 100.00 divide by zero
*/

最佳实践

永远不要忽略错误,否则可能会导致程序崩溃!

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
全栈工程师
手记
粉丝
0
获赞与收藏
0

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消