我们在上一节中学习了结构体(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 中,当调用一个函数或方法时,参数会被复制
版权声明:除特别声明外,本站所有文章皆是本站原创,转载请以超链接形式注明出处!