Latest Posts
-
索引的数据结构
索引是一种数据结构,旨在提高数据库查询的速度。
-
slice扩容一致性有问题吗?slice指针会一致吗?
需要分析slice在扩容和指针方面的行为。
-
redis跳表索引怎么建立?
Redis 的跳表(skiplist)用于实现有序集合(sorted sets)等功能,其中跳表索引的建立是通过动态层级(levels)和前进指针(forward pointers)实现的。
-
redis跳表
Redis 的跳表(Skip List)是一种高效的数据结构,用于实现 Redis 的有序集合(Sorted Set)功能。
-
redis数据类型
Redis是一种开源的、基于内存的键值存储数据库,它支持多种类型的数据结构。
Redis支持的一些主要数据类型:
(前五种是注意使用的类型)
-
redis-zset的使用场景
Redis中的有序集合(Sorted Set,简称ZSet)是一种非常灵活和强大的数据结构,它可以用来解决各种实际问题。
-
MySQL使用explain关注哪些字段?
在MySQL中,
EXPLAIN命令是用来分析SELECT查询的执行计划的。 explain优化查询语句,使用EXPLAIN时,有几个关键字段特别值得关注: -
grcp和restful-API区别
通信协议:
GRPC 使用 gRPC 协议,通常基于 HTTP/2,而 RESTful API 主要使用 HTTP 协议。
数据格式:
GRPC 通常使用 protobuf 或其他二进制格式进行数据序列化和反序列化,效率较高。
-
go除了channel还有其他同步方式吗?
Go语言除了提供channel作为goroutines之间的通信机制,还提供了多种同步方式来控制并发访问共享资源、协调goroutines的执行流程。
除channel之外,Go语言中常用的几种同步方式:
-
go里面的原子操作
Go语言中的原子操作是通过标准库sync/atomic提供的,这些操作能够保证在多个goroutine访问共享资源时的安全性,
-
go用户登录 设置不同权限?
在Go中实现用户登录并设置不同权限,通常涉及到用户认证(Authentication)和授权(Authorization)两个过程。 (用户认证和授权是不同的)
-
go协程同步
Go语言提供了多种机制来同步goroutines,确保并发程序的正确性和效率。
Go语言中用于goroutine同步的几种主要方式:
WaitGroup
-
go-slice需要锁来保护吗?
在Go语言中,基本数据结构如slice和map本身不是并发安全的。 如果在多个goroutine中对同一个slice或map进行读写操作,而没有适当的同步机制,就可能导致数据竞争(race condition),这会导致程序的行为不可预测,甚至崩溃。
为什么需要同步保护?
Map:
对map的并发读写操作会直接导致程序崩溃。
-
go-slice指针会一致吗?
slice的底层数组指针在某些操作下会保持一致,在其他操作下则可能会发生改变。
-
go-map为什么不是安全的?
在Go语言中,map不是并发安全的主要原因在于它的设计并没有内置并发控制机制。
-
go-kratos
安装kratos
-
go-channel使用场景
Channel是Go语言中的一个核心特性,用于在goroutines之间进行通信和同步。
-
B+树
B+树是一种自平衡树数据结构,它维护数据以便于快速访问,是数据库和文件系统中广泛使用的索引结构之一。
-
常见的GC算法
垃圾回收(Garbage Collection,GC)算法是自动内存管理系统中用于回收不再使用的内存资源的一种算法。
-
mysql索引
B+Tree索引:
B+Tree索引是MySQL中最常用的索引类型,也是默认的索引类型。
-
go进程线程协程的区别
进程
进程是具有⼀定独⽴功能的程序关于某个数据集合上的⼀次运⾏活动,进程是系统进⾏资源分配和调度的⼀个独⽴单 位。
-
go数组和切片
数组:
数组固定长度。数组长度是数组类型的一部分,所以[3]int 和[4]int 是两种不 同的数组类型数组需要指定大小,不指定也会根据初始化,自动推算出大小, 大小不可改变。数组是通过值传递的
切片:
切片可以改变长度。切片是轻量级的数据结构,三个属性,指针,长度,容量 不需要指定大小切片是地址传递(引用传递)可以通过数组来初始化,也可以 通过内置函数 make()来初始化,初始化的时候 len=cap,然后进行扩容。
数组和切片在传递的时候的区别:
数组是值传递, 切片是引用传递
切片扩容
func main() { arr := make([]int, 0) for i := 0; i < 2000; i++ { fmt.Println("len 为", len(arr), "cap 为", cap(arr)) arr = append(arr, i) } }我们可以看下结果 依次是
-
go内存模型小对象多了会造成GC压力
Golang的内存模型,为什么⼩对象多了会造成gc压⼒。
-
go-算法
顺序查找(Sequential Search):
顺序查找是最简单的一种查找算法,它从头到尾依次遍历待查找的元素,直到找到目标元素或遍历完整个集合。
-
go-消息发送失败保证消息不重复
发送失败,到客户端的ack丢失,如何做到不重复?
-
go-动态扩容问题
动态扩容相关问题:平常30万,现在100万,应该如何应对?
-
go-variable-example
这里是一个变量声明的例子,思考一下会输出什么: ```go var( size := 1024 max_size = size*2 )
-
go-return-example
这里是一个return的例子,思考一下会输出什么:
func funcMui(x,y int)(sum int,error){ return x+y,nil } -
go-new-and-make
new 的作用是初始化一个内置类型的指针 new 函数是内建函数,函数定义:
func new(Type) *Type -
go-new-and-make-2
- new(T) 和 make(T,args) 是 Go 语言内建函数,用来分配内存,但适用的类型不同。
-
go-kafka保证消息有序
使用kafka,如何确保消息有序?
-
go-GC
在 Go 语言中,GC(Garbage Collection,垃圾回收)是自动管理内存的机制。 Go 语言的垃圾回收器负责在程序运行时自动识别和回收不再使用的内存,以避免内存泄漏和手动内存管理引发的问题。
-
go-defer
defer 的作用是:
只需要在调用普通函数或方法前加上关键字 defer,就完成了 defer 所需要 的语法。
-
go-defer-example
这里是一个for range的例子,思考一下会输出什么: ```go func main() { slice := []int{0,1,2,3} m := make(map[int]*int)
-
go-defer-example-2
这里是一个defer使用的例子,思考一下会输出什么:
package main func test1()bool{ a := false defer func(){ a = true } return a } func test2()(a bool){ a = false defer func(){ a = true } defer func() { a = true }() return a }输出:
./defer_example.go:4:11: expression in defer must be function call ./defer_example.go:11:11: expression in defer must be function call解释: defer 语句后面的 ( ) 是用于表示推迟执行的是一个函数调用,而不是一个表达式。
-
go-append-example
这里是一个new之后append的例子,思考一下会输出什么:
func main() { s1 := []int{1, 2, 3} s2 := []int{4, 5} s1 = append(s1, s2) fmt.Println(s1) } -
channel为什么可以做到线程安全
Channel是Go中的⼀个核⼼类型,可以把它看成⼀个管道,通过它并发核⼼单元就可以发送或者接收数据进⾏通讯 (communication),Channel也可以理解是⼀个先进先出的队列,通过管道进⾏通信。
-
go语言里rune和byte
首先来看一个题目:
-
Go 程序中的包是什么
包 (pkg) 是 Go 工作区中包含 Go 源文件或其他包的目录。源文件中的每个函 数、变量和类型都存储在链接包中。每个 Go 源文件都属于一个包,该包在文 件顶部使用以下命令声明:
package <packagename>使用以下方法导入和导出包以重用导出的函数或类型:
import <packagename>Golang 的标准包是 fmt,其中包含格式化和打印功能,如 Println().
-
go语言里数据结构
Golang 使用以下类型:
- Method
- Bool
- String
- Array
- Slice
- Struct
- Pointer
- Function
- Interface
- Map
- Channel
-
Go 类型转换
Go支持以下形式的类型转换:
Go 支持显式类型转换以满足其严格的类型要求。
-
与其他语言相比,使用 Go 有什么好处
- 与其他作为学术实验开始的语言不同,Go 代码的设计是务实的。每个功能和语法决策都旨在让程序员的生活更轻松。
- Golang 针对并发进行了优化,并且在规模上运行良好。
- 由于单一的标准代码格式,Golang 通常被认为比其他语言更具可读性。 4.自动垃圾收集明显比 Java 或 Python 更有效,因为它与程序同时执行。