首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Golang中的接口变量转换

Golang中的接口变量转换
EN

Stack Overflow用户
提问于 2018-10-16 14:03:37
回答 3查看 2.2K关注 0票数 1

我有一个变量,它的值可以是string,也可以是int,这取决于输入。我使用interface{}作为类型。如果输入是"50""45"或任何int字符串,如何将该变量的值转换为int

代码语言:javascript
复制
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)
}

上面的代码得到:

代码语言:javascript
复制
interface conversion: interface {} is string, not int

如果我使用这个:

代码语言:javascript
复制
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)
}

我知道了

代码语言:javascript
复制
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

如何将变量值转换为整型?

EN

回答 3

Stack Overflow用户

发布于 2018-10-16 15:59:09

在Go中,与Python/JavaScript/Perl等语言不同,变量具有严格的类型和强大的边界。您必须编写显式代码才能将字符串从整数转换为整数。这有助于编写更安全和更高性能的程序。

此外,如果变量存储在interface{}中,则必须使用类型断言(或类型开关)来进一步使用具有特定类型的内容。

这是您的fixed code

代码语言:javascript
复制
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类型。

票数 1
EN

Stack Overflow用户

发布于 2018-10-16 16:33:37

strconv包可以用于这种转换

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2018-10-16 23:51:53

正如我理解你的问题,你的limit的值实际上总是字符串,但在一种情况下,它是== ALL,否则它是整数值的字符串表示。

如果我是对的,那么我将提供以下解决方案:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52828836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档