我有一个变量,它的值可以是string,也可以是int,这取决于输入。我使用interface{}作为类型。如果输入是"50"、"45"或任何int字符串,如何将该变量的值转换为int。
package main
import "fmt"
import "log"
import "strconv"
func main() {
var limit interface{}
limit = "50"
page := 1
offset := 0
if limit != "ALL" {
log.Println("INSIDE")
offset = limit.(int)*page - limit.(int)
}
fmt.Println(offset)
}上面的代码得到:
interface conversion: interface {} is string, not int如果我使用这个:
package main
import "fmt"
import "log"
import "strconv"
func main() {
var limit interface{}
limit = "50"
page := 1
offset := 0
if limit != "ALL" {
log.Println("INSIDE")
offset = strconv.Atoi(limit)*page - strconv.Atoi(limit)
}
fmt.Println(offset)
}我知道了
exit status 2
command-line-arguments
./main.go:14:24: cannot use limit (type interface {}) as type string in argument to strconv.Atoi: need type assertion
./main.go:14:24: multiple-value strconv.Atoi() in single-value context
./main.go:14:51: cannot use limit (type interface {}) as type string in argument to strconv.Atoi: need type assertion
./main.go:14:51: multiple-value strconv.Atoi() in single-value context如何将变量值转换为整型?
发布于 2018-10-16 15:59:09
在Go中,与Python/JavaScript/Perl等语言不同,变量具有严格的类型和强大的边界。您必须编写显式代码才能将字符串从整数转换为整数。这有助于编写更安全和更高性能的程序。
此外,如果变量存储在interface{}中,则必须使用类型断言(或类型开关)来进一步使用具有特定类型的内容。
这是您的fixed code
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)
}但是,我建议您只对limit变量使用string类型。
发布于 2018-10-16 16:33:37
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
发布于 2018-10-16 23:51:53
正如我理解你的问题,你的limit的值实际上总是字符串,但在一种情况下,它是== 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
}游乐场上的完整解决方案:https://play.golang.org/p/fJv9_cw18R5
https://stackoverflow.com/questions/52828836
复制相似问题