golang面试 - string与[]byte的区别,如何互相转化

string是一个8位字节的集合,通常但不一定代表UTF-8编码的文本。string可以为空,但是不能为nil。string的值是不能改变的。string类型本质也是一个结构体,底层本质就是一个byte类型的数组。 byte就是uint8的别名,它是用来区分字节值和8位无符号整数值 string与[]byte的区别 对于[]byte与string而言,两者之间最大的区别就是string的值不能改变。string在底层都是结构体stringStruct{str: str_point, len: str_len},string结构体的str指针指向的是一个字符常量的地址, 这个地址里面的内容是不可以被改变的,因为它是只读的,但是这个指针可以指向不同的地址。 string的好处:以在不加锁的控制下,多次使用同一字符串,在保证高效共享的情况下而不用担心安全问题 对于[]byte来说,以下操作是可行的: 1 2 b := []byte("hello world") b[1] = 'i' string修改操作是被禁止的: 1 2 s := "hello world" s[1] = 'i' string支持这样的操作: 1 2 s := "hello world" s = "iello world" string与[]byte的互相转化 string的底层数据结构类型: 1 2 3 4 type stringStruct struct { str unsafe.Pointer len int } []byte对应的底层数据结构(本质上是个slice): 1 2 3 4 5 type slice struct { array unsafe.Pointer len int cap int } 两者对应的结构非常相似。...

十一月 4, 2022 · nobject

golang面试 - 米哈游第三方编制一面复盘

代码题 以n个协程,去输出[]string{“a”,“b”,“c”,“d”,“e”, “f”, “g”}。 代码题真得很简单,自己手生的很,竟然没写出来。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 func main() { var wg sync.WaitGroup sem := make(chan struct{}, 5) // 创建一个大小为5的信号量 letters := []string{"a", "b", "c", "d", "e", "f", "g"} for _, letter := range letters { sem <- struct{}{} // 尝试写入信号量,如果已满,则阻塞 wg.Add(1) go func(l string) { defer wg.Done() fmt.Println(l) time.Sleep(5 * time.Second) <-sem // 认领信号量 }(letter) } wg....

十一月 4, 2022 · nobject

golang面试 - 深拷贝与浅拷贝

深拷贝是指两个变量,如果其内部引用其他的地址,那么深拷贝会将其内部的指针所指向的值重新分配地址用于存储这个值,因此他们内部的一些引用指针会变化。 浅拷贝是指两个变量,实际上其内部引用部分的地址并没有变化。 常见的浅拷贝,像slice的赋值,map的赋值 1 2 s := []int{1,2,3} s1 = s 如上所示,s1实际上就是对s的浅拷贝 对于深拷贝,我们在代码里应该这么使用 1 2 3 s := []int{1,2,3} var s1 []int copy(s, &s1)

十一月 4, 2022 · nobject

golang面试 - gc

相关文章 https://draveness.me/golang/docs/part3-runtime/ch07-memory/golang-garbage-collector/ https://www.cnblogs.com/luozhiyun/p/14564903.html https://www.kancloud.cn/aceld/golang/1958308#Go_V13mark_and_sweep_21 https://www.bilibili.com/video/BV1wz4y1y7Kd?p=14&spm_id_from=pageDriver https://cloud.tencent.com/developer/article/1756163 https://blog.haohtml.com/archives/26358 https://mp.weixin.qq.com/s/5xjH-LJ53XiNm2sMNQZiGQ GCMark 标记准备阶段,为并发标记做准备工作,启动写屏障 STW GCMark 扫描标记阶段,与赋值器并发执行,写屏障开启 并发 GCMarkTermination 标记终止阶段,保证一个周期内标记任务完成,停止写屏障 STW GCoff 内存清扫阶段,将需要回收的内存归还到堆中,写屏障关闭 并发 GCoff 内存归还阶段,将过多的内存归还给操作系统,写屏障关闭 并发 Go 语言中对 GC 的触发时机存在两种形式: 主动触发,通过调用 runtime.GC 来触发 GC,此调用阻塞式地等待当前 GC 运行完毕。 被动触发,分为两种方式: 使用系统监控,当超过两分钟没有产生任何 GC 时,强制触发 GC。 使用步调(Pacing)算法,其核心思想是控制内存增长的比例。

十一月 4, 2022 · nobject

golang面试 - gmp

相关文章 https://mp.weixin.qq.com/s/jIWe3nMP6yiuXeBQgmePDg https://tonybai.com/2017/06/23/an-intro-about-goroutine-scheduler/ https://tonybai.com/2020/03/21/illustrated-tales-of-go-runtime-scheduler/ https://draveness.me/golang/docs/part3-runtime/ch06-concurrency/golang-goroutine/ https://www.kancloud.cn/aceld/golang/1958305#GoroutineGMP_164 https://segmentfault.com/a/1190000023869478 https://www.luozhiyun.com/archives/448 https://zboya.github.io/post/go_scheduler/ https://www.bilibili.com/video/BV19r4y1w7Nx?p=2&spm_id_from=pageDriver https://mp.weixin.qq.com/s/XiqVIR3U5ZmRD7xwJZKipA 进程,线程,协程的区别 进程: 进程是程序的一次执行过程,是程序在执行过程中的分配和管理资源的基本单位,每个进程都有自己的地址空间,进程是系统进行资源分配和调度的一个独立单位。 每个进程都有自己的独立内存空间,由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。 线程:在同一个进程中的不同线程共享相同的地址空间(虚拟内存,代表切换不需要切换页表),每个线程有独立的栈区,程序计数器(执行指令的信息),栈指针以及函数运行的寄存器。 初始栈大小8M,ulimit - s可以查看。调度由系统调度。从用户态切换到内核态,上下文切换消耗相对大 协程:用户态线程,不由内核管理,由go的底层调度器控制,协程初始栈大小2K。由用户调度 goroutine初始栈大小,上下文如何切换,存在哪里 协程初始栈大小2K,上下文由g0去调度找到对应可以运行的goroutine,存在gorountine的gobuf中 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 组织下面试的语言 gmp是go为了提高并发能力实现的协程调度模型 g代表我们常说的协程,代码里的体现就是go关键字 m代表操作系统的线程,系统最大值默认为10000 p代表逻辑处理器,默认与cpu的核数想同,当然也可以通过runtime.GOMAXPROCS()来设置p的数量,m一般需要与p关联才能执行g。 调度策略: p会切换到g0栈上,执行调度函数,查找到可执行的goroutine,然后调用gogo函数,切换到goroutine的执行流程上。 1. 每隔61次调度轮回从全局队列找,避免全局队列中的g被饿死。 2. 从p.runnext获取g,从p的本地队列中获取。 3. 调用 findrunnable 找g,找不到的话就将m休眠,等待唤醒。 findrunnable 查找G的过程: 1. 调用 runqget ,尝试从P本地队列中获取G,获取到返回 2. 调用 globrunqget ,尝试从全局队列中获取G,获取到返回 3....

十一月 4, 2022 · nobject

linux 常用命令

linux常用命令 1 ls cp rm mkdir touch vim chmod chgrp chroot ss, tcp ping netstat top等 vim 常用命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 跳至行首,不管有无缩进,就是跳到第0个字符 (常用) $ 跳至行尾 (常用) gg 跳至文首 (常用) G 调至文尾 (常用) dd 删除光标所在行 (常用) n+[Enter] n 为数字。光标向下移动 n 行(常用) :1,$s/word1/word2/g 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !(常用) dw 删除一个字(word) 𝑦𝑦复制一行 /pattern 向后搜索字符串pattern n 下一个匹配(如果是/搜索,则是向下的下一个,?...

十月 16, 2022 · nobject

Golang 面试资料整理

golang基础 defer golang底层 GMP模型 Sync包实现 Interface底层实现 Map底层实现 数据库 mysql mongo redis 消息队列 rabbitMQ kafka rocketMQ 微服务 konga 服务发现 服务熔断 服务降级 docker与k8s docker docker实现原理 docker的常用命令 docker编排 k8s istio 计算机网络 算法 排序算法 查找算法 树

十月 15, 2022 · nobject

Redis Zset 有序集合

zset是redis中常用的数据结构,一般使用场景是有序集合,排行榜等有序的需求我们会考虑使用。 背景: 最近也是做了相关的需求,用户发动态,将最新动态中的图片,视频或音频资源收集起来,列表中会展示用户最新4条动态的资源缩略图。因为动态还有个审核,所以 一般采集的时候会按审核的时间点采集,但展示却得按照创建时间展示。因此采用了zset的方案,score的值为创建时间,当审核完成时,会将该动态的资源信息以member存储至 zset中,取的时候,按照score(创建时间)由大到小读取 方案实施 存储,简单使用zadd命令,将动态资源信息(一个结构体,json格式化后以字符串形式)存储至zset中,createdAt为score 1 2 3 4 # ZADD KEY_NAME SCORE1 VALUE1.. SCOREN VALUEN # 将一个或多个成员元素及其分数值加入到有序集当中 # ZADD file fileInfo createdAt -> ZADD file "{url:'xxx.jpg',type:1}" 1635661958 维持zset大小,因为只需要取最新4条动态的资源,因此,对于旧的资源信息,可以删除4名开外的动态信息 1 2 3 4 5 6 # ZREMRANGEBYRANK key start stop # 移除有序集中,指定排名(rank)区间内的所有成员。 -> ZRemRangeByRank file 0 -5 # 因为默认是按从小到大排序的,我们如果要取最新的4条动态,需要从排名最小的元素开始删除, # 0代表排名最旧的,排最前的,-5表示排名倒数第5的, # 当zset中的元素超过4时,-5其实就相当于0,所以整个语句相当于删除第4名之后的动态资源信息 获取从大到小顺序的最新4条动态 1 2 3 # ZREVRANGE key start stop [WITHSCORES] # 按分数值递减(从大到小)来排列 -> ZREVRANGE file 0 3 不足之处 因为member的值中有url,有类型等信息,zset的member的长度是过大的,这就导致了并不能用上quickList,只能使用上skipList...

十月 31, 2021 · nobject

Mac OS下常备软件

基本软件 Homebrew chrome V2rayU,世界更精彩 iterm2,最好用的terminal ohmyzsh,最好用的shell zsh语法高亮插件,必备 zsh自动补全插件,必备 清理app git工具 Command Line Tools(需登录AppleID) Magnet alfred,听说是神器 工作软件 vscode,最好用的编辑器 golang postman 切换host ssh连接工具 最好用的redis工具

十月 31, 2021 · nobject

Golang 学习资料汇总,从入门到放弃

入门 go的一些使用小例子 无闻讲师的基础视频 go入门指南 go web基础 effective go 进阶 go内存模型 go程序诊断 标准库 标准库文档 标准库包的使用例子 go语言标准库 书籍或阅读清单 go开发者阅读清单 深入解析Go go语言编程之旅 go语法树入门 go语言设计-欧长坤 gopher博客推荐 draveness,go底层实现原理,讲得很详细 鸟窝,rpcx作者博客,go并发编程专栏 煎鱼大大,可以关注下公众号 李文周的博客 曹春晖的golang笔记 峰云golang专栏 大彬的blog gophers推荐清单

十月 26, 2021 · nobject

Interview_algorithm

排序算法 树

三月 5, 2021 · nobject

面试准备

语言 php 框架(laravel) socket编程,异步协程通信swoole php8 语言特性 php 底层实现原理(某个函数的实现,比如in_array; 某个语言结构,比如array) Golang Web框架 gin(目前使用的比较广泛的框架) 优点,与echo相比的优势 channel 通道 interface 接口 可看看B站泄漏的go代码结构 底层的一些实现原理及区别,比如array与slice 数据库及NoSql mysql的索引优化等 es相关可看看 redis相关使用场景 容器 docker相关 k8s相关 队列 rabbitMQ,目前公司消息队列使用 kafka,目前公司大数据存储使用 rocketMQ 阿里生态 计算机网络及网络协议 TCP的三次握手 socket相关 mqtt相关 wireshark抓包及tcpdump抓包 算法 letcode刷题

三月 4, 2021 · nobject