01 = 和 := 的区别?

前者是赋值变量,后者是定义变量

02 指针的作用

指针指向变量的地址,在64位机器上占8个字节
【1 字节(Byte)= 8 位(bit)
1 千字节(KB,Kilobyte)= 1,024 字节(2^10 字节)】
作用

  • 取址然后取值
  • swap函数 交换变量的值
  • 指针接收器来改变结构体里面的值
package main
import "fmt"

type Counter struct {
   
    count int
}

func (c *Counter) Increment() {
   
    c.count++ // 增加 "count" 字段的值
}

func main() {
   
    myCounter := &Counter{
   } // 创建一个新的 "Counter" 实例。"&Counter{}" 表示我们直接获得了一个指向新实例的指针。
    fmt.Println("Initial count:", myCounter.count) // 打印初始的计数(默认为0)
    myCounter.Increment() // 调用 "Increment" 方法来增加计数
    fmt.Println("Count after incrementing:", myCounter.count) // 打印增加后的计数
}

将输出

Initial count: 0
Count after incrementing: 1

03 Go 允许多个返回值吗?

可以。通常函数除了一般返回值还会返回一个error。

04 Go 有异常类型吗?

有,Go用error类型代替了try…catch. 也可以用errors.New()来定义自己的异常

 _, err := funcDemo()
if err != nil {
   
    fmt.Println(err)
    return
}

05 什么是协程(Goroutine)

协程是用户态轻量级线程
Golang笔记-LMLPHP
协程是线程调度的基本单位
Golang笔记-LMLPHP
通常在函数前加上go关键字就能实现并发。一个Goroutine会以一个很小的栈启动2KB或4KB,当遇到栈空间不足时,栈会自动伸缩, 因此可以轻易实现成千上万个goroutine同时启动。

06 ❤ 如何高效地拼接字符串

strings.Join ≈ strings.Builder(没有变量拷贝) > bytes.Buffer > “+” > fmt.Sprintf (要用反射获取值)

07 什么是 rune 类型

ASCII 码只需要 7 bit 就可以完整地表示,但只能表示英文字母在内的128个字符,为了表示世界上大部分的文字系统,发明了 Unicode, 它是ASCII的超集,包含世界上书写系统中存在的所有字符,并为每个代码分配一个标准编号(称为Unicode CodePoint),在 Go 语言中称之为 rune,是 int32 类型的别名。

Go 语言中,字符串的底层表示是 byte (8 bit) 序列,而非 rune (32 bit) 序列。

sample := "我爱GO"
runeSamp := []rune(sample)
runeSamp[0] = '你'
fmt.Println(string(runeSamp))  // "你爱GO"
fmt.Println(len(runeSamp))  // 4

08 如何判断 map 中是否包含某个 key ?

package main
import "fmt"
func main() {
   
    // 创建一个 map
    myMap := make(map[string]int)

    // 向 map 中添加键值对
    myMap["apple"] = 1
    myMap["orange"] = 2

    // 检查 key 是否存在
    value, exists := myMap["apple"]

    if exists {
   
        fmt.Println("The key exists with value:", value)
    } else {
   
        fmt.Println("The key does not exist.")
    }

09 Go 支持默认参数或可选参数吗?

不支持
不过,有几种方法可以模拟这种行为:
1、使用变长参数

package main

import "fmt"

func printMessage(message string, optionalParts ...string) {
   
    fullMessage := message
    for _, part := range optionalParts {
   
        fullMessage += " " + part
    }
10-19 08:23