Перейти: преобразовать строки в массив в целое число
Как преобразовать строки в массив в целые числа в массиве в 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 из того, что соответствует вашей цифре в "десятичной системе счисления".