如何在Go中将数组中的字符串转换为整数数组?
["1", "2", "3"]
到
[1, 2, 3]
我在网上搜索了一些解决方案,但没有找到。我尝试循环遍历数组,并使用strconv.ParseFloat(v, 64)对值v进行转换,但它没有起作用。
如何在Go中将数组中的字符串转换为整数数组?
["1", "2", "3"]
到
[1, 2, 3]
我在网上搜索了一些解决方案,但没有找到。我尝试循环遍历数组,并使用strconv.ParseFloat(v, 64)对值v进行转换,但它没有起作用。
您确实需要遍历该切片。如果该切片仅包含整数,则无需使用 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)
}
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]
游乐场:
这是一个古老的问题,但所有答案都忽略了输入长度事先已知这一事实,因此可以通过预先分配目标切片来改善:
package main
import "fmt"
import "strconv"
func main() {
var t = []string{"1", "2", "3"}
var t2 = make([]int, len(t))
for idx, i := range t {
j, err := strconv.Atoi(i)
if err != nil {
panic(err)
}
t2[idx] = j
}
fmt.Println(t2)
}
切片是数组的一部分描述符
它包括:
- 指向数组的指针,
- 片段的长度,以及
- 它的容量(片段的最大长度)
下面将字符串数组/切片转换为整数数组/切片:
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,同时为了让其他人更易读进行了一些改进。
祝你好运
以下是另一个示例,演示如何完成此操作:
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('0')
?因为int()
会将字符转换为对应的ASCII码(此处ascii表)。对于0来说,它的ASCII码是48。因此你需要从你的数字对应的"ascii十进制"中减去48。