Перейти: преобразовать строки в массив в целое число

Как преобразовать строки в массив в целые числа в массиве в go?

["1", "2", "3"]

to

[1, 2, 3]

Я искал некоторые решения в Интернете, но не смог найти его. Я попытался пройти через массив и сделал strconv.ParseFloat(v, 64), где v - значение, но оно не сработало.

Ответ 1

Вам нужно будет пройти через срез. Если срез содержит только целые числа, не требуется ParseFloat, Atoi.

import "fmt"
import "strconv"

func main() {
    var t = []string{"1", "2", "3"}
    var t2 = []int{}

    for _, i := range t {
        j, err := strconv.Atoi(i)
        if err != nil {
            panic(err)
        }
        t2 = append(t2, j)
    }
    fmt.Println(t2)
}

На Игровая площадка.

Ответ 2

Например,

package main

import (
    "fmt"
    "strconv"
)

func sliceAtoi(sa []string) ([]int, error) {
    si := make([]int, 0, len(sa))
    for _, a := range sa {
        i, err := strconv.Atoi(a)
        if err != nil {
            return si, err
        }
        si = append(si, i)
    }
    return si, nil
}

func main() {
    sa := []string{"1", "2", "3"}
    si, err := sliceAtoi(sa)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Printf("%q %v\n", sa, si)
}

Вывод:

["1" "2" "3"] [1 2 3]

Экспозиция:

http://play.golang.org/p/QwNO8R_f90

Ответ 3

Срез - дескриптор сегмента массива
Он состоит из - указатель на массив,
- длина сегмента и
- его емкость (максимальная длина сегмента)

Ниже строка Array/Slice преобразуется в int Array/Slice:

package main

import (
    "fmt"
    "log"
    "strconv"
    "strings"
)

func Slice_Atoi(strArr []string) ([]int, error) {
    // NOTE:  Read Arr as Slice as you like
    var str string                           // O
    var i int                                // O
    var err error                            // O

    iArr := make([]int, 0, len(strArr))
    for _, str = range strArr {
        i, err = strconv.Atoi(str)
        if err != nil {
            return nil, err                  // O
        }
        iArr = append(iArr, i)
    }
    return iArr, nil
}

func main() {
    strArr := []string{
        "0 0 24 3 15",
        "0 0 2 5 1 5 11 13",
    }

    for i := 0; i < len(strArr); i++ {
        iArr, err := Slice_Atoi(strings.Split(strArr[i], " "))
        if err != nil {
            log.Print("Slice_Atoi failed: ", err)
            return
        }
        fmt.Println(iArr)
    }
}

Выход:

[0 0 24 3 15]
[0 0 2 5 1 5 11 13]

Я использовал в проекте, поэтому небольшая оптимизация из других ответов, отмеченная как //O для выше, также фиксировала бит в удобочитаемости для других

Желаем удачи

Ответ 4

Вот еще один пример, как это сделать:

var t = []string{"1", "2", "3"}
str := strings.Join(t, "")
if _, err := strconv.Atoi(str); err != nil {
    // do stuff, in case str can not be converted to an int
}
var slice []int // empty slice
for _, digit := range str {
    slice = append(slice, int(digit)-int('0')) // build up slice
}

Мне это нравится, потому что вы должны проверить только один раз, может ли каждая цифра внутри t быть преобразована в int. Это более эффективно? Я не знаю.

Зачем вам нужен int('0')? Потому что int() преобразует символ в соответствующий код ASCII (здесь таблица ascii). Для 0 это будет 48. Таким образом, вам придется вычесть 48 из того, что соответствует вашей цифре в "десятичной системе счисления".