3 回答
TA贡献1906条经验 获得超3个赞
在 Go 中,与 Python/JavaScript/Perl 等语言相比,变量具有严格的类型和强边界。您必须编写显式代码才能将字符串从整数转换为整数。这有助于编写更安全、性能更高的程序。
此外,如果变量存储在 an 中,interface{}
则必须使用类型断言(或类型开关)才能进一步使用具有特定类型的内容。
这是您的固定代码:
package main
import "fmt"
import "log"
import "strconv"
func main() {
var limit interface{}
limit = "50"
page := 1
offset := 3
if limit != "ALL" {
// Type assertion
s, isString := limit.(string)
if !isString {
log.Fatalf("limit is not a string but %T", limit)
}
// Conversion from string to int, with error handling
l, err := strconv.Atoi(s)
if err != nil {
log.Fatalf("%s: %v", limit, err)
}
offset = l*page - l
}
fmt.Println(offset)
}
但是,我建议您只使用string限制变量的类型。
TA贡献1848条经验 获得超6个赞
据我了解你的问题,你的价值limit实际上总是字符串,但在一种情况下它是 value == ALL,否则它是整数值的字符串表示。
如果我是对的,那么我会提供以下解决方案:
import (
"errors"
"fmt"
"strconv"
)
func getOffset(limit string, page int64) (int64, error) {
lim, err := strconv.ParseInt(limit, 10, 64)
if err != nil {
if limit == "ALL" {
return 0, nil
}
return 0, errors.New(fmt.Sprintf("string '%v' doesn't fit requirements, error: %v", limit, err))
}
offset := lim*page - lim
return offset, nil
}
TA贡献1862条经验 获得超6个赞
strconv 包可以用于这种转换
package main
import (
"fmt"
"strconv"
)
func main() {
var lim interface{}
lim = "10"
fmt.Printf("Type is: %T\nValue is: %s \n", lim, lim.(string))
i, _ := strconv.Atoi(lim.(string))
fmt.Printf("After conversion value is: %d", i)
}
上述代码的输出:
类型为:字符串,值为:10 转换后值为:10
- 3 回答
- 0 关注
- 167 浏览
添加回答
举报