实践:Go语言基础语法和常用特性解析(一) | 青训营

55 阅读5分钟

实践:Go语言基础语法和常用特性解析(一) | 青训营

今天总结一下学习Go语言的基础语法以及常用特性,结合课上给的示例代码加强对Go语言的掌握。

一、变量使用

在进行变量使用之间,要知道Go语言是一门强类型语言,每个变量都有自己的变量类型

1、变量声明和初始化

在Go语言中,可以使用var关键字声明一个变量,并根据需要进行初始化。变量的类型可以是内置类型或自定义类型。

(1)声明一个整型变量x并初始化为0

var x int

(2) 同时声明多个变量,并初始化为默认值

var a, b, c int
var str string
var flag bool

(3) 声明并初始化一个字符串类型的变量

var name string = "John Doe"

(4)使用**:=**运算符进行变量的声明和初始化(仅在函数内部有效)

age := 25

2、常量定义和初始化

Go语言中的常量是在编译时就确定其值,并且在程序执行期间不可改变的标识符。常量可以是内置类型或自定义类型。

(1)定义一个整型常量

const year = 2023

(2)定义一个字符串常量

const greeting string = "Hello, world!"

(3) 定义多个常量

const (
    monday = "Monday"
    tuesday = "Tuesday"
    wednesday = "Wednesday"
)

3、基本数据类型

Go语言提供了一些常用的基本数据类型,包括整型、浮点型、布尔型和字符串。

(1)整型

var num1 int = 10

(2)浮点型

var weight float32 = 60.5 var height float64 = 175.0

(3)布尔型

var isTrue bool = true

(4)字符串

var message string = "Hello, world!"

(5)多行字符串

var multiLineString string = `
    This is a
    multi-line string
`

二、流程控制

1、循环

循环结构允许重复执行一段代码块,直到满足特定条件为止。Go语言提供了多种类型的循环,包括for循环、while循环和do-while循环。

  • for循环:for循环是最常用的循环结构,它可以按照指定的条件重复执行代码块。通常使用for i := 0; i < n; i++的形式来控制循环的次数。
  • while循环:使用for关键字来模拟while循环,只需省略初始语句和递增语句。
  • do-while循环:Go语言中没有内置的do-while循环,但可以使用for循环来实现类似的功能。

2、条件语句

条件语句用于根据不同的条件选择执行不同的代码块。Go语言提供了if-else语句和switch语句来实现条件控制。

  • if-else语句:用于根据条件选择执行不同的代码块。可以使用多个if-else语句来处理多个条件。
  • switch语句:用于在多个选项中选择一个执行代码块。每个case后面的值与表达式进行比较,匹配成功时执行相应的代码块。

3、跳转语句

跳转语句用于在代码中控制程序的执行流程,在特定条件下改变代码的执行顺序。Go语言提供了breakcontinuegoto关键字来实现跳转。

  • break语句:用于在循环或switch语句中终止当前循环或switch语句,并继续执行下一行代码。
  • continue语句:用于跳过当前循环中剩余的代码,并继续下一次循环迭代。
  • goto语句:用于无条件地转到程序中的标签处。尽量少使用goto语句,因为过多的使用会导致程序难以理解和调试。

四、函数

1、函数定义和调用

(1)使用func关键字来定义函数,后面跟着函数名、参数列表、返回值类型和函数体。

func add(a, b int) int {
    return a + b
}

(2)通过函数名加上实参列表来调用函数,并接收函数返回的结果。

result := add(3, 4)
fmt.Println(result)

2、函数参数和返回值处理

(1)函数可以接受零个或多个参数,并且每个参数都有对应的类型。参数可以是基本类型、复合类型或接口类型。

func greet(name string) {
    fmt.Println("Hello,", name)
}

func calculate(a, b int, operator string) int {
    switch operator {
    case "+":
        return a + b
    case "-":
        return a - b
    default:
        fmt.Println("Unsupported operator")
        return 0
    }
}

(2)函数可以返回一个或多个值。可以使用元组(也称为多返回值)的形式返回多个值。

func divide(a, b float64) (float64, error) {
    if b == 0 {
        return 0, errors.New("division by zero")
    }
    quotient := a / b
    return quotient, nil
}

result, err := divide(10, 3)
if err != nil {
    fmt.Println("Error:", err)
} else {
    fmt.Println("Result:", result)
}

五、指针

  • 指针可以在程序中操作数据的内存地址,通过指针,可以直接访问和修改内存中的数据,而无需进行复制或传递。
  • 在 Go 中,使用 & 运算符来获取变量的内存地址。比如说,有一个名为 num 的整数变量,那么 &num 就表示 num 变量的内存地址。
  • 可以使用 * 运算符来声明指针类型,并将指针指向特定的内存地址。比如说,var ptr *int 表示 ptr 是一个指向整数类型的指针。
  • 使用指针可以非常方便地在函数之间共享和修改数据,同时也可以避免大量的数据复制。但是,在使用指针时要小心,确保指针不为空或未初始化,以防止空指针错误。

六、结构体

1、定义

  • 结构体是一种自定义的数据类型,将不同类型的字段组合在一起,形成一个具有多个属性的新类型。
  • 可以看作是一个模板或蓝图,它定义了数据以及操作数据的方法。
  • 相较于Java类,结构体更简洁,内存占用和访问速度更加高效,组合方式更加灵活。

2、定义一个名为 Person 的结构体

type Person struct {
    Name   string
    Age    int
    Gender string
}

3、创建一个结构体变量并初始化

p := Person{
    Name:   "Alice",
    Age:    25,
    Gender: "Female",
}

3、访问结构体字段并进行修改

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

p.Age = 26

fmt.Println("Updated Age:", p.Age)