diff --git a/golang/basic/go-100-questions.md b/golang/basic/go-100-questions.md new file mode 100644 index 00000000..fb57b30e --- /dev/null +++ b/golang/basic/go-100-questions.md @@ -0,0 +1,5 @@ +# Go白问 +1. 使用go关键字开启一个协程都发生了什么?它与java中的并发有什么不一样的地方? +```go +go count(5) // 使用go关键字创建一个goroutine +``` \ No newline at end of file diff --git a/golang/basic/go-basic.md b/golang/basic/go-basic.md index 74830086..cf6f2b04 100644 --- a/golang/basic/go-basic.md +++ b/golang/basic/go-basic.md @@ -62,7 +62,16 @@ Google Protocol Buffer * Services 业务函数 * Endpoint 定义request, response格式等 * 四种变量声明方式 +* channel,go语言是如何实现不同协程之前通信的呢?其他语言是通过共享内存来实现通信,而go语言是通过通信来实现共享。一个重要的特性:不论是从channel中读一条消息,还是往channel中发送一条消息,都会阻塞当前代码运行。 +##### 指针 +取址运算符“&”用于获取对象地址。 +指针运算符“*”用于间接引用目标对象。 +```code +x := 10 +var p *int = &x // 获取地址,保存到指针变量 +*p += 20 // 用指针间接引用,并更新对象 +``` ### 注意 * go语言中{不能单独放在一行,否则运行时会产生错误 diff --git a/golang/basic/go-question.md b/golang/basic/go-question.md new file mode 100644 index 00000000..67360975 --- /dev/null +++ b/golang/basic/go-question.md @@ -0,0 +1,111 @@ +# Go语言答疑解惑 + +## channel +* 从一个关闭的 channel 仍然能读出数据吗 +* channel 有哪些应用 +* 如何优雅地关闭 channel +* channel 在什么情况下会引起资源泄漏 +* 什么是 CSP +* channel 底层的数据结构是什么 +* channel 发送和接收元素的本质是什么 +* 关于 channel 的 happened-before 有哪些 +* 向 channel 发送数据的过程是怎样的 +* 从 channel 接收数据的过程是怎样的 +* 操作 channel 的情况总结 +* 关闭一个 channel 的过程是怎样的 + +## map +* map 的底层实现原理是什么 +* 可以边遍历边删除吗 +* map 的删除过程是怎样的 +* 可以对 map 的元素取地址吗 +* 如何比较两个 map 相等 +* 如何实现两种 get 操作 +* map 是线程安全的吗 +* map 的遍历过程是怎样的 +* map 中的 key 为什么是无序的 +* float 类型可以作为 map 的 key 吗 +* map 的赋值过程是怎样的 +* map 的扩容过程是怎样的 + +## interface +* iface 和 eface 的区别是什么 +* Go 接口与 C++ 接口有何异同 +* 接口转换的原理 +* 如何用 interface 实现多态 +* Go 语言与鸭子类型的关系 +* 值接收者和指针接收者的区别 +* 接口的构造过程是怎样的 +* 编译器自动检测类型是否实现接口 +* 类型转换和断言的区别 +* 接口的动态类型和动态值 + +## 标准库 +* context 如何被取消 +* context 是什么 +* context 有什么作用 +* context.Value 的查找过程是怎样的 +* unsafe +* Go指针和unsafe.Pointer有什么区别 +* 如何利用unsafe包修改私有成员 +* 如何利用unsafe获取slice&map的长度 +* 如何实现字符串和byte切片的零拷贝转换 + +## goroutine 调度器 +* g0 栈何用户栈如何切换 +* goroutine 如何退出 +* goroutine 调度时机有哪些 +* goroutine和线程的区别 +* GPM 是什么 +* M 如何找工作 +* mian gorutine 如何创建 +* schedule 循环如何启动 +* schedule 循环如何运转 +* sysmon 后台监控线程做了什么 +* 一个调度相关的陷阱 +* 什么是 go shceduler +* 什么是M:N模型 +* 什么是workstealing +* 描述 scheduler 的初始化过程 + +## 编译和链接 +* Go 程序启动过程是怎样的 +* Go 编译相关的命令详解 +* Go 编译链接过程概述 +* GoRoot 和 GoPath 有什么用 +* 逃逸分析是怎么进行的 + +## 反射 +* Go 语言中反射有哪些应用 +* Go 语言如何实现反射 +* 什么情况下需要使用反射 +* 什么是反射 +* 如何比较两个对象完全相同 + +## 数组与切片 +* 切片作为函数参数 +* 切片的容量是怎样增长的 +* 数组和切片有什么异同 + + +## GC 的认识 +* 什么是 GC,有什么作用? +* 根对象到底是什么? +* 常见的 GC 实现方式有哪些?Go 语言的 GC 使用的是 +* 三色标记法是什么? +* STW 是什么意思? +* 如何观察 Go GC? +* 有了 GC,为什么还会发生内存泄露? +* 并发标记清除法的难点是什么? +* 什么是写屏障、混合写屏障,如何实现? +* Go 语言中 GC 的流程是什么? +* 触发 GC 的时机是什么? +* 如果内存分配速度超过了标记清除的速度怎么办? +* GC 关注的指标有哪些? +* Go 的 GC 如何调优? +* Go 的垃圾回收器有哪些相关的 API?其作用分 +* Go 历史各个版本在 GC 方面的改进? +* Go GC 在演化过程中还存在哪些其他设计?为什么没有被采用? +* 目前提供 GC 的语言以及不提供 GC 的语言有哪些?GC 和 No GC 各自的优缺点是什么? +* Go 对比 Java、V8 中 JavaScript 的 GC 性能如何? +* 目前 Go 语言的 GC 还存在哪些问题? diff --git a/java/basic/hashmap.md b/java/basic/hashmap.md index dd8e60ef..89b969f9 100644 --- a/java/basic/hashmap.md +++ b/java/basic/hashmap.md @@ -1,5 +1,14 @@ ### 学习笔记 Hash几乎是面试的必考,我没事就找机会面试,几乎每次都被面到,面试的时候主要是考察你对Hash底层结构的理解,同时结合你项目实际中的使用来聊。我在这些年的开发和研发过程中,确实有很多场景的设计或者使用都或多或少用到了Hash,当然平时开发写代码,肯定少不了HashMap。面试官还喜欢问你对JDK7和8中HashMap的区别,也可以看看我的[面试宝典](../../tool/interview.md#盘涅) +* HashMap 全理论 https://blog.csdn.net/weixin_34392227/article/details/112348756 +* HashMap面试题 https://www.cnblogs.com/aobing/p/12014271.html +* HashMap JDK8以前头插法为什么会出现死循环 https://www.bilibili.com/video/BV1n541177Ea?spm_id_from=333.337.search-card.all.click + + +### 为什么链表长度达到8后变为红黑树 +https://www.pianshen.com/article/2770135206/ + + ### HashMap基础知识 * [一致性Hash](http://note.youdao.com/noteshare?id=2df0dfa390855dde55075260b8ddc27a&sub=A2CDBD1C8B614310ABFF0F03682FAB7A) \ No newline at end of file diff --git a/java/basic/java-basic.md b/java/basic/java-basic.md index 55d8cc6a..c333d348 100755 --- a/java/basic/java-basic.md +++ b/java/basic/java-basic.md @@ -1189,7 +1189,8 @@ System.out.println(e2.get(2)); // 2 `transient` 将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化。【对象序列化是一个用于将对象状态转换为字节流的过程,可以将其保存到磁盘文件中或通过网络发送到任何其他程序;从字节流创建对象的相反的过程称为反序列化】 - +为什么要不序列化? + 一些敏感信息,比如密码和银行卡号等在java对象序列化时不希望被序列化,不被序列化的属性就不会被存储到磁盘上,或通过网络传输。为了实现属性不被序列化,只需要在属性前加上transient关键字就能达到目的。 `volatile` volatile只能修饰变量,被修饰的变量对其他线程是“可见的”,同时volatile修饰的变量禁止指令重排(保证了有序性) diff --git a/plugins/redis.md b/plugins/redis.md index ce85acc8..79d01f77 100644 --- a/plugins/redis.md +++ b/plugins/redis.md @@ -12,7 +12,7 @@ * 单线程的redis,如何知道要运行定时任务? * Redis Server启动源码分析 * Redis get/set源码分析 - * Redis SkipMap病毒 + * 面试题 https://www.sohu.com/a/486868862_121124376 * [实战]() ### 学习计划 diff --git a/tool/2022-04-07.png b/tool/2023-03-24.png similarity index 100% rename from tool/2022-04-07.png rename to tool/2023-03-24.png diff --git a/tool/english.md b/tool/english.md index b709bc2d..66018879 100644 --- a/tool/english.md +++ b/tool/english.md @@ -130,3 +130,4 @@ * LDAP Lightweight Directory Access Protocol 轻型目录访问协议。LDAP采用树形结构存储,查询高效,开源产品OpenLDAP。可用于SSO单点登录。LDAP主要的应用场景是查询多而修改极少,查询和修改的比率是10:1 甚至更高, 那就充分发挥LDAP的优势了,因为没有事务处理,那数据库的速度可是比不上。 还有LDAP能存储海量的数据,还可以轻松地在各个系统之间复制,可用性超高。 * privileged 有特权的 * syntactic sugar 语法糖 +* AIGC Artificial Intelligence Generated Content 人工智能生成内容