不知不觉也是来到了青训营的尾声,因为本人不是专门学习 Go 语言的,所以对于 go 的基础语法还是不太娴熟,希望自己在最后的阶段记录一下,然后提高一下自己对 go 语言的理解吧
一、变量声明
-
基本声明方式
-
在 Go 语言中,可以使用 var 关键字声明变量。例如:var a int,这里声明了一个名为 a 的整数变量。变量在声明后会被自动初始化为其类型的零值,对于 int 类型,零值是 0。
-
也可以在声明变量时进行初始化,如 var b int = 10,明确地将变量 b 初始化为 10。
-
短变量声明
-
Go 语言还支持短变量声明,使用:= 操作符。例如:c := 20,这会自动推断变量 c 的类型为 int,并且初始化为 20。这种方式只能在函数内部使用。
-
数据类型
-
基本数据类型
-
整数类型:包括 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'。
-
复合数据类型
- 数组:具有固定长度,并且元素类型相同。例如 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 的方式添加或修改键值对。
-
变量声明
-
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;,编译器会根据赋值推断c为int类型。 -
例如:
-
收起
java
复制
public class Main {
public static void main(String[] args) {
int x;
int y = 10;
var z = 20;
}
}
-
函数声明与方法定义
-
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 语言:
-
方法是与类相关联的,在类内部定义。方法的定义包括访问修饰符(如
public、private等)、返回类型、方法名和参数列表。例如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);
}
}
-
错误处理
-
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());
}
二、内存管理与垃圾回收
-
垃圾回收机制
-
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 进行精细的调优。
-