结构体⽐较规则之⼀: 只有相同的类型的结构体才可以⽐较(1 结构体的属性类型, 2 属性的顺序)
本文是 Go 基础常见面试题,结合ChatGPT的详细解释版,全背是不可能,假如面试碰上了,挑出要点用自己的语言回答就好了。 1. 与其他语言相比,Go 语言的优点有哪些? 强大的标准库:Go 有一个丰富的标准库,尤其是对于网络编程和 Web 服务。 工具链:Go 语言自带一套完整的工具,如 go fmt 用于格式化代码,go get用于管理依赖等。 Goroutine 是 Go 语言的并发执行单元,它是一个轻量级的线程,由 Go 运行时管理。 7. Go 两个接口之间可以存在什么关系? Go 语言中的接口之间可能存在以下关系: 实现关系:如果一个接口 A 的方法集是另一个接口 B 方法集的子集,则我们称接口 B 实现了接口 A。 Go 的参数传递、引用类型 在 Go 语言中,所有的参数传递都是按值传递。
7.Go函数 1:函数定义 我想问一下大家,在大家小时候有没有玩过超级玛丽这个游戏?有同学说玩过,这确实是一款非常经典的游戏。 上面的函数是我们自己定义的(一般我们称为自定义函数),但是我们也已经学过不少GO语言自己定义的函数。 如下图所示: image-20210428000548492 args集合中存储了5,6,7三个数,对应的下标(编号),分别是0,1,2. 如果该集合中存储了4个数,那么第4个数的编号就是3. 7:函数作用域 (7.1) 局部变量 前面我们定义的函数中,都经常使用变量。 在Go语言里,所有的匿名函数(Go语言规范中称之为函数字面量)都是闭包。 根据以上定义,那么上一节定义的匿名函数其实就是闭包。
Mutex 几种状态 在 Go 语言的同步库中,sync.Mutex是用来提供互斥锁的基本同步原语。 互斥锁在内部状态实现可能因 Go 语言的不同版本而有所不同。 Go 语言团队不断优化sync.Mutex,以找到公平和效率之间的平衡点。有关 sync.Mutex 的更多权威信息,建议查看最新的 Go 语言源码和文档。 3. 需要注意的是,在实现细节方面,Go 的标准库不提供关于互斥锁内部行为的具体参数。自旋的逻辑和上述条件可能在 Go 不同的版本之间有所变化,以上内容主要基于 Go 语言当前和之前版本的实现。 7. Broadcast 和 Signal 区别 在 Go 语言的 sync包中,Cond提供了两种方式来唤醒等待(阻塞)在条件变量上的 goroutines:Signal和Broadcast。
在go语言中,new和make的区别? go语言中协程 协程和线程都可以实现程序的并发执行; 通过channel来进行协程间的通信; 只需要在函数调用前添加go关键字即可实现go的协程,创建并发任务; 关键字go并非执行并发任务 在Go语言中,程序单元也就指的是Goroutine go语言的select机制 for { select { case <-chan1: //..... Go语言局部变量分配在栈还是堆? Go语言编译器会自动决定把一个变量放在栈还是放在堆,编译器会做逃逸分析,当发现变量的作用域没有跑出函数范围,就可以在栈上,反之则必须分配在堆。 如何获取 go 程序运行时的协程数量, gc 时间, 对象数, 堆栈信息?
Go 语言笔试面试题 日常收集的题 一. 基础语法 1 = 和 := 的区别? 答案 := 声明+赋值 = 仅赋值 1var a int 2a = 10 3// 等价于 4a := 10 2 Go 有异常类型吗? 答案 Go 没有异常类型,只有错误类型(Error),通常使用返回值来表示异常状态。 1f, err := os.Open("/tmp/a.txt") 2if err ! 2^7-1],即 [-128, 127]。 [0 1 2 3 4 1 6 7 8 9]
fmt.Printf("Don't know type %T\n", t) } } whatAmI(true) whatAmI(1) whatAmI("hey")}运行结果:$ go run switch.go Write 2 as twoIt's a weekdayIt's after noonI'm a boolI'm an intDon't know type string
metrics 客户端 数据采集使用go-metrics 传输使用UDP, 仿StatsD上传采集数据, InfluxDB进行数据存储, Grafana进行展示。 prefix.name.field 最好表示为prefix_name field 代码实现 package client import ( "bufio" "bytes" "github.com/rcrowley/go-metrics
Fabric需要go的支持,所以顺便记录一下 # 官方 https://golang.org/dl/ 获取所需版本并下载 wget https://dl.google.com/go/go1.11.4.linux-amd64 .tar.gz # 解压 tar -zxvf go1.11.4.linux-amd64.tar.gz # 配置环境变量 ## 打开文件 sudo vi /etc/profile ## 在最后一行添加如下 ,并保存退出 export GOROOT=/home/wind/apps/go export PATH=$PATH:$GOROOT/bin ## 使用source使命令生效 source /etc
选择Go语言的原因: 并发和高并发:Go 语言在设计之初就考虑了并发和高并发方面的问题,将其内置于语言层面上,在编写代码时容易实现并发,提升程序的性能。 高效率:Go 语言的速度非常快(如 C/C++),同时又简单易用(如 Python)。Go 语言通过 Go 语言自身的编译器即可生成本地机器码,无需虚拟机,加快了执行效率。 开发工具丰富:Go语言是开源的,所以有很多优秀的开发工具,例如Goland、Visual Studio Code等。 学习曲线低:Go 语言语法类似于C/C++,容易学习,对于其他编程语言的用户来说更加容易上手。 例如,在高并发的Web应用程序中,Go 语言被广泛应用,如微服务框架、云原生应用开发、区块链等。 Go语言的优秀性能和高可靠性已经在实际应用中得到了验证。
并发简单:Go 语言提供的 goroutines 使并发编程变得更简洁易懂。通过go关键字,开发者可以非常方便地启动新的并发任务。 需要注意的使,Go 的调度器细节可能随着版本更新而变化,上述描述适用于 1.x 系列的 Go 版本。 5. Go 以用户态的方式关联多数的并发调度任务,只有在不得不进行系统调用时才与操作系统的内核调度器发生交互,从而实现了轻量级且高效的并发模型。 7. Go 1.14 版本引入了基于信号的抢占,这标志着 Go 语言实现了抢占式调度的一大步。 8. 升级 Go 版本:Go 团队不断优化 GC 机制。新的 Go 版本可能会带来更优化的 GC 行为,因此保持在最新的稳定版可以使应用受益于这些优化。 在调优之前,了解应用的内存使用模式是很重要的。
引用类型的内存在堆中分配,当没有任何变量引用堆中的内存地址时,该内存地址对应的数据存储空间就变成了垃圾,就会被GO语言的GC回收。 五、堆和栈 堆:在Go中,栈的内存是由编译器自动进行分配和释放,栈区往往存储着函数参数、局部变量和调用函数帧,它们随着函数的创建而分配,函数的退出而销毁。 注意:在go中 var是声明关键字,不会开辟内存空间;使用 := 或者 make 关键字进行初始化时才会开辟内存空间。 七、深拷贝和浅拷贝 操作对象 深拷贝和浅拷贝操作的对象都是Go语言中的引用类型 区别如下: 引用类型的特点是在内存中存储的是其他值的内存地址;而值类型在内存中存储的是真实的值。 九、go的map实现排序 我们知道go语言的map类型底层是有hash实现的,是无序的,不支持排序。 如果我们的数据使用map类型存储,如何实现排序呢?
Retiever) string { return r.Get("123") } duck typing 概念 像鸭子走路,像鸭子叫(长得像鸭子),那么就是鸭子 描述失误的外部行为而非结构 严格来说go 属于结构化类型系统,类似duck typing go语言中的duck typing 同时实现多个接口 同时具有python,c++的duck typing的灵活性 具有Java的类型检查 接口 接口由使用者定义
函数的返回值 可以一次返回多个返回值,Go 语言中如果是单返回值,可以直接在函数声明的括号后面增加数据类型。 ("a + b = ", sum) fmt.Println("a * b = ", product) } a + b = 3 a * b = 2 defer 的逆序执行 defer 关键字就是 Go
值传递与引用传递 因为在go语言中存在值类型与引用类型,所以在函数参数进行传递时也要注意这个问题。 下面这段代码演示了如何使用变长参数 例3: func main() { slice := []int{7, 9, 3, 5, 1} x := min(slice...) 多返回值 go语言中函数还支持一个特性那就是:多返回值。 命名返回值 除了上面支持的多返回值,在go语言中还可以给返回值命名,当需要返回的时候,我们只需要一条简单的不带参数的return语句。 例7: func add() func(int) int { n := 10 str := "string" return func(x int) int { n = n + x str
Go语言、C++和Java语言是三种性能较好的编程语言,它们在某些方面有不同的优势。下面是一个简单的比较: 内存管理 C++需要手动管理内存,而Java和Go语言使用垃圾回收机制。 Go语言的垃圾回收机制与Java相似,但是Go语言在设计上更加注重高性能和高并发,在实际生产环境中表现也很好。 Java和Go语言在执行速度方面与C++相差不大,但是Go语言在处理高并发方面更加出色,因为Goroutines使Go代码并发执行非常容易。 而Go语言使用Goroutines和Channels来处理并发性,使得Go语言非常适合于高并发场景,简单易用。 如果你需要处理高并发,则选择Go语言。
系统中的数据, 随着业务的发展,时间的推移, 将会非常多, 而业务中往往采用模糊查询进行数据的搜索, 而模糊查询会导致查询引擎放弃索引,导致系统查询数据时都是全表扫描,在百万级别的数据库中,查询效率是非常低下的,而我们使用 ES 做一个全文索引,将经常查询的系统功能的某些字段,比如说电商系统的商品表中商品名,描述、价格还有 id 这些字段我们放入 ES 索引库里,可以提高查询速度。
2010年7月7日 Go生态洞察:Go语言声明语法深入分析 摘要 大家好,猫头虎博主来了!在这篇Go生态洞察专栏文章中,我们将深入研究Go语言声明语法的奥秘。 引言 对于初识Go的朋友来说,Go的声明语法与C族语言所确立的传统不同可能会引起疑问。这篇文章会比较两种语法,并解释Go语法设计背后的原因。 Go的声明语法 来看Go语言是如何做的,Go在声明中使用了不同的类型语法。 总结 我们深入分析了Go语言声明语法的细节和设计哲学,与C族语言的对比揭示了Go的简洁和直观。这篇文章已经被Go生态洞察专栏收录,希望能给大家的Go编程带来帮助。记得多实践,多思考,让我们一起成长! 参考资料 Rob Pike, “Go’s Declaration Syntax”, 7 July 2010.
答案 init() 函数是 Go 程序初始化的一部分。 答案 Go 语言中,interface 的内部实现包含了 2 个字段,类型 T 和 值 V,interface 可以使用 == 或 != 比较。 Q5 简述 Go 语言GC(垃圾回收)的工作原理 答案 最常见的垃圾回收算法有标记清除(Mark-Sweep) 和引用计数(Reference Count),Go 语言采用的是标记清除算法。 答案 这在 Go 中是安全的,Go 编译器将会对每个局部变量进行逃逸分析。如果发现局部变量的作用域超出该函数,则不会将内存分配在栈上,而是分配在堆上。 Q7 非接口非接口的任意类型 T() 都能够调用 *T 的方法吗?反过来呢? 答案 一个T类型的值可以调用为*T类型声明的方法,但是仅当此T的值是可寻址(addressable) 的情况下。
Go应用程序同时运行数千个 Goroutine 是非常常见的做法。 Q6 如何高效地拼接字符串 答案 Go 语言中,字符串是只读的,也就意味着每次修改操作都会创建一个新的字符串。 strings.Builder for i := 0; i < 1000; i++ { str.WriteString("a") } fmt.Println(str.String()) Q7 什么是 rune 类型 答案 ASCII 码只需要 7 bit 就可以完整地表示,但只能表示英文字母在内的128个字符,为了表示世界上大部分的文字系统,发明了 Unicode, 它是ASCII的超集, Q9 Go 支持默认参数或可选参数吗? 答案:Go 语言不支持可选参数(python 支持),也不支持方法重载(java支持)。 但是返回值并没有被修改,这是由于 Go 的返回机制决定的,执行 return 语句后,Go 会创建一个临时变量保存返回值,因此,defer 语句修改了局部变量 i,并没有修改返回值。