在Go中,数据类型用于对一种特定的数据类型进行分类,确定可以分配给该类型的值以及可以对其执行的操作。编程时,有时需要在类型之间转换值,以便以不同的方式操作值。例如,您可能需要将数字值与字符串连接起来,或在已初始化为整数值的数字中表示小数位。用户生成的数据通常会自动分配为字符串数据类型,即使它由数字组成;为了在此输入中执行数学运算,您必须将字符串转换为数字数据类型。
由于Go是一种静态类型的语言,因此数据类型绑定到变量而不是值。这意味着,如果将变量定义为int,则只能是int;您不能string在不转换变量的数据类型的情况下为其分配。Go中数据类型的静态性质在学习转换它们的方式上更加重要。
本教程将指导您转换数字和字符串,并提供示例以帮助您熟悉不同的用例。
Go有几种数字类型可供选择。首先,它们分为两种常规类型:整数和浮点数。
在许多情况下,您可能需要在数字类型之间进行转换。在不同大小的数字类型之间进行转换可以帮助优化特定种类的系统体系结构的性能。如果您有代码另一部分的整数,并且希望对其进行除法,则可能需要将整数转换为浮点数,以保持运算的精度。此外,使用持续时间通常涉及整数转换。为了解决这些情况,Go具有针对大多数数字类型的内置类型转换。
Go有许多整数数据类型可供选择。什么时候使用另一个通常是关于性能的; 但是,有时您需要从一种整数类型转换为另一种整数类型。例如,Go有时会自动将生成为数字值int,该数字值可能与您的输入值不匹配。如果输入值为int64,int则在转换它们的数据类型以使其匹配之前,将无法在相同的数学表达式中使用。
假设您有个int8,需要将其转换为int32。您可以通过将其包装在int32()类型转换中来做到这一点:
var index int8 = 15
var bigIndex int32
bigIndex = int32(index)
fmt.Println(bigIndex)
结果:
Output
15
该代码块定义index为int8数据类型和bigIndex作为int32数据类型。要存储indexin的值bigIndex,它将数据类型转换为int32。这是通过将int32()转换包装在index变量周围来完成的。
要验证数据类型,可以使用具有以下语法的fmt.Printf语句和%T动词:
fmt.Printf("index data type: %T\n", index)
fmt.Printf("bigIndex data type: %T\n", bigIndex)
结果:
Output
index data type: int8
bigIndex data type: int32
由于此命令使用%T动词,因此print语句输出变量的类型,而不是变量的实际值。这样,您可以确认转换后的数据类型。
您还可以将较大的位整数转换为较小的位整数:
var big int64 = 64
var little int8
little = int8(big)
fmt.Println(little)
结果:
Output
64
请记住,在转换整数时,您可能会超过数据类型和回绕的最大值:
var big int64 = 129
var little = int8(big)
fmt.Println(little)
结果:
Output
-127
当值转换为太小而无法容纳它的数据类型时,就会发生环绕。在前面的示例中,8位数据类型int8没有足够的空间来容纳64位变量big。从较大数量的数据类型转换为较小数量的数据类型时应始终小心,以免意外删除数据。
在Go中将整数转换为浮点数类似于将一种整数类型转换为另一种整数类型。您可以通过包装float64()或float32()围绕要转换的整数来使用内置类型转换:
var x int64 = 57
var y float64 = float64(x)
fmt.Printf("%.2f\n", y)
结果:
Output
57.00
此代码声明x类型的变量,int64并将其值初始化为57。
var x int64 = 57
环绕float64()转换x会将的值转换57为的浮动值57.00。
var y float64 = float64(x)
该%.2f打印动词讲述fmt.Printf两个小数格式化浮动。
您也可以在变量上使用此过程。以下代码声明f等于57,然后打印出新的float:
var f float64 = 57
fmt.Printf("%.2f\n", f)
结果:
Output
57.00
通过使用float32()或float64(),您可以将整数转换为浮点数。接下来,您将学习如何将浮点数转换为整数。
Go可以将浮点数转换为整数,但是程序将失去浮点数的精度。
包装浮动int(),或与体系结构无关的数据类型之一,与使用它将一种整数类型转换为另一种类型时的工作原理相似。您可以在括号内添加浮点数,以将其转换为整数:
var f float64 = 390.8
var i int = int(f)
fmt.Printf("f = %.2f\n", f)
fmt.Printf("i = %d\n", i)
结果:
Output
f = 390.80
i = 390
这种语法会将float转换为390.8整数390,并舍去小数位。
您也可以将其与变量一起使用。以下代码声明b等于125.0和c等于390.8,然后将它们打印为整数。简短的变量声明(:=)缩短了语法:
b := 125.0
c := 390.8
fmt.Println(int(b))
fmt.Println(int(c))
结果:
Output
125
390
当将浮点数转换为具有该int()类型的整数时,Go会截断浮点数的小数和剩余数字以创建一个整数。请注意,即使您可能想将390.8向上舍入为391,Go也不会通过该int()类型执行此操作。相反,它将删除小数点。
在Go中对整数类型进行除法时,结果也将是一个整数类型,其中的系数(或余数)将被丢弃:
a := 5 / 2
fmt.Println(a)
结果:
Output
2
如果除法时任何数字类型都是浮点数,那么所有这些类型将自动声明为浮点数:
a := 5.0 / 2
fmt.Println(a)
结果:
Output
2.5
这将浮点数5.0除以整数2,答案2.5是保留小数精度的浮点数。
在本节中,您已在不同的数字数据类型之间进行转换,包括不同大小的整数和浮点数。接下来,您将学习如何在数字和字符串之间进行转换。
甲串是一个或多个字符(字母,数字或符号)的序列。字符串是计算机程序中数据的一种常见形式,您可能需要经常将字符串转换为数字或将数字转换为字符串,尤其是在接收用户生成的数据时。
您可以使用Go标准库中软件包中的strconv.Itoa方法将数字转换为字符串strconv。如果将数字或变量传递给方法的括号,则该数字值将转换为字符串值。
首先,让我们看一下转换整数。要将整数转换12为字符串值,可以将其传递12给strconv.Itoa方法:
package main
import (
"fmt"
"strconv"
)
func main() {
a := strconv.Itoa(12)
fmt.Printf("%q\n", a)
}
运行此程序时,您将收到以下输出:
Output
"12"
数字12周围的引号表示该数字不再是整数,而是一个字符串值。
您使用了:=赋值运算符来声明名称为的新变量a并分配从strconv.Itoa()函数返回的值。在这种情况下,您将值分配给了12变量。您还在函数中使用了%q动词fmt.Printf,它告诉函数引用提供的字符串。
使用变量,您可以开始了解将整数转换为字符串的实用性。假设您想跟踪用户的日常编程进度,并输入他们一次编写多少行代码。您想向用户显示此反馈,并将同时打印出字符串和整数值:
package main
import (
"fmt"
)
func main() {
user := "Sammy"
lines := 50
fmt.Println("Congratulations, " + user + "! You just wrote " + lines + " lines of code.")
}
运行此代码时,您将收到以下错误:
Output
invalid operation: ("Congratulations, " + user + "! You just wrote ") + lines (mismatched types string and int)
您无法在Go中连接字符串和整数,因此必须将变量转换lines为字符串值:
package main
import (
"fmt"
"strconv"
)
func main() {
user := "Sammy"
lines := 50
fmt.Println("Congratulations, " + user + "! You just wrote " + strconv.Itoa(lines) + " lines of code.")
}
现在,当您运行代码时,您将收到以下输出,祝贺您的用户的进度:
Output
Congratulations, Sammy! You just wrote 50 lines of code.
如果要将浮点数转换为字符串,而不是将整数转换为字符串,请遵循类似的步骤和格式。当您将float传递给fmt.Sprint方法时,会从fmtGo标准库中的包中返回float的字符串值。您可以使用float值本身或变量:
package main
import (
"fmt"
)
func main() {
fmt.Println(fmt.Sprint(421.034))
f := 5524.53
fmt.Println(fmt.Sprint(f))
}
结果:
Output
421.034
5524.53
您可以通过与字符串连接来测试以确保它是正确的:
package main
import (
"fmt"
)
func main() {
f := 5524.53
fmt.Println("Sammy has " + fmt.Sprint(f) + " points.")
}
结果:
Output
Sammy has 5524.53 points.
您可以确定您的浮点数已正确转换为字符串,因为连接已正确执行。
可以使用strconv Go标准库中的包将字符串转换为数字。该strconv软件包具有用于转换整数和浮点数类型的功能。当接受来自用户的输入时,这是非常常见的操作。例如,如果您有一个要求输入人的年龄的程序,则当他们键入响应时,该程序将被捕获为string。然后,您需要将其转换为int,以int对其进行任何数学运算。
如果您的字符串没有小数位,则很可能希望使用strconv.Atoi函数将其转换为整数。如果您知道将数字用作浮点数,则可以使用strconv.ParseFloat。
让我们以用户Sammy跟踪每天编写的代码行为例。您可能希望通过数学操作这些值,以为用户提供更多有趣的反馈,但是这些值当前存储在字符串中:
package main
import (
"fmt"
)
func main() {
lines_yesterday := "50"
lines_today := "108"
lines_more := lines_today - lines_yesterday
fmt.Println(lines_more)
}
结果:
Output
invalid operation: lines_today - lines_yesterday (operator - not defined on string)
因为这两个数字值存储在字符串中,所以会收到错误消息。操作数-的减法不是两个字符串值有效的操作数。
修改代码以包括strconv.Atoi()将字符串转换为整数的方法,这将使您可以使用原始字符串的值进行数学运算。由于将字符串转换为整数时可能会失败,因此必须检查是否有任何错误。您可以使用if语句检查转换是否成功。
package main
import (
"fmt"
"log"
"strconv"
)
func main() {
lines_yesterday := "50"
lines_today := "108"
yesterday, err := strconv.Atoi(lines_yesterday)
if err != nil {
log.Fatal(err)
}
today, err := strconv.Atoi(lines_today)
if err != nil {
log.Fatal(err)
}
lines_more := today - yesterday
fmt.Println(lines_more)
}
因为字符串可能不是数字,所以该strconv.Atoi()方法将返回转换后的类型以及潜在的错误。lines_yesterday使用strconv.Atoi函数进行转换时,必须检查err返回值以确保已转换该值。如果err不是nil,则表示strconv.Atoi无法成功将字符串值转换为整数。在此示例中,您使用了一条if语句来检查错误,如果返回了错误,则log.Fatal可以记录错误并退出程序。
当您运行前面的代码时,您将获得:
Output
58
现在尝试转换不是数字的字符串:
package main
import (
"fmt"
"strconv"
)
func main() {
a := "not a number"
b, err := strconv.Atoi(a)
fmt.Println(b)
fmt.Println(err)
}
您将收到以下错误:
Output
0
strconv.Atoi: parsing "not a number": invalid syntax
由于b已声明,但strconv.Atoi未能进行转换,因此从未将值赋给b。请注意,b其值为0。这是因为Go具有默认值,在Go中称为零值。strconv.Atoi提供了一个错误,描述了为什么它也未能转换字符串。
Go中的字符串存储为一个字节片。在go中,您可以通过在相应的转换包裹它的byte切片和字符串之间进行转换[]byte()和string():
package main
import (
"fmt"
)
func main() {
a := "my string"
b := []byte(a)
c := string(b)
fmt.Println(a)
fmt.Println(b)
fmt.Println(c)
}
在这里,您已经在其中存储了一个字符串值a,然后将其转换为byte切片b,然后将byte切片片转换为as的字符串c。然后a,您在屏幕上打印,b和c:
Output
my string
[109 121 32 115 116 114 105 110 103]
my string
输出的第一行是原始字符串my string。打印出的第二行是组成原始字符串的字节片。第三行显示字节片可以安全地转换回字符串并重新打印出来。
该Go教程演示了如何主要通过内置方法将几种重要的本机数据类型转换为其他数据类型。能够在Go中转换数据类型将使您能够执行诸如接受用户输入以及对不同数字类型进行数学运算之类的事情。稍后,当您使用Go编写接受来自许多不同来源(如数据库和API)的数据的程序时,将使用这些转换方法来确保您可以对数据进行操作。您还可以通过将数据转换为较小的数据类型来优化存储。