이동에서 문자열을 정수 형식으로 변환하시겠습니까?
반환된 문자열을 변환하려고 합니다.flag.Arg(n)
에 대해서int
바둑에서 이것을 하는 관용적인 방법은 무엇입니까?
예를 들어,
코드:
package main
import (
"fmt"
"strconv"
)
func main() {
s := "123"
// string to int
i, err := strconv.Atoi(s)
if err != nil {
// ... handle error
panic(err)
}
fmt.Println(s, i)
}
단순 문자열 변환
가장 쉬운 방법은 기능을 사용하는 것입니다.
그 밖에도 여러 가지 방법이 있습니다.예를 들어 베이스와 비트사이즈를 지정할 수 있기 때문에 유연성이 향상됩니다.또, 다음의 문서에도 기재되어 있습니다.strconv.Atoi()
:
Atoi는 ParseInt(s, 10, 0)와 동등하며 타입 int로 변환됩니다.
다음은 언급한 기능을 사용하는 예입니다(Go Playground에서 사용해 보십시오).
flag.Parse()
s := flag.Arg(0)
if i, err := strconv.Atoi(s); err == nil {
fmt.Printf("i=%d, type: %T\n", i, i)
}
if i, err := strconv.ParseInt(s, 10, 64); err == nil {
fmt.Printf("i=%d, type: %T\n", i, i)
}
var i int
if _, err := fmt.Sscan(s, &i); err == nil {
fmt.Printf("i=%d, type: %T\n", i, i)
}
출력(인수를 사용하여 호출된 경우)"123"
):
i=123, type: int
i=123, type: int64
i=123, type: int
커스텀 문자열 해석
또한 입력에 추가 문자와 함께 숫자 형식(폭, 베이스 등)을 지정할 수 있어 유연성이 더욱 높아집니다.string
.
이것은 번호를 유지하는 커스텀스트링을 해석하는 경우에 편리합니다.예를 들어 입력이 다음 형식으로 제공되는 경우"id:00123"
프레픽스가 있는 경우"id:"
숫자는 고정 5자리입니다.짧을 경우 0으로 채워집니다.이것은 다음과 같이 쉽게 해석할 수 있습니다.
s := "id:00123"
var i int
if _, err := fmt.Sscanf(s, "id:%5d", &i); err == nil {
fmt.Println(i) // Outputs 123
}
다음으로 스트링을 정수로 해석하는 방법(가장 빠른 런타임부터 가장 느린 런타임까지)을 나타냅니다.
strconv.ParseInt(...)
가장 빠른strconv.Atoi(...)
아직 매우 빠르다fmt.Sscanf(...)
너무 빠르지는 않지만 가장 유연한
다음은 각 기능의 사용 현황과 타이밍 예를 보여 주는 벤치마크입니다.
package main
import "fmt"
import "strconv"
import "testing"
var num = 123456
var numstr = "123456"
func BenchmarkStrconvParseInt(b *testing.B) {
num64 := int64(num)
for i := 0; i < b.N; i++ {
x, err := strconv.ParseInt(numstr, 10, 64)
if x != num64 || err != nil {
b.Error(err)
}
}
}
func BenchmarkAtoi(b *testing.B) {
for i := 0; i < b.N; i++ {
x, err := strconv.Atoi(numstr)
if x != num || err != nil {
b.Error(err)
}
}
}
func BenchmarkFmtSscan(b *testing.B) {
for i := 0; i < b.N; i++ {
var x int
n, err := fmt.Sscanf(numstr, "%d", &x)
if n != 1 || x != num || err != nil {
b.Error(err)
}
}
}
다음 이름으로 저장하여 실행할 수 있습니다.atoi_test.go
및 실행 중go test -bench=. atoi_test.go
.
goos: darwin
goarch: amd64
BenchmarkStrconvParseInt-8 100000000 17.1 ns/op
BenchmarkAtoi-8 100000000 19.4 ns/op
BenchmarkFmtSscan-8 2000000 693 ns/op
PASS
ok command-line-arguments 5.797s
이거 드셔보세요
import ("strconv")
value := "123"
number,err := strconv.ParseUint(value, 10, 32)
finalIntNum := int(number) //Convert uint64 To int
입력 데이터를 제어하면 미니 버전을 사용할 수 있습니다.
package main
import (
"testing"
"strconv"
)
func Atoi (s string) int {
var (
n uint64
i int
v byte
)
for ; i < len(s); i++ {
d := s[i]
if '0' <= d && d <= '9' {
v = d - '0'
} else if 'a' <= d && d <= 'z' {
v = d - 'a' + 10
} else if 'A' <= d && d <= 'Z' {
v = d - 'A' + 10
} else {
n = 0; break
}
n *= uint64(10)
n += uint64(v)
}
return int(n)
}
func BenchmarkAtoi(b *testing.B) {
for i := 0; i < b.N; i++ {
in := Atoi("9999")
_ = in
}
}
func BenchmarkStrconvAtoi(b *testing.B) {
for i := 0; i < b.N; i++ {
in, _ := strconv.Atoi("9999")
_ = in
}
}
가장 빠른 옵션(필요한 경우 수표를 작성)결과:
Path>go test -bench=. atoi_test.go
goos: windows
goarch: amd64
BenchmarkAtoi-2 100000000 14.6 ns/op
BenchmarkStrconvAtoi-2 30000000 51.2 ns/op
PASS
ok path 3.293s
언급URL : https://stackoverflow.com/questions/4278430/convert-string-to-integer-type-in-go
'programing' 카테고리의 다른 글
셸 프로그래밍에서 $(command)와 command의 차이점은 무엇입니까? (0) | 2023.04.22 |
---|---|
WPF의 Static Resource와 Dynamic Resource의 차이점은 무엇입니까? (0) | 2023.04.22 |
WPF DataBinding: Nullable Int에서도 검증 오류가 발생합니까? (0) | 2023.04.22 |
Xcode 8은 프로비저닝 프로파일에 서명 인증서가 포함되어 있지 않다는 오류를 나타냅니다. (0) | 2023.04.22 |
SQL과 빈 문자열의 병합 (0) | 2023.04.22 |