lab/note/随手记/go.md
张育新 be711334fb docs(note): 添加笔记目录及 gitignore 规则
- 新增 note 目录包含 AI、SQL、Golang、网络等多领域学习笔记
- 更新 .gitignore 添加 note/assets/ 和 note/项目/ 忽略规则
2026-07-10 09:24:40 +08:00

1.3 KiB
Raw Blame History

句点引入

一个完整引入声明语句形式的引入名importname可以是一个句点(.)。 这样的引入称为句点引入。使用被句点引入的包中的导出代码要素时,限定标识符的前缀必须省略。

比如在下面这个例子中,PrintlnNow函数调用不需要带任何前缀。

package main

import (
	. "fmt"
	. "time"
)

func main() {
	Println("Current time:", Now())
}

一般来说,句点引入不推荐使用,因为它们会导致较低的代码可读性

map的坑

go的map内部是哈希表元素会因 rehash扩容而移动到新的内存位置如果允许 &m[key] 拿到一个指针map 一旦扩容,这个指针就变成悬空指针(指向已失效的内存),为了避免这种内存安全问题Go 直接禁止对 map 值取地址,下面是示例代码:


type User struct {
    Name string
    Age  int
}

func main() {
    m := map[int]User{1: {Name: "张三", Age: 20}}

    // ❌ 编译错误cannot assign to struct field m[1].Name in map
    m[1].Name = "李四"
    
    // ✅ 正确的替代写法
    temp:=m[1]
	temp.Name = "李四"
	m[1]=temp
}

可寻址addressable:能通过 & 拿到它内存地址的操作数。

不可寻址not addressable:不能通过 & 拿到地址的操作数。