ZXH的 《Go 语言入门指南:基础语法和常用特性解析-2》|青训营

139 阅读4分钟

Day2:《Go 语言入门指南:基础语法和常用特性解析-2》

1.变量

Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。

声明变量的一般形式是使用 var 关键字:

例如:

var identifier type

也可以一次声明多个变量

var identifier1, identifier2 type

实例:

var a string = "Runoob"

var b, c int = 1, 2

2.变量的声明

第一种,指定变量类型,如果没有初始化,则变量默认为零值

var v_name v_type
v_name = value

第二种,根据值自行判定变量类型。

如下,可以不写类型,直接赋值true,会自动判别d的类型为布尔类型

var d = true

第三种,短变量声明

这种就不需要写var

name := "John"
age := 25

3.个人思考,很奇怪为什么go声明变量的方式中会有var关键字,查阅资料发现解释如下:
在Go语言中,使用关键字var来声明一个变量是为了明确地指定变量的类型,并将其与其他语句区分开来。尽管Go语言具有自动类型推断的功能,它可以根据变量的初始值来推断变量的类型,但显式地使用var关键字可以增加代码的清晰性和可读性。

4.多变量的声明

var vname1, vname2, vname3 type
vname1, vname2, vname3 = v1, v2, v3

var vname1, vname2, vname3 = v1, v2, v3 // 和 python 很像,不需要显示声明类型,自动推断

vname1, vname2, vname3 := v1, v2, v3 // 出现在 := 左侧的变量不应该是已经被声明过的,否则会导致编译错误

5.一般来说,我们声明变量就使用短变量声明就可以了,即 ":=" ,如 “a := 100”,但是需要注意的是,这种方式只能被用在函数体中,如果我们想要声明全局变量。我们就必须用以下的方式:

var GlobalVar int

同时要保证该语句不在函数体内,并且大小写可以控制其他文件的访问。

6.结构体

结构体用于创建自定义的复合数据类型,可以包含多个字段来描述一个实体的属性。结构体提供了一种组织数据的方式,使得代码更加结构化和可读性更高。以下是一个结构体的声明实例:

package main

import "fmt"

// 定义一个结构体
type Person struct {
    Name string
    Age  int
}

然后我们该如何使用结构体呢?直接上代码还是更直观一些:

①创建结构体变量并初始化字段值

②访问结构体字段

③修改结构体字段的值

④再次访问结构体字段

func main() {
    ①
    p := Person{Name: "John", Age: 25}

    ②
    fmt.Println("Name:", p.Name)
    fmt.Println("Age:", p.Age)

    ③
    p.Name = "Jane"
    p.Age = 30

    ④
    fmt.Println("Updated Name:", p.Name)
    fmt.Println("Updated Age:", p.Age)
}

值得一提的是,结构体还可以包含其他结构体类型的字段,从而形成复杂的嵌套结构。你可以使用结构体构建更复杂的数据结构,封装相关的数据和行为,并通过方法来操作结构体。

7.类型转换

在必要以及可行的情况下,一个类型的值可以被转换成另一种类型的值。

注意:Go 语言不存在隐式类型转换,因此所有的转换都必须显式说明。如下:

valueOfTypeB = typeB(valueOfTypeA)

类型 B 的值 = 类型 B(类型 A 的值)

示例:

a := 5.0 b := int(a)

但这只能在定义正确的情况下转换成功,例如从一个取值范围较小的类型转换到一个取值范围较大的类型(例如将 int16 转换为 int32)。当从一个取值范围较大的转换到取值范围较小的类型时(例如将 int32 转换为 int16 或将 float32 转换为 int),会发生精度丢失(截断)的情况。当编译器捕捉到非法的类型转换时会引发编译时错误,否则将引发运行时错误。

8.比较难懂的一个知识点是:具有相同底层类型的变量之间可以相互转换。

代码如下:

var a IZ = 5 
c := int(a) 
d := IZ(c)

针对上述代码的解释:

首先,我们声明了一个变量a,它的类型是IZ,并将其初始化为整数值5。因为IZ是一个接口类型,而int是其底层类型,所以我们可以将整数类型的值赋给a。这是因为实际上接口类型可以包含任何实现了接口方法的具体类型的值。

接下来,我们使用类型断言将接口类型的值转换为int,即c := int(a)。这种转换方式被称为类型断言,表示我们相信接口类型的值实际上是一个int类型的值。如果底层值确实是int类型,那么转换就成功了,并将其赋给变量c。

最后,我们使用类型转换将变量c的值转换回接口类型 IZ,即d := IZ(c)。这里的类型转换表示我们打算将c的值转换为 IZ 类型,以便继续使用该接口类型的方法和特性。如果底层值的类型确实是实现了 IZ 接口的类型,那么转换就成功了,并将其赋给变量d。