Как преобразовать int64 в int в Go?

Какова наилучшая стратегия преобразования int64 в int в Go? Мне сложно сравнить эти два

package main 

import (
    "math"
    "strings"
    "strconv"
)

type largestPrimeFactor struct {
    N      int
    Result int
}

func main() {
    base := largestPrimeFactor{N:13195}
    max := math.Sqrt(float64(base.N))

    maxStr := strconv.FormatFloat(max, 'E', 'G', 64)
    maxShift := strings.Split(maxStr, ".")[0]
    maxInt, err := strconv.ParseInt(maxShift, 10, 64)

    if (err != nil) {
        panic(err)
    }

на этой следующей строке

    for a := 2; a < maxInt; a++ {
        if isPrime(a) {
            if base.N % a == 0 {
                base.Result = a
            }
        }
    }

    println(base)
}

func isPrime(n int) bool {
    flag := false

    max := math.Sqrt(float64(n))

    maxStr := strconv.FormatFloat(max, 'E', 'G', 64)
    maxShift := strings.Split(maxStr, ".")[0]
    maxInt, err := strconv.ParseInt(maxShift, 10, 64)

    if (err != nil) {
        panic(err)
    }

    for a := 2; a < maxInt; a++ {
        if (n % a == 0) {
            flag := true
        }
    }
    return flag
}

person pward    schedule 03.08.2016    source источник


Ответы (1)


Вы конвертируете их с помощью типа "конверсия".

var a int
var b int64
int64(a) < b

При сравнении значений всегда нужно преобразовать меньший тип в больший. Преобразование другим способом, возможно, приведет к усечению значения:

var x int32 = 0
var y int64 = math.MaxInt32 + 1 // y == 2147483648
if x < int32(y) {
// this evaluates to false, because int32(y) is -2147483648

Или в вашем случае, чтобы преобразовать значение maxInt int64 в int, вы можете использовать

for a := 2; a < int(maxInt); a++ {

который не будет выполняться правильно, если maxInt превышает максимальное значение типа int в вашей системе.

person JimB    schedule 03.08.2016
comment
@pward, это то же самое, но если вы всегда конвертируете в больший тип, вам не нужно беспокоиться об усечении. - person JimB; 03.08.2016
comment
спасибо, я думаю, мне нужно немного почитать о числовых типах и, возможно, при необходимости скорректировать свой код. Я думаю, поскольку заранее объявленные числовые типы Go немного отличаются от JavaScript, мне нужно привыкнуть к программированию в этом стиле. - person pward; 03.08.2016
comment
@pward: Javascript использует формат с плавающей запятой двойной точности IEEE-754 для всех чисел. . Для этого у вас есть float64. - person JimB; 03.08.2016
comment
Я имею в виду в основном целочисленный тип JavaScript, так как это тема моего сообщения. - person pward; 03.08.2016
comment
@pward В JavaScript нет целочисленного типа. Существует только один числовой тип данных с именем Number, который является числом с плавающей запятой двойной точности, а не целым числом. - person jussius; 03.08.2016
comment
@pward - это отправная точка для числовых типов, которая может помочь golang.org/ref/spec#Numeric_types < / а> - person Corbin; 04.08.2016
comment
Важно отметить, что, хотя этот ответ проверен, он технически не решает проблему, поставленную вопросом, а именно, как преобразовать int64 в int. - person pward; 04.08.2016
comment
@pward, конечно, вы используете преобразование точно так, как показано в ответе. Я сделаю это более явным, если хотите. - person JimB; 04.08.2016
comment
@JimB Я не говорю, что то, что вы ставите, не работает и непросто для понимания. Я говорю, что он выполняет преобразование в обратном направлении от того, как я хочу это сделать, в моем вопросе. Ваш ответ манипулирует этим желанием, предполагая, что я забочусь об усечении. - person pward; 04.08.2016
comment
@JimB Хм, это интересная теория о проблемах X Y. На мой взгляд, было бы более разумным просто ответить на такой вопрос, как мой, с помощью «Вы не можете этого сделать» или «Эта проблема неразрешима, потому что, по крайней мере, этот ответ не нарушает целостность вопроса». Я говорю, что ваше решение не отвечает на мою проблему, потому что предполагает, что мой желаемый ответ является правильным эффектом, например вы хотите, чтобы код работал. Я действительно ценю, что вы указываете мне в лучшем направлении! - person pward; 07.08.2016