3 回答

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限制變量的類型。

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
}

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
- 3 回答
- 0 關注
- 220 瀏覽
添加回答
舉報