golang 常见问题

golang 常见问题

整数溢出问题

无符号类型的溢出

当无符号类型溢出时,它们的行为是“环绕”性质的,从最大值回到最小值。因为所有位都用于表示数值,超出最大值的进位会被截断,只保留低位部分。

示例:uint8 类型的加法溢出

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
package main

import "fmt"

func main() {
    var a uint8 = 250
    var b uint8 = 10
    var c uint8 = a + b

    fmt.Printf("uint8 溢出: %d + %d = %d\n", a, b, c)  // 输出: uint8 溢出: 250 + 10 = 4
}

有符号类型的溢出

有符号类型使用补码表示法,因此它们在溢出时的行为与无符号类型不同。补码表示法的特点是,最小负数(如 -128)的二进制表示为最高位为 1 的数值。当溢出时,结果会“环绕”到最小负数或者最大正数。

示例:int8 类型的加法和减法溢出

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
package main

import "fmt"

func main() {
    var a int8 = 127
    var b int8 = 1
    var c int8 = a + b

    fmt.Printf("int8 加法溢出: %d + %d = %d\n", a, b, c)  // 输出: int8 加法溢出: 127 + 1 = -128

    var d int8 = -128
    var e int8 = 1
    var f int8 = d - e

    fmt.Printf("int8 减法溢出: %d - %d = %d\n", d, e, f)  // 输出: int8 减法溢出: -128 - 1 = 127
}

byte和rune

  • byteuint8 的别名,范围是 0 到 255,用于处理原始二进制数据和 ASCII 字符。
  • runeint32 的别名,范围是 -21474836482147483647,用于处理 Unicode 字符。
  • 使用 byterune 可以根据不同的需求高效地处理字符和文本数据。

tag是如何解析的

使用 reflect 包首先获取 User struct 的类型 (reflect.Type) ,然后遍历每个字段并使用 Field.Tag.Get("json") 来获取标签的值。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
package main

import (
    "fmt"
    "reflect"
)

type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    user := User{Name: "Alice", Age: 30}
    t := reflect.TypeOf(user)
    for i := 0; i < t.NumField(); i++ {
        field := t.Field(i)
        fmt.Printf("Field: %s, Tag: %s\n", field.Name, field.Tag.Get("json"))
    }
}

3、for range 的时候它的地址会发生变化么? for 循环遍历 slice 有什么问题?

defer recover 的问题?(主要是能不能捕获)

7、 golang 中解析 tag 是怎么实现的?反射原理是什么?(问的很少,但是代码中用的多) 8、调用函数传入结构体时,应该传值还是指针? (Golang 都是值传递) 9、silce 遇到过哪些坑? 10、go struct 能不能比较? 11、Go 闭包

Licensed under CC BY-NC-SA 4.0