为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 中的接口变量转换

Golang 中的接口变量转换

Go
HUX布斯 2023-04-24 16:16:18
我有一个变量,其值可以是 string 或 int 取决于输入。我使用interface{}作为类型。int如果输入类似于"50"、"45"或任何 int 字符串,如何将该变量的值转换为。package mainimport "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 mainimport "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如何将该变量的值转换为 int?
查看完整描述

3 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超2个赞

在 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限制变量的类型。


查看完整回答
反对 回复 2023-04-24
?
慕勒3428872

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

}

查看完整回答
反对 回复 2023-04-24
?
阿波罗的战车

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


查看完整回答
反对 回复 2023-04-24
  • 3 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信