如何在 Go 中转换数据类型

介绍

在 Go 中,数据类型用于对某一类数据进行分类,确定您可以给该类型分配的值以及您可以在其中执行的操作. 在编程时,有时需要转换类型之间的值,以便以不同的方式来操纵值. 例如,您可能需要将数字值与字符串结合,或者在数字中以整数来表示小数位。 用户生成的数据往往被自动指定为字符串数据类型,即使它由数字组成;为了在这个输入中进行数学操作,需要将字符串转换为数字数据类型.

由于 Go 是一个静态键入的语言,所以 数据类型与变量有关而不是值,这意味着如果您将变量定义为 int,它只能是 int;您不能将一个 `string' 分配给它而不转换变量的数据类型。 Go 中的数据类型的静态性在学习如何转换它们方面更重要。

本教程将指导您转换数字和字符串,并提供示例,以帮助您熟悉不同的用例。

转换数字类型

Go 有几种数字类型可供选择. 主要分为两种一般类型: integers和 [floating-point numbers](https://andsky.com/tech/tutorials/understanding-data-types-in-go floating-point-numbers).

在很多情况下,您可能想要在数字类型之间转换。 在不同大小的数字类型之间转换,可以帮助优化特定类型的系统架构的性能. 如果您从代码的另一部分得到一个整数,并且想要对它进行分割,您可能想要将整数转换为浮点来保持操作的精度. 此外,与时间相配合的工作通常涉及整数转换. 为了处理这些情况,Go对大多数数字类型有内置_类型转换_.

整数类型之间的转换

Go有很多整数数据类型可以选择. 当使用一个而不是另一个时,通常更涉及性能;但是,有时你需要从一个整数类型转换到另一个类型。 譬如说. Go 有时会自动生成 int 的数值, 它可能与您的输入值不符 。 如果输入值为int64',则在同一数学表达式中使用int'和`int64'数字,直到你转换出它们的数据类型相匹配.

假设您有 int8,您需要将其转换为 int32. 您可以通过将其包装到 int32() 类型的转换中来做到这一点:

1var index int8 = 15
2
3var bigIndex int32
4
5bigIndex = int32(index)
6
7fmt.Println(bigIndex)
1[secondary_label Output]
215

此代码块将index定义为int8数据类型和bigIndex定义为int32数据类型. 为了存储在bigIndex中的index值,它将数据类型转换为int32

要验证您的数据类型,您可以使用 fmt.Printf 语句和 %T 语法,使用以下语法:

1fmt.Printf("index data type:    %T\n", index)
2fmt.Printf("bigIndex data type: %T\n", bigIndex)
1[secondary_label Output]
2index data type:    int8
3bigIndex data type: int32

由于此使用%T语法,因此打印语句输出变量的类型,而不是变量的实际值。

您还可以将较大的比特大小的整数转换为较小的比特大小的整数:

1var big int64 = 64
2
3var little int8
4
5little = int8(big)
6
7fmt.Println(little)
1[secondary_label Output]
264

请记住,当转换整数时,您可能会超过数据类型的最大值和 wraparound:

1var big int64 = 129
2var little = int8(big)
3fmt.Println(little)
1[secondary_label Output]
2-127

在上一个示例中,8位数据类型int8没有足够的空间来容纳64位变量

将整数转换为浮动

在 Go 中将整数转换为浮点类似于将一个整数类型转换为另一个。您可以使用内置的类型转换,将 float64() 或 `float32()' 围绕您正在转换的整数:

1var x int64 = 57
2
3var y float64 = float64(x)
4
5fmt.Printf("%.2f\n", y)
1[secondary_label Output]
257.00

此代码声明一种类型的x变量为int64,并将其值初始化为57

1var x int64 = 57

float64()转换围绕x57的值转换为57.00的浮动值。

1var y float64 = float64(x)

%.2f打印口号告诉fmt.Printf用两个十字符格式化浮动。

您也可以在变量上使用此过程:下面的代码声明f等于57,然后打印出新的浮动:

1var f float64 = 57
2fmt.Printf("%.2f\n", f)
1[secondary_label Output]
257.00

通过使用)`,您可以将整数转换为浮动,然后您将学习如何将浮动转换为整数。

将浮动转换为整合器

Go 可以将浮点转换为整数,但程序会失去浮点的精度。

Wrapping floats in int(),或其架构独立的数据类型之一,与您使用它来将一个整数类型转换为另一个类型相似。

1var f float64 = 390.8
2var i int = int(f)
3
4fmt.Printf("f = %.2f\n", f)
5fmt.Printf("i = %d\n", i)
1[secondary_label Output]
2f = 390.80
3i = 390

这种语法将浮点390.8转换为整数390,放下十位数。

以下代码声明b等于125.0c等于390.8,然后将其打印成整数。

1b := 125.0
2c := 390.8
3
4fmt.Println(int(b))
5fmt.Println(int(c))
1[secondary_label Output]
2125
3390

当使用)`类型这样做。

通过分割转换的数字

在 Go 中分割整数类型时,结果也将是一个整数类型,其中的 modulus 或剩余值下降:

1a := 5 / 2
2fmt.Println(a)
1[secondary_label Output]
22

如果在分割时,任何一个数字类型都是浮动,那么所有类型将自动宣布为浮动:

1a := 5.0 / 2
2    fmt.Println(a)
1[secondary_label Output]
22.5

这将浮点5.0与整数2分开,而答案2.5是一个浮点,保留了十分数精度。

在本节中,您已在不同的数字数据类型之间进行转换,包括不同的整数大小和浮点数。

使用 Strings 转换

一个 string 是由一个或多个字符(字母、数字或符号)组成的序列。字符串是计算机程序中常见的数据形式,您可能需要相当频繁地将字符串转换为数字或数字转换为字符串,特别是当您使用用户生成的数据时。

将数字转换为字符串

您可以将数字转换为字符串,使用 Go 标准库中的 strconv.Itoa 套件中的 strconv.Itoa 方法. 如果您将一个数字或变量传入该方法的序列中,该数值将被转换为字符串值。

首先,让我们来看看整数的转换:要将整数 12 转换为字符串值,您可以将 12 转换为 `strconv.Itoa' 方法:

 1package main
 2
 3import (
 4    "fmt"
 5    "strconv"
 6)
 7
 8func main() {
 9    a := strconv.Itoa(12)
10    fmt.Printf("%q\n", a)
11}

运行此程序时,您将收到以下输出:

1[secondary_label Output]
2"12"

数字12周围的引用意味着数字不再是整数,而是现在是一个字符串值。

您使用 := 分配运算器来声明一个新的变量名为 a,并分配从 strconv.Itoa() 函数返回的值. 在这种情况下,您将值 `12' 分配给您的变量。

使用变量,您可以开始看到将整数转换为字符串是多么实用。 假设您想要跟踪用户的日常编程进度,并且正在输入他们同时写的代码的行数。

 1package main
 2
 3import (
 4    "fmt"
 5)
 6
 7func main() {
 8    user := "Sammy"
 9    lines := 50
10
11    fmt.Println("Congratulations, " + user + "! You just wrote " + lines + " lines of code.")
12}

当您运行此代码时,您将收到以下错误:

1[secondary_label Output]
2invalid operation: ("Congratulations, " + user + "! You just wrote ") + lines (mismatched types string and int)

您无法在 Go 中连接字符串和整数,因此您必须将变量转换为字符串值:

 1package main
 2
 3import (
 4    "fmt"
 5    "strconv"
 6)
 7
 8func main() {
 9    user := "Sammy"
10    lines := 50
11
12    fmt.Println("Congratulations, " + user + "! You just wrote " + strconv.Itoa(lines) + " lines of code.")
13}

现在,当您运行代码时,您将收到以下输出,祝贺您的用户的进展:

1[secondary_label Output]
2Congratulations, Sammy! You just wrote 50 lines of code.

如果你想将一个 float 转换为一个字符串而不是整数转换为一个字符串,你会按照类似的步骤和格式进行转换。当你将一个 float 转换到 fmt.Sprint 方法时,从 Go 标准库中的 fmt' 包中,将返回一个字符串值。

 1package main
 2
 3import (
 4    "fmt"
 5)
 6
 7func main() {
 8    fmt.Println(fmt.Sprint(421.034))
 9
10    f := 5524.53
11    fmt.Println(fmt.Sprint(f))
12}
1[secondary_label Output]
2421.034
35524.53

您可以通过连接一个字符串来测试以确保它是正确的:

 1package main
 2
 3import (
 4    "fmt"
 5)
 6
 7func main() {
 8    f := 5524.53
 9    fmt.Println("Sammy has " + fmt.Sprint(f) + " points.")
10}
1[secondary_label Output]
2Sammy has 5524.53 points.

你可以肯定你的浮动被正确地转换成一个字符串,因为连接是没有错误的。

将字符串转换为数字

可以使用 Go 标准库中的 strconv 包将字符串转换为数字。 strconv 包具有转换整数和浮数类型的功能。 这是接受用户的输入时非常常见的操作。 例如,如果您有一个程序要求一个人的年龄,当他们输入答案时,它会被捕获为 string。 然后您需要将其转换为 int 以便使用它进行任何数学。

如果你的字符串没有十进制的位置,你很可能想要通过使用strconv.Atoi函数将其转换为整数. 如果你知道你将使用这个数字作为一个浮动,你会使用strconv.ParseFloat

让我们用用户Sammy的例子来跟踪每天写的代码行,您可能希望用数学来操纵这些值,为用户提供更有趣的反馈,但这些值目前存储在字符串中:

 1package main
 2
 3import (
 4    "fmt"
 5)
 6
 7func main() {
 8    lines_yesterday := "50"
 9    lines_today := "108"
10
11    lines_more := lines_today - lines_yesterday
12
13    fmt.Println(lines_more)
14}
1[secondary_label Output]
2invalid operation: lines_today - lines_yesterday (operator - not defined on string)

由于两个数字值存储在字符串中,您收到一个错误: 减数的操作符 - 不是两个字符串值的有效操作符。

修改代码以包括将字符串转换为整数的 strconv.Atoi() 方法,这将允许您使用原来字符串的值进行数学。 由于在将字符串转换为整数时有可能失败,您必须检查是否存在任何错误。 您可以使用一个 `if' 语句来检查您的转换是否成功。

 1package main
 2
 3import (
 4    "fmt"
 5    "log"
 6    "strconv"
 7)
 8
 9func main() {
10    lines_yesterday := "50"
11    lines_today := "108"
12
13    yesterday, err := strconv.Atoi(lines_yesterday)
14    if err != nil {
15    	log.Fatal(err)
16    }
17
18    today, err := strconv.Atoi(lines_today)
19    if err != nil {
20    	log.Fatal(err)
21    }
22    lines_more := today - yesterday
23
24    fmt.Println(lines_more)
25}

因为一个字符串有可能不是数字,即"字符串". Atoi()' 方法既会返回已转换的类型,也会返回潜在的错误。 在从行'到行'转换时,用弦'转换。 Atoi ' 函数,您必须检查 " err " 返回值,以确保该值被转换。 如果err'不是nil',就意味着stronv'。 Atoi 无法成功将字符串值转换为整数 。 在此示例中,您使用 如果 语句检查错误, 如果返回错误, 您使用 log ` 。 fatal 登录错误并退出程序.

当你运行上一个代码时,你会得到:

1[secondary_label Output]
258

现在尝试转换不是数字的字符串:

 1package main
 2
 3import (
 4    "fmt"
 5    "strconv"
 6)
 7
 8func main() {
 9    a := "not a number"
10    b, err := strconv.Atoi(a)
11    fmt.Println(b)
12    fmt.Println(err)
13}

你会收到以下错误:

1[secondary_label Output]
20
3strconv.Atoi: parsing "not a number": invalid syntax

由于b被声明,但strconv.Atoi未能进行转换,因此从未分配到b的值. 请注意,b具有0的值. 这是因为 Go 有默认值,在 Go 中称为零值。

转换字符串和字节

在 Go 中,您可以将字节和字符串之间转换为对应的转换 []byte()string():

 1package main
 2
 3import (
 4    "fmt"
 5)
 6
 7func main() {
 8    a := "my string"
 9
10    b := []byte(a)
11
12    c := string(b)
13
14    fmt.Println(a)
15
16    fmt.Println(b)
17
18    fmt.Println(c)
19}

在这里,您将字符串值存储在a,然后将其转换为一个字节片段b,然后将字节片段转换回为一个字符串的c

1[secondary_label Output]
2my string
3[109 121 32 115 116 114 105 110 103]
4my string

第一个输出行是原始字符串我的字符串。第二个字符串是构成原始字符串的字符串,第三个字符串显示字符串可以安全地转换成字符串,然后再打印出来。

结论

这个 Go教程演示了主要通过内置方法将几种重要的本土数据类型转换为其他数据类型的方法. 能够转换 Go 中的数据类型,将允许您进行诸如接受用户输入和跨不同数字类型进行数学等工作. 稍后,当您使用 Go 来写入接受来自数据库和API等许多不同来源的数据的程序时,您会使用这些转换方法来确保您能够对您的数据采取行动. 您还可以通过转换数据到更小的数据类型来优化存储.

如果您想对 Go 中的数据类型进行更深入的分析,请参阅我们的文章(https://andsky.com/tech/tutorials/understanding-data-types-in-go)。

Published At
Categories with 技术
Tagged with
comments powered by Disqus