如何在Go中转换数据类型

引言

在Go中,数据类型用于对一种特定类型的数据进行分类,确定您可以分配给类型的值和可以对其执行的操作。编程时,有时需要在不同类型之间转换值,以便以不同的方式操作值。例如,你可能需要将数值与字符串连接起来,或者表示初始化为整数值的数字中的小数位。用户生成的数据通常被自动指定为字符串类型,即使它是由数字组成的。为了在输入中执行数学操作,必须将字符串转换为数值数据类型。

由于Go是一种静态类型语言,数据类型绑定到变量而不是值。这意味着,如果你定义一个int类型的变量,它只能是int类型;你不能在不转换变量数据类型的情况下将string赋值给它。Go中数据类型的静态特性使得学习转换它们的方法更加重要。

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

转换数字类型

Go有几种数值类型可供选择。它们主要分为两种一般类型:整数和浮点数

在很多情况下,您可能需要在数值类型之间进行转换。[不同大小的数值类型]之间的转换可以帮助优化特定类型的系统架构的性能。如果你的代码中有一个整数,想对它进行除法运算,可能需要将其转换为浮点数,以保持运算的精度。此外,处理时间长度通常涉及整数转换。为了解决这些情况,Go为大多数数字类型提供了内置的类型转换。

转换整数类型

Go有许多整数数据类型可供选择。何时使用一种类型通常更多地是关于[性能],然而,有时你需要将一种整数类型转换为另一种。例如,Go有时会自动生成int类型的数值,这可能与你的输入值不匹配。如果你的输入值是int64,你将不能在同一个数学表达式中使用intint64数字,直到你将它们的数据类型转换为匹配。

假设你有一个int8,你需要将它转换为int32。你可以通过将其包装在int32()类型转换中来实现:

var index int8 = 15

var bigIndex int32

bigIndex = int32(index)

fmt.Println(bigIndex)
Output15

这段代码将index定义为int8数据类型,将bigIndex定义为int32数据类型。为了将index的值存储在bigIndex中,它将数据类型转换为int32。这是通过index变量周围的int32()转换来实现的。

为了验证你的数据类型,你可以使用fmt.Printf语句和%T动词,语法如下:

fmt.Printf("index data type:    %T\n", index)
fmt.Printf("bigIndex data type: %T\n", bigIndex)
Outputindex data type:    int8
bigIndex data type: int32

因为这里使用了%T动词,所以print语句输出的是变量的类型,而不是变量的实际值。这样,你就可以确认转换后的数据类型。

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

var big int64 = 64

var little int8

little = int8(big)

fmt.Println(little)
Output64

请记住,当转换整数时,你可能会超过数据类型的最大值并进行转换

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)
Output57.00

这段代码声明了一个类型为int64的变量x,并将其值初始化为57

var x int64 = 57

x进行float64()转换后,将57的值转换为57.00的浮点值。

var y float64 = float64(x)

%.2f告诉fmt.Printf用两个小数格式化浮点数。

你也可以在变量上使用这个过程。下面的代码将f声明为57,然后打印出新的浮点数:

var f float64 = 57
fmt.Printf("%.2f\n", f)
Output57.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)
Outputf = 390.80
i = 390

这种语法会将浮点数390.8转换为整数390,去掉小数点。

你也可以将其用于变量。下面的代码声明b等于125.0c等于390.8,然后将它们作为整数打印出来。简短的变量声明(':= ')缩短了语法:

b := 125.0
c := 390.8

fmt.Println(int(b))
fmt.Println(int(c))
Output125
390

当使用int()类型将浮点数转换为整数时,Go将浮点数的小数和剩余的数切掉以创建整数。请注意,即使您可能想要将390.8舍入到391,Go也不会通过int()类型完成此操作。相反,它会去掉小数点。

通过除法转换的数字

在Go中对整数类型进行分割时,结果也将是整数类型,去掉取模或余数:

a := 5 / 2
fmt.Println(a)
Output2

如果除法时任何一个数字类型都是浮点数,那么所有类型都会自动声明为浮点数:

	a := 5.0 / 2
	fmt.Println(a)
Output2.5

这将浮点数5.0除以整数2,结果2.5是一个保留小数精度的浮点数。

在本节中,我们转换了不同的数值数据类型,包括不同长度的整数和浮点数。接下来,我们将学习如何在数字和字符串之间进行转换。

用字符串转换

字符串是一个或多个字符(字母、数字或符号)的序列。字符串是计算机程序中常见的数据形式,你可能经常需要将字符串转换为数字,或者将数字转换为字符串,尤其是在接收用户生成的数据时。

将数字转换为字符串

你可以使用Go标准库中的strconv包中的strconv.Itoa方法将数字转换为字符串。如果向方法的括号中传入数字或变量,该数值将转换为字符串。

首先,让我们看看整数的转换。要将整数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赋给了变量。我们还在fmt.Printf函数中使用了%q动词,它告诉函数引用提供的字符串。

通过变量,你可以开始看到将整数转换为字符串有多么实用。假设你想跟踪用户每天的编程进度,输入他们一次写了多少行代码。你可能希望向用户显示此反馈,并同时打印字符串和整数:

package main

import (
	"fmt"
)

func main() {
	user := "Sammy"
	lines := 50

	fmt.Println("Congratulations, " + user + "! You just wrote " + lines + " lines of code.")
}
Outputinvalid 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.")
}

现在,当你运行代码时,你会收到以下输出,祝贺用户取得了进展:

OutputCongratulations, Sammy! You just wrote 50 lines of code.

如果要将浮点数转换为字符串,而不是将整数转换为字符串,需要遵循类似的步骤和格式。当你将一个浮点数传递给Go标准库中的fmt包中的fmt.Sprint方法时,将返回该浮点数的字符串值。你可以使用浮点值本身,也可以使用变量:

package main

import (
	"fmt"
)

func main() {
	fmt.Println(fmt.Sprint(421.034))

	f := 5524.53
	fmt.Println(fmt.Sprint(f))
}
Output421.034
5524.53

你可以通过连接一个字符串来验证:

package main

import (
	"fmt"
)

func main() {
	f := 5524.53
	fmt.Println("Sammy has " + fmt.Sprint(f) + " points.")
}
OutputSammy has 5524.53 points.

你可以确定你的浮点数被正确地转换为字符串,因为拼接操作没有出错。

将字符串转换为数字

可以使用Go标准库中的strconv包将字符串转换为数字。strconv包中有转换整数和浮点数类型的函数。当接受用户输入时,这是一个非常常见的操作。例如,如果你有一个程序询问一个人的年龄,当他们输入响应时,它会被捕获为一个string。然后你需要将它转换为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)
}
Outputinvalid 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()方法将返回转换后的类型,以及一个潜在的错误。当使用strconv.Atoi函数从lines_yesterday转换时,你必须检查返回值err以确保值被转换。如果err不是nil,这意味着strconv.Atoi无法成功地将字符串值转换为整数。在这个例子中,你使用了if语句来检查错误,如果返回了错误,你使用log.Fatal来记录错误并退出程序。

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

Output58

现在试着转换一个不是数字的字符串:

package main

import (
	"fmt"
	"strconv"
)

func main() {
	a := "not a number"
	b, err := strconv.Atoi(a)
	fmt.Println(b)
	fmt.Println(err)
}
Output0
strconv.Atoi: parsing "not a number": invalid syntax

因为b被声明了,但是strconv.Atoi没有进行转换,所以没有给b赋值。注意b的值是0。这是因为Go有默认值,在Go中称为零值。strconv.Atoi提供了一个错误,描述了为什么它转换字符串失败。

转换字符串和字节

Go中的字符串被存储为字节片。在Go中,你可以将字节切片包装在[]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中,然后将其转换为字节切片b,然后将字节切片转换回字符串c。然后将abc打印到屏幕上:

Outputmy string
[109 121 32 115 116 114 105 110 103
my string

第一行输出是原始字符串my string。输出的第二行是组成原始字符串的字节切片。第三行代码表明,字节切片可以安全地转换为字符串并打印出来。

总结

本Go教程演示了如何将几种重要的原生数据类型转换为其他数据类型,主要是通过内置方法。能够在Go中转换数据类型将允许您执行诸如接受用户输入和跨不同数字类型进行数学运算等操作。稍后,当您使用Go编写从许多不同来源(如数据库和api)接受数据的程序时,您将使用这些转换方法来确保您可以对数据进行操作。你还可以通过将数据转换为更小的数据类型来优化存储。

你可能感兴趣的:(Go,golang,开发语言,后端)