golang #学习 #go 基础
Go 是一种强类型语言。 你声明的每个变量都绑定到特定的数据类型,并且只接受与此类型匹配的值。
Go 有四类数据类型:
- 基本类型:数字、字符串和布尔值
- 聚合类型:数组和结构
- 引用类型:指针、切片、映射、函数和通道
- 接口类型:接口
数字
整型
Go 也有基于架构的类型,例如:int
、uint
无符号整型 和 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 的 byte
是 uint8
,是无符号。
int
和 uint
的长度根据系统位数决定,在 64 位数系统中, int
范围等于 int64
,但仍然是两种类型,类型之间无法相互转化。 uint
同理。
也就是说需要强制转换时,你需要进行显式转换。 如果尝试在不同类型之间执行数学运算,将会出现错误。
integer16 + integer32 (mismatched types int16 and int32)
浮点型
在 Java 中的浮点型有 float
和 double
,分别是 32 位 和 64 位,在 java 中,float 的数值必须以f
或 F
结尾,与 double
区分,而 double
的数值可以加d
也可以不加。
Go 中浮点型只有 float32
和 float64
(没有 float),默认是 float64
,分别对应 java 中的float
和 double
。
同时 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")
布尔型
布尔类型仅可能有两个值:true
和 false
。 我们可以使用关键字 bool
声明布尔类型。 Go 与其他编程语言不同。 在 Go 中,不能将布尔类型隐式转换为 0 或 1。 如果要转换,我们必须显式的进行。
var featureFlag bool = true
类型默认值
在 Go 中,所有数据类型都有默认值。因此在使用之前,你无需检查变量是否已初始化。
下面列出了我们目前浏览过类型的几个默认值:
int
类型(及其所有子类型,如int64
):0
float32
和float64
类型:+0.000000e+000
bool
类型:false
string
类型:空值
类型转换
在 GO 中 int
和 int64
之间的操作要进行转化,bool
和 int
也需要进行转化。哪如何进行转化呢?
- 使用 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 提供了 _
这个符号,_
意味着我们不会使用该变量的值,而是要将其忽略。