golang中一些容易出错的知识点总结

本文总结了Go语言中的一些常见错误,包括:使用map时的并发安全问题,如何正确更新字符串,接口的使用细节,以及defer的陷阱。并发安全方面,介绍了加锁(Mutex和RWMutex)和使用channel的方法。接口实现时,指出了值接收者和指针接收者的区别。还提到了Go与C++在指针和函数重载上的差异。
摘要由CSDN通过智能技术生成

检查 key 是否存在可以用 map 直接访问,检查返回的第二个参数即可

// 错误的 key 检测方式

func main() {

    x := map[string]string{"one": "2", "two": "", "three": "3"}

    if v := x["two"]; v == "" {

        fmt.Println("key two is no entry")    // 键 two 存不存在都会返回的空字符串

    }

}


// 正确示例

func main() {

    x := map[string]string{"one": "2", "two": "", "three": "3"}

    if _, ok := x["two"]; !ok {

        fmt.Println("key two is no entry")

    }

}

string 类型的值是常量,不可更改

// 修改字符串的错误示例

func main() {

    x := "text"

    x[0] = "T"        // error: cannot assign to x[0]

    fmt.Println(x)

}

// 修改示例

func main() {

    x := "text"

    xBytes := []byte(x)

    xBytes[0] = 'T'    // 注意此时的 T 是 rune 类型

    x = string(xBytes)

    fmt.Println(x)    // Text

}

注意: 上边的示例并不是更新字符串的正确姿势,因为一个 UTF8 编码的字符可能会占多个字节,比如汉字就需要 3~4 个字节来存储,此时更新其中的一个字节是错误的。

更新字串的正确姿势:将 string 转为 rune slice(此时 1 个 rune 可能占多个 byte),直接更新 rune 中的字符

func main() {
    x := "text"
    xRunes := []rune(x)
    xRunes[0] = '我'
    x = string(xRunes)
    fmt.Println(x)    // 我ext
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值