2016-02-02 6 views
4

Я пытаюсь преобразовать строку в uint на 32-разрядную ubuntu, используя следующий код. Но он всегда преобразует его в uint64, несмотря на явное прохождение 32 в качестве аргумента в функции. Ниже в коде mw находится объект библиотеки image magick. Что возвращает uint, когда вызывается mw.getImageWidth() и mw.getImageHeight(). Кроме того, он принимает аргумент типа uint в функции resize.преобразовать строку в uint в go lang

width := strings.Split(imgResize, "x")[0] 
    height := strings.Split(imgResize, "x")[1] 

    var masterWidth uint = mw.GetImageWidth() 
    var masterHeight uint = mw.GetImageHeight() 

    mw := imagick.NewMagickWand() 
    defer mw.Destroy() 

    err = mw.ReadImageBlob(img) 
    if err != nil { 
      log.Fatal(err) 
     } 

    var masterWidth uint = mw.GetImageWidth() 
    var masterHeight uint = mw.GetImageHeight() 

    wd, _ := strconv.ParseUint(width, 10, 32) 
    ht, _ := strconv.ParseUint(height, 10, 32) 

    if masterWidth < wd || masterHeight < ht { 
    err = mw.ResizeImage(wd, ht, imagick.FILTER_BOX, 1) 
    if err != nil { 
     panic(err) 
    } 
    } 

Ошибка:

# command-line-arguments 
test.go:94: invalid operation: masterWidth < wd (mismatched types uint and uint64) 
goImageCode/test.go:94: invalid operation: masterHeight < ht (mismatched types uint and uint64) 
goImageCode/test.go:100: cannot use wd (type uint64) as type uint in argument to mw.ResizeImage 
goImageCode/AmazonAWS.go:100: cannot use ht (type uint64) as type uint in argument to mw.ResizeImage 

ответ

8

Package strconv

func ParseUint

func ParseUint(s string, base int, bitSize int) (n uint64, err error) 

ParseUint, как ParseInt, но и для чисел без знака.

func ParseInt

func ParseInt(s string, base int, bitSize int) (i int64, err error) 

ParseInt интерпретирует строку с в данной базе (2 до 36) и возвращает соответствующее значение я. Если base == 0, основание подразумевается префиксом строки : base 16 для «0x», base 8 для «0» и base 10 в противном случае.

Аргумент bitSize указывает целочисленный тип, в который должен входить результат . Битовые размеры 0, 8, 16, 32 и 64 соответствуют int, int8, int16, int32 и int64.

Ошибки, которые возвращает ParseInt, имеют конкретный тип * NumError и включают err.Num = s. Если s пусто или содержит недопустимые цифры, err.Err = ErrSyntax, а возвращаемое значение равно 0; если значение, соответствующее s, не может быть представлено целым знаком со знаком данного размера, err.Err = ErrRange, а возвращаемое значение является максимальным значением целочисленного значения соответствующего битового размера и знака.

bitSize аргумент определяет тип целого числа, что результат должен вписаться. Размер типа uint - это реализация, 32 или 64 бит. Возвращаемый тип ParseUint всегда uint64. Например,

package main 

import (
    "fmt" 
    "strconv" 
) 

func main() { 
    width := "42" 
    u64, err := strconv.ParseUint(width, 10, 32) 
    if err != nil { 
     fmt.Println(err) 
    } 
    wd := uint(u64) 
    fmt.Println(wd) 
} 

Выход:

42 
+0

чем разница между UINT и uint32 или UINT и uint64? – Naresh

+2

'uint32' - 32 бит,' uint64' - 64 бита, 'uint' - это реализация, 32 или 64 бит. См. [Спецификация языка программирования Go: числовые типы] (https://golang.org/ref/spec#Numeric_types). – peterSO

+0

переменная должна быть u32, err ... not u64 =) – bsbak

Смежные вопросы