Go语言基础的重点知识理解

168 阅读7分钟

1.Go语言的特点

高效、简洁、并发、安全

应用范围:网络编程、云原生、分布式微服务系统、云计算

2.声明变量的方式

  1. var

  2. :=

3.err、panic和recover

1. error:

-   error是一种表示错误状态的类型,是Go语言中常用的错误处理机制。
-   error类型是一个内置的接口类型,定义为:`type error interface { Error() string }`。
-   函数通常会返回一个error值来指示执行过程中是否发生了错误。如果函数执行成功,则返回nil;否则返回一个非nilerror值。
-   错误处理通常通过检查error值是否为nil来判断是否发生了错误,并采取相应的处理措施。

2. panic:

-   panic是Go语言中的一种异常情况,表示程序遇到了无法继续执行下去的严重错误。
-   当程序发生无法恢复的错误时,可以使用`panic()`函数主动抛出一个panic。
-   一旦发生panic,程序会立即停止执行当前函数的剩余代码,并开始沿调用栈回溯,执行每个被调用函数的defer语句。
-   如果没有被捕获的recover操作将继续将panic传播到更高层级的调用栈,直到程序退出并打印出panic信息。

3. recover:

-   recover是Go语言提供的用于从panic中恢复的内建函数。
-   recover只能在defer语句中调用,用于捕获panic并防止程序因为panic而退出。
-   当程序发生panic时,执行到defer语句时,如果recover被调用,会停止panic的传播,并返回panic的值。
-   如果没有发生panic或者在非defer语句中调用recover,它将返回nil

区别:

  • error用于表示一般的错误情况,由函数返回并需要手动处理。它是Go语言中正常的错误处理机制。
  • panic是一种异常情况,表示程序遇到了无法继续执行下去的严重错误。它会导致程序立即停止,并触发调用栈的回溯。
  • recover用于从panic中恢复,并阻止程序因为panic而退出。它只能在defer语句中调用,并返回panic的值。

总结

error和panic/recover是不同的概念和处理机制。error用于普通错误处理,而panic/recover则用于处理严重错误和程序恢复。

4.指针的概念和作用

概念

任何程序数据载入内存后,在内存都有他们的地址,这就是指针。而为了保存一个数据在内存中的地址,我们就需要指针变量。

作用

  1. 传递参数:当需要在函数之间传递大量的数据时,直接传递数据会带来额外的内存开销和性能损耗。通过使用指针作为参数,可以避免复制大量数据,提高性能。
  2. 修改变量的值:通过将变量的指针传递给函数,函数可以直接操作原始变量,而不是其副本。这使得函数可以修改原始变量的值,而不仅限于修改其副本。
  3. 动态分配内存:使用指针可以在运行时动态地分配内存。可以使用new或者make关键字创建新的对象,并返回指向该对象的指针。
  4. 实现数据结构:指针在实现复杂的数据结构时非常有用。例如,在链表、树和图等数据结构中,使用指针可以轻松地链接和跟踪节点。
  5. 提高性能:在某些情况下,使用指针可以提高代码的执行效率。因为指针是直接引用内存地址,可以避免数据的复制和额外的内存开销。

5.数组和切片的区别

数组: 数组固定长度。数组长度是数组类型的一部分,所以[3]int 和[4]int 是两种不 同的数组类型数组需要指定大小,不指定也会根据初始化,自动推算出大小, 大小不可改变。数组是通过值传递的

切片: 切片可以改变长度。切片是轻量级的数据结构,三个属性,指针,长度,容量 不需要指定大小切片是地址传递(引用传递)可以通过数组来初始化,也可以 通过内置函数 make()来初始化,初始化的时候 len=cap,然后进行扩容。

6.值传递和引用传递的区别

  1. 值传递 只会把参数的值复制一份放进对应的函数,两个变量的地址不同, 不可相互修改。
  2. 地址传递(引用传递) 会将变量本身传入对应的函数,在函数中可以对该变 量进行值内容的修改。

7.对map的理解

  1. map是一种无序的基于key-value的数据结构,用来存储和访问数据,Go语言中的map是引用类型,必须初始化才能使用。
  2. map的用途:数据缓存、计数器、api接口数据

8.函数和方法的区别

  1. 函数(Function):函数是一段独立的代码块,可以接收参数并返回结果。在Go语言中,函数不依赖于任何特定的类型,可以定义在任何地方,并且可以被其他函数调用。函数通常用于实现一些通用的逻辑操作,例如计算数学运算、字符串处理等。

以下是一个示例函数的定义:

func Add(a, b int) int {
    return a + b
}
  1. 方法(Method):方法是与类型相关联的函数。它是在结构体(struct)或者自定义类型上定义的,可以看作是一种特殊的函数。方法可以访问和操作其所属类型的数据,并且通过接收者来绑定到特定的类型上。

以下是一个示例方法的定义:

type Rectangle struct {
    width, height float64
}

// 定义Rectangle类型的方法
func (r Rectangle) Area() float64 {
    return r.width * r.height
}

在上述例子中,Area 方法是在 Rectangle 结构体上定义的。该方法使用了 Rectangle 类型的接收者 (r Rectangle),因此它可以访问和操作 Rectangle 类型的数据。

需要注意的是,由于方法是与类型相关联的,所以只有相同类型的变量才能调用该方法。

总结来说,函数是独立存在的,而方法是绑定到特定类型的。方法可以访问和操作其所属类型的数据,而函数则不具备这个特性。

9.什么是闭包

闭包指的是一个函数和与其相关的引用环境组合而成的实体。简单来说,闭包=函数+引用环境。 来看一个例子:

func adder() func(int) int {
	var x int
	return func(y int) int {
		x += y
		return x
	}
}
func main() {
	var f = adder()
	fmt.Println(f(10)) //10
	fmt.Println(f(20)) //30
	fmt.Println(f(30)) //60

	f1 := adder()
	fmt.Println(f1(40)) //40
	fmt.Println(f1(50)) //90
}

变量f是一个函数并且它引用了其外部作用域中的x变量,此时f就是一个闭包。 在f的生命周期内,变量x也一直有效。

10.对defer的理解

只需要在调用普通函数或方法前加上关键字 defer,就完成了 defer 所需要 的语法。当 defer 语句被执行时,跟在 defer 后面的函数会被延迟执行。直到 包含该 defer 语句的函数执行完毕时,defer 后的函数才会被执行,不论包含 defer 语句的函数是通过 return 正常结束,还是由于 panic 导致的异常结束。 你可以在一个函数中执行多条 defer 语句,它们的执行顺序与声明顺序相反