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)
协程是用户态轻量级线程,
协程是线程调度的基本单位
通常在函数前加上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
}