猿问

Golang 中的接口变量转换

我有一个变量,其值可以是 string 或 int 取决于输入。我使用interface{}作为类型。int如果输入类似于"50"、"45"或任何 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

如何将该变量的值转换为 int?


HUX布斯
浏览 168回答 3
3回答

一只名叫tom的猫

在 Go 中,与 Python/JavaScript/Perl 等语言相比,变量具有严格的类型和强边界。您必须编写显式代码才能将字符串从整数转换为整数。这有助于编写更安全、性能更高的程序。此外,如果变量存储在 an 中,interface{}则必须使用类型断言(或类型开关)才能进一步使用具有特定类型的内容。这是您的固定代码:package mainimport "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限制变量的类型。

慕勒3428872

据我了解你的问题,你的价值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}

阿波罗的战车

strconv 包可以用于这种转换package mainimport (    "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
随时随地看视频慕课网APP

相关分类

Go
我要回答