亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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條經驗 獲得超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限制變量的類型。


查看完整回答
反對 回復 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 關注
  • 220 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號