Go里有哪些基本数据类型?|Let’s GO

Go 做棵大树 1年前 (2023-03-12) 481次浏览 0个评论
文章目录[隐藏]

golang #学习 #go 基础

Go 是一种强类型语言。 你声明的每个变量都绑定到特定的数据类型,并且只接受与此类型匹配的值。

Go 有四类数据类型:

  • 基本类型:数字、字符串和布尔值
  • 聚合类型:数组和结构
  • 引用类型:指针、切片、映射、函数和通道
  • 接口类型:接口

数字

整型

Go 也有基于架构的类型,例如:intuint 无符号整型 和 uintptr

类型 描述 对应 Java
uint 无符号 32 或 64 位 (由计算机位数决定)
uint8/byte 无符号 8 位整型 (0 到 255)
uint16 无符号 16 位整型 (0 到 65535)
uint32 无符号 32 位整型 (0 到 4294967295)
uint64 无符号 64 位整型 (0 到 18446744073709551615)
uintptr 无符号整型,用于存放一个指针
int 有符号 32 或 64 位 (由计算机位数决定)
int8 有符号 8 位整型 (-128 到 127) byte
int16 有符号 16 位整型 (-32768 到 32767) short
int32/rune 有符号 32 位整型 (-2147483648 到 2147483647) int
int64 有符号 64 位整型 (-9223372036854775808 到 9223372036854775807) long

在 go 中,有 int8 也有 byte ,和 java 的 byte 不同的是: go 的 byteuint8 ,是无符号

intuint 的长度根据系统位数决定,在 64 位数系统中, int 范围等于 int64但仍然是两种类型,类型之间无法相互转化。 uint 同理。

也就是说需要强制转换时,你需要进行显式转换。 如果尝试在不同类型之间执行数学运算,将会出现错误。

integer16 + integer32 (mismatched types int16 and int32)

浮点型

在 Java 中的浮点型有 floatdouble ,分别是 32 位 和 64 位,在 java 中,float 的数值必须以fF 结尾,与 double 区分,而 double 的数值可以加d也可以不加。

Go 中浮点型只有 float32float64 (没有 float),默认是 float64 ,分别对应 java 中的floatdouble

同时 Go 中还提供了复数的数据类型,这个在 Java 中是没有的。
Go中的复数数据类型分别是 complex128(64 位实数+64 位虚数)和 complex64 (32 位实数+32 位虚数)

类型 描述 对应 Java
float32 IEEE-754 32 位浮点型数 float
float64 IEEE-754 64 位浮点型数 double
complex64 32 位实数和 32 位虚数
complex128 64 位实数和 64 位虚数
// 复数例子
func main() {

 var a complex64 = 5+5i
 fmt.Printf("Value is: %v", a)  //output: (5+5i)
 fmt.Println("");               //output: (5+5i)

 //内置函数 complex 从指定的实部和虚部构建复数,内置函数 real 和 imag 用来获取复数的实部和虚部:
 var b complex128 = complex(-5, 5) // -5+5i
 fmt.Println(real(b))              // "-5"
 fmt.Println(imag(b))              // "5"
}

字符串

以下字符串摘自: Microsoft Learn

Go 中,关键字 string 用于表示字符串数据类型。 若要初始化字符串变量,你需要在双引号(")中定义值。 单引号(')用于单个字符(以及 runes,正如我们在上一节所述)。

例如,下面的代码演示了声明和初始化字符串变量的两种方法:

var firstName string = "John"
lastName := "Doe"
fmt.Println(firstName, lastName)

有时,你需要对字符进行转义。 为此,在 Go 中,请在字符之前使用反斜杠 (\)。 例如,下面是使用转义字符的最常见示例:

  • \n:新行
  • \r:回车符
  • \t:制表符
  • \':单引号
  • \":双引号
  • \\:反斜杠

使用以下代码片段来测试转义字符:

fullName := "John Doe \t(alias \"Foo\")\n"
fmt.Println(fullName)

你应会看到以下输出(包括新行):

John Doe        (alias "Foo")

布尔型

布尔类型仅可能有两个值:truefalse。 我们可以使用关键字 bool 声明布尔类型。 Go 与其他编程语言不同。 在 Go 中,不能将布尔类型隐式转换为 0 或 1。 如果要转换,我们必须显式的进行。

var featureFlag bool = true

类型默认值

在 Go 中,所有数据类型都有默认值。因此在使用之前,你无需检查变量是否已初始化。

下面列出了我们目前浏览过类型的几个默认值:

  • int 类型(及其所有子类型,如 int64): 0
  • float32float64 类型: +0.000000e+000
  • bool 类型: false
  • string 类型:空值

类型转换

在 GO 中 intint64 之间的操作要进行转化,boolint 也需要进行转化。哪如何进行转化呢?

  1. 使用 Go 的一些本机方法。 例如,一种方法是对每个类型使用内置函数,如下所示:
 var int32Var int32 = 666;
 var int64Var int64 = 666;
 var intVar int = 666;

 fmt.Println(int32Var, int64Var, intVar);        // 666 666 666
 fmt.Println(int32Var == int32(int64Var));       // true
 fmt.Println(intVar == int(int64Var));           // true

我们看到它们之间进行了显式转化,如果不进行会怎么样?

invalid operation: int32Var == int64Var (mismatched types int32 and int64)compiler[MismatchedTypes](https://pkg.go.dev/golang.org/x/tools/internal/typesinternal#MismatchedTypes)

Go 的另一种转换方法是使用 strconv 包。 例如,若要将 string 转换为 int,可以使用以下代码,反之亦然.

package main

import (
    "fmt"
    "strconv"
)

func main() {
 var strVal = "666";
 var intFromStr = strconv.Atoi(strVal);
 fmt.Println(strVal, intFromStr);)
}

当我执行如上代码时,会报错:

multiple-value strconv.Atoi(strVal) (value of type (int, error)) in single-value context

这是因为,我们 go 中 的函数允许多个返回值,我们需要用多个变量来接收存储,又有点类似于 python 的语法了。

package main

import (
    "fmt"
    "strconv"
)

func main() {
 var strVal = "666";
 var intFromStr,_ = strconv.Atoi(strVal);
 fmt.Println(strVal, intFromStr);)
}

我们修改下代码在前面的代码中,有一个下划线 (_) 用作变量的名称。
在 Go 中,因为我们需要使用声明的所有变量,然而有时候我们需要忽略一部分方法的返回值,所以 Go 提供了 _ 这个符号,_意味着我们不会使用该变量的值,而是要将其忽略。


做棵大树 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Go 里有哪些基本数据类型?|Let’s GO
喜欢 (0)
[欢迎投币]
分享 (0)
关于作者:
一个整天无所事事的,有时候忽然热血的孩子
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址