如何在 Go 中将字符串转换为整数类型

Go 是静态类型的语言,如果我们将变量定义为整型,则它只能为整型。我们不能在不转换变量的字符串数据类型的情况下为其分配字符串。Go 有一个名为 strconv 的内置包,它提供了三个函数 Atoi()Sscanf()ParseInt() 将 Go 字符串转换为整型 int

来自 strconv 包的 Atoi() 函数

strconv 包实现了基本数据类型的字符串表示之间的转换。要将字符串转换为整数,我们使用来自 strconv 包的 Atoi() 函数。Atoi 代表 ASCII to integer

package main
import (
    "fmt"
    "strconv"
)
func main() {
    age := "13"
    fmt.Printf("Datatype of age before conversion : %T\n", age)
    fmt.Println("After Conversion:")
    if sv, err := strconv.Atoi(age); err == nil {
        fmt.Printf("%T, %v\n", sv, sv)
    }
}

输出:

Datatype of age before conversion : string
After Conversion:
int, 13

如果输入字符串不是整数格式,则该函数返回零。

package main
import (
    "fmt"
    "strconv"
)
func main() {
    age := "abc"
    fmt.Printf("Datatype of age before conversion : %T\n", age)
    fmt.Println("After Conversion:")
    sv, _ := strconv.Atoi(age)
    fmt.Printf("%T, %v\n", sv, sv)
}

输出:

Datatype of age before conversion : string
After Conversion:
int, 0

来自 strconv 包的 ParseInt() 函数

strconv.ParseInt(s, base, bitSize) 方法以给定的 base (0,2 到 36)和位大小(0 到 64)解释输入字符串 s 并返回一个对应的整数。Atoi(s) 等同于 ParseInt(s, 10, 0)

package main
import (
    "fmt"
    "reflect"
    "strconv"
)
func main() {
    x := "123"
    fmt.Println("Value of x before conversion: ", x)
    fmt.Println("Datatype of x before conversion:", reflect.TypeOf(x))
    intStr, _ := strconv.ParseInt(x, 10, 64)
    fmt.Println("Value after conversion: ", intStr)
    fmt.Println("Datatype after conversion:", reflect.TypeOf(intStr))
}

输出:

Value of x before conversion:  123
Datatype of x before conversion: string
Value after conversion:  123
Datatype after conversion: int64

fmt.Sscanf 方法

fmt.Sscanf() 非常适合解析包含数字的自定义字符串。Sscanf() 函数扫描参数字符串,将连续的以空格分隔的值存储到格式定义的连续参数中,并返回成功解析的项目数。

package main
import (
    "fmt"
)
func main() {
    s := "id:00234"
    var i int
    if _, err := fmt.Sscanf(s, "id:%5d", &i); err == nil {
        fmt.Println(i)
    }
}

输出:

234

方法比较

strconv.ParseInt() 是所有方法中最快的,strconv.Atoi()strconv.ParseInt() 要慢一点,而 fmt.Sscanf() 是除最灵活方法之外最慢的方法。

如何在 Golang 中将字符串解析为 net.Addr

在本文中,我们将了解如何将简单的 Go 字符串解析为 Golang net.Addr 类型。 首先让我们看一下 net.Addr 类型及其外观

type Addr interface {
    Network() string // name of the network (for example, "tcp", "udp")
    String()  // string form of address (for example, "192.0.2.1:25", "[2001:db8::1]:80") 
}

net.Addr 只是一个接口,因此满足此接口的任何类型都是有效的 net.Addr。 有效的例子是

  • net.TCPAddr
  • net.UDPAddr
  • net.IPAddr

它们都实现了 net.Addr 接口,因为它们具有 Network 和 String 方法。 如果大家注意到,所有这些类型都有一个函数来将字符串解析为它们的具体类型。 对于 net.UDPAddr,我们有 net.ResolveUDPAddr,对于 net.TCPAddr,我们有 net.ResolveTCPAddr,对于 net.IPAddr,我们有 net.ResolveIPAddr


如何将字符串解析为 net.TCPAddr

通过使用 ·net.TCPAddr· 标准库中的函数,·net.ResolveTCPAddr· 如下所示

func ResolveTCPAddr(network, address string) *TCPAddr, error

请检查如何在下面的示例中使用 net.ResolveTCPAddr

package main

import (
    "fmt"
    "net"
)

func main() {
    addr, err := net.ResolveTCPAddr("tcp", "1.1.1.1:1234")
    if err != nil {
        panic(err)
    }
    fmt.Println("Addr", addr.String())
}

我们可以使用 Go playground https://go.dev/play/p/ukobauySIbe 试着自己运行代码


如何将字符串解析为 net.UDPAddr

通过使用 net.UDPAddr 标准库中的函数,net.ResolveUDPAddr 如下所示

func ResolveUDPAddr(network, address string) *UDPAddr, error

请检查如何在下面的示例中使用 net.ResolveUDPAddr

package main

import (
    "fmt"
    "net"
)

func main() {
    addr, err := net.ResolveUDPAddr("tcp", "1.1.1.1:53")
    if err != nil {
        panic(err)
    }
    fmt.Println("Addr", addr.String())
}

我们可以使用 Go playground https://go.dev/play/p/d2toJPjtXiN 试着自己运行代码


如何将字符串解析为 net.IPAddr

通过使用 net.IPAddr 标准库中的函数,net.ResolveIPAddr 如下所示

func ResolveIPAddr(network, address string) *IPAddr, error

请检查如何在下面的示例中使用 net.ResolveIPAddr

package main

import (
    "fmt"
    "net"
)

func main() {
    addr, err := net.ResolveIPAddr("ip", "1.1.1.1")
    if err != nil {
        panic(err)
    }
    fmt.Println("Addr", addr.String())
}

我们可以使用 Go playground https://go.dev/play/p/PM-KOzep-ty 试着自己运行代码