golang,使用类型断言的一个例子

本文介绍了Go语言中使用空接口接收任意类型变量并进行类型断言的方法,展示了如何通过类型断言动态获取数据,实现代码复用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

type SpotPrice struct {
    ProductId        string  `db:"product_id"`   //产品id
    High             float64 `db:"high"`         //最高价
    Low              float64 `db:"low"`          //最低价
    RenewDate        string  `db:"renew_date"`   //更新时间
}
.
.
.

var pricei interface{}
var err error
pricei, err = db.GetSpotPrice(realPrice.ProductId,"","",1,1)
    if err != nil {
        logger.Warnning(err)
        continue
    }
    value := pricei.([]price.SpotPrice)
    realPrice.High = value[0].High
    realPrice.Low = value[0].Low
    realPrice.RenewDate = value[0].RenewDate

go的接口功能特别强大,空接口可以接受任何类型的变量,这不就有点类似c++的多态嘛,运行时确定,dynamic,哈哈哈


言归正传,pricei是一个空接口,db.GetSpotHistoryPrice(conf.ProductId,"","",1,1)返回的类型是[]SpotPrice,动态传给了priceivalue := pricei.([]price.SpotPrice)这句是进行类型断言,是Go语言里面的一个语法特性。这时候value就是一个真真正正的[]price.SpotPrice


引申一下,Comma-ok断言:
value, ok = element.(T),这里value就是变量的值,ok是一个bool类型,element是interface变量,T是断言的类型。


拿到了value,我就可以做任何想做的事情了,比如上述代码接下来的取值赋值。


这样用的好处,就是可以代码复用,当我接收到一个函数返回的类型是多种的,不确定的,就可以这么写,然后进行类型断言,动态绑定数据。

### Golang 编写测试函数 在 Go 语言中,编写测试函数主要依赖于 `testing` 包。为了创建有效的测试案例,遵循特定的命名约定和结构非常重要。 #### 创建测试文件 按照惯例,在 Go 中,单元测试通常放置在同一包内,并且测试文件名以 `_test.go` 结尾[^3]。如果要为名为 `math.go` 的源码文件编写测试,则对应的测试文件应当叫做 `math_test.go`。 #### 定义测试函数 测试函数应该定义为接受单一参数——指向 `*testing.T` 类型的对象作为输入。这允许测试逻辑向标准错误流报告失败情况。下面是一个简单的例子: ```go package main import ( "fmt" "testing" ) func TestAdd(t *testing.T) { result := add(2, 3) expected := 5 if result != expected { t.Errorf("Expected %d but got %d", expected, result) } } ``` 此代码片段展示了如何通过比较预期结果与实际返回值来进行基本验证[^5]。 对于更复杂的场景,还可以利用表格驱动的方式执行多个断言: ```go func TestAddTableDriven(t *testing.T) { var tests = []struct { a, b, want int }{ {0, 0, 0}, {1, 2, 3}, {-1, -1, -2}, } for _, tt := range tests { testname := fmt.Sprintf("%d+%d", tt.a, tt.b) t.Run(testname, func(t *testing.T) { ans := add(tt.a, tt.b) if ans != tt.want { t.Errorf("got %d, want %d", ans, tt.want) } }) } } ``` 这段代码使用了匿名结构体数组来存储不同情况下期望的结果以及调用 `t.Run()` 方法运行子测试,从而提高了可读性和维护性[^4]。 此外,还有其他类型的测试方法如基准测试(`Benchmark`) 和示例文档生成 (`Example`) ,这些都可以帮助开发者更好地理解和优化程序行为[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值