Go 语言:如何利用好 TDD 学习指针并了解 Golang 中的 error 处理

寻技术 Go编程 2023年07月12日 82
我们在上一节中学习了结构体(structs),????Go语言:利用 TDD 驱动开发测试 学习结构体、方法和接口
它可以组合与一个概念相关的一系列值。
你有时可能想用结构体来管理状态,通过将方法暴露给用户的方式,让他们在你可控的范围内修改状态。
金融科技行业都喜欢 Go 和比特币吧?那就来看看我们能创造出多么惊人的银行系统。
首先声明一个 Wallet(钱包)结构体,我们可以利用它存放 Bitcoin(比特币)

首先写测试

func TestWallet(t *testing.T) {

    wallet := Wallet{}

    wallet.Deposit()

    got := wallet.Balance()
    want := 

    if got != want {
        t.Errorf("got %d want %d", got, want)
    }
}

在前面的示例中,我们直接使用字段名称访问字段,但是在 非常强调安全性的钱包 中,我们不想暴露自己的内部状态,而是通过方法来控制访问的权限。

尝试运行测试

./wallet_test.go:7:12: undefined: Wallet

为测试的运行编写最少量的代码并检查失败测试的输出

编译器不知道 Wallet 是什么,所以让我们告诉它。

type Wallet struct { }

现在我们已经生成了自己的钱包,尝试再次运行测试

./wallet_test.go:9:8: wallet.Deposit undefined (type Wallet has no field or method Deposit)
./wallet_test.go:11:15: wallet.Balance undefined (type Wallet has no field or method Balance)

正如所料,我们需要定义这些方法以使测试通过。
 请记住,只做足够让测试运行的事情。我们需要确保测试失败时,显示清晰的错误信息。
func (w Wallet) Deposit(amount int) {

}

func (w Wallet) Balance() int {
    return 
}

测试现在应该编译通过了,然后运行

wallet_test.go:15: got 0 want 10

编写足够的代码使其通过

结构中需要一些 balance(余额)变量来存储状态

type Wallet struct {
    balance int
}
在 Go 中,如果一个符号(例如变量、类型、函数等)是以小写符号开头,那么它在 定义它的包之外 就是私有的。
在我们的例子中,我们只想让自己的方法修改这个值,而其他的不可以。
记住,我们可以使用「receiver」变量访问结构体内部的 balance
func (w Wallet) Deposit(amount int) {
    w.balance += amount
}

func (w Wallet) Balance() int {
    return w.balance
}

现在我们的事业在金融科技的保护下,将会运行并轻松的通过测试

wallet_test.go:15: got 0 want 10

 

为什么报错了?

这让人很困惑,我们的代码看上去没问题,我们在余额中添加了新的金额,然后余额的方法应该返回它当前的状态值。

在 Go 中,当调用一个函数或方法时,参数会被复制

版权声明:除特别声明外,本站所有文章皆是本站原创,转载请以超链接形式注明出处!
关闭

用微信“扫一扫”