Go 语言入门指南2 | 豆包MarsCode AI刷题

24 阅读5分钟

不知不觉也是来到了青训营的尾声,因为本人不是专门学习 Go 语言的,所以对于 go 的基础语法还是不太娴熟,希望自己在最后的阶段记录一下,然后提高一下自己对 go 语言的理解吧

一、变量声明

  1. 基本声明方式

  • 在 Go 语言中,可以使用 var 关键字声明变量。例如:var a int,这里声明了一个名为 a 的整数变量。变量在声明后会被自动初始化为其类型的零值,对于 int 类型,零值是 0。

  • 也可以在声明变量时进行初始化,如 var b int = 10,明确地将变量 b 初始化为 10。

  1. 短变量声明

  • Go 语言还支持短变量声明,使用:= 操作符。例如:c := 20,这会自动推断变量 c 的类型为 int,并且初始化为 20。这种方式只能在函数内部使用。

  1. 数据类型

  2. 基本数据类型

  • 整数类型:包括 int(有符号整数,其大小根据操作系统平台可能是 32 位或 64 位)、int8(8 位有符号整数,范围是 -128 到 127)、int16、int32、int64,还有无符号整数类型 uint(同样大小根据平台,范围从 0 开始)、uint8(范围是 0 - 255)、uint16、uint32、uint64。

  • 浮点类型:float32 和 float64。例如 var f float32 = 3.14。

  • 布尔类型:bool,只有 true 和 false 两个值,用于表示逻辑判断的结果。

  • 字符类型:rune(本质上是 int32 的别名)用于表示单个字符,例如 var ch rune = 'A'。

  1. 复合数据类型

  • 数组:具有固定长度,并且元素类型相同。例如 var arr [5] int 声明了一个包含 5 个整数元素的数组。可以通过索引访问数组元素,如 arr [0] = 1。
  • 切片(Slice):是一种动态大小的序列,可以理解为对数组的引用。例如 var slice [] int = arr [1:3],这里 slice 引用了 arr 数组从索引 1(包含)到索引 3(不包含)的元素。
  • 映射(Map):也称为字典,是一种无序的键 - 值对集合。例如 var m map [string] int,声明一个键为 string 类型,值为 int 类型的映射。可以通过 m ["key"] = 10 的方式添加或修改键值对。
  1. 变量声明

    • Go 语言

      • 支持多种变量声明方式。可以使用var关键字声明变量,如var a int,变量会被初始化为类型的零值。也可以在声明时初始化,如var b int = 10。此外,在函数内部还能使用短变量声明:=,例如c := 20,编译器会自动推断类型。

      • 例如:

收起

go

复制

func main() {
    var x int
    y := 10
}
  • Java 语言

    • 变量声明需要指定类型,并且在使用前必须先声明。例如int a;,如果要初始化,可以在声明时进行,如int b = 10;。Java 10 之后引入了var关键字,但它只是一种语法糖,编译器仍然会检查变量的类型,而且var的使用场景相对有限,例如var c = 20;,编译器会根据赋值推断cint类型。

    • 例如:

收起

java

复制

public class Main {
    public static void main(String[] args) {
        int x;
        int y = 10;
        var z = 20;
    }
}
  1. 函数声明与方法定义

    • Go 语言

      • 函数是独立的实体,通过func关键字声明,例如func add(a, b int) int { return a + b },函数可以有多个返回值。函数可以在任何包内定义,只要符合访问控制规则。

      • 例如:

收起

go

复制

package main
import "fmt"
func main() {
    result, _ := divide(10, 2)
    fmt.Println(result)
}
func divide(a, b int) (int, error) {
    if b == 0 {
        return 0, fmt.Errorf("division by zero")
    }
    return a / b, nil
}
  • Java 语言

    • 方法是与类相关联的,在类内部定义。方法的定义包括访问修饰符(如publicprivate等)、返回类型、方法名和参数列表。例如public int add(int a, int b) { return a + b; }。Java 中的方法通常是面向对象编程中的一个操作,与对象的状态和行为相关。

    • 例如:

收起

java

复制

class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
}
public class Main {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        int result = calculator.add(10, 2);
        System.out.println(result);
    }
}
  1. 错误处理

    • Go 语言

      • 通常使用返回值来传递错误信息。例如,一个函数可能返回一个值和一个error类型的值。调用者需要检查error是否为nil来判断操作是否成功。这种方式使得错误处理的代码和正常业务逻辑的代码紧密结合。

      • 例如:

file, err := os.Open("test.txt")
if err!= nil {
    fmt.Println("Error opening file:", err)
    return
}
defer file.Close()
  • Java 语言

    • 主要依靠异常机制来处理错误。可以使用try - catch块来捕获和处理异常。异常分为检查异常(Checked Exception)和运行时异常(Runtime Exception)。检查异常需要在方法签名中声明,或者在方法内部处理;运行时异常通常是由程序逻辑错误引起的,不需要在方法签名中声明。

try {
    File file = new File("test.txt");
    FileReader reader = new FileReader(file);
} catch (FileNotFoundException e) {
    System.out.println("Error opening file: " + e.getMessage());
}

二、内存管理与垃圾回收

  1. 垃圾回收机制

    • Go 语言

      • Go 语言的垃圾回收器(GC)采用了标记 - 清扫(Mark - Sweep)等算法,并且在不断优化。它会自动回收不再使用的内存,开发人员一般不需要手动管理内存的释放。Go 的 GC 在一定程度上会影响程序的性能,不过 Go 语言也在不断改进 GC 的性能,例如采用并发 GC 来减少停顿时间。
    • Java 语言

      • Java 有成熟的垃圾回收机制,也使用标记 - 清除、复制算法、标记 - 整理等多种算法来回收内存。Java 的垃圾回收器有多种类型,如 Serial GC、Parallel GC、CMS(Concurrent Mark - Sweep)GC 和 G1 GC 等,可以根据不同的应用场景选择合适的垃圾回收器。同样,Java 的 GC 也会对程序性能产生影响,特别是在一些对实时性要求很高的场景下,需要对 GC 进行精细的调优。