百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

GO必知必会面试题汇总(gin 面试题)

haoteby 2025-01-26 22:25 6 浏览

互联网的就业环境越来越差了,应小伙伴们的强烈建议,你们要的Go面试题汇总他来了。

我们平常在工作中除了撸好代码,跑通项目之外,还要注意内外兼修。内功和招式都得练,才能应对突如其来的变故,顺利的拿到新的offer。

近期我会整理分享一系列后端工程师求职面试相关的文章,知识脉络图如下:

  • JAVA/GO/PHP 面试常问的知识点
  • DB:MySql PgSql
  • Cache: Redis MemCache MongoDB
  • 数据结构
  • 算法
  • 微服务&高并发
  • 流媒体
  • WEB3.0
  • 源码分析

通过这一系列的文章,大家不仅能温习和梳理后端开发相关的知识点,也可以了解目前的市场环境对服务端开发,尤其是对Go开发工程师的岗位要求,需要掌握哪些核心技术。

值类型和引用类型

值类型有哪些?

基本数据类型都是值类型,包括:int系列、float系列、bool、字符串、数组、结构体struct。

引用类型有哪些?

指针、切片slice、接口interface、管道channel

值类型和引用类型的区别?

  1. 值类型在内存中存储的是值本身,而引用类型在内存中存储的是值的内存地址。
  2. 值类型内存通常在栈中分配,引用类型内存通常在堆中分配。

垃圾回收

引用类型的内存在堆中分配,当没有任何变量引用堆中的内存地址时,该内存地址对应的数据存储空间就变成了垃圾,就会被GO语言的GC回收。

一图胜千言

堆和栈

在Go中,栈的内存是由编译器自动进行分配和释放,栈区往往存储着函数参数、局部变量和调用函数帧,它们随着函数的创建而分配,函数的退出而销毁。

一个goroutine对应一个栈,栈是调用栈(call stack)的简称。一个栈通常又包含了许多栈帧(stack frame),它描述的是函数之间的调用关系,每一帧对应一次尚未返回的函数调用,它本身也是以栈形式存放数据。

与栈不同的是,应用程序在运行时只会存在一个堆。狭隘地说,内存管理只是针对堆内存而言的。程序在运行期间可以主动从堆上申请内存,这些内存通过Go的内存分配器分配,并由垃圾收集器回收。

切片

比较

切片之间是不能比较的,我们不能使用==操作符来判断两个切片是否含有全部相等元素。

切片唯一合法的比较操作是和nil比较。

比较的详解

要检查切片是否为空,应该使用

len(s) == 0

来判断,而不应该使用

s == nil

来判断。

原因是:一个nil值的切片并没有底层数组,一个nil值的切片的长度和容量都是0。但是我们不能说一个长度和容量都是0的切片一定是nil。

我们通过下面的示例就很好理解了:

var s1 []int            //len(s1)=0;cap(s1)=0;s1==nil
s2 := []int{}           //len(s2)=0;cap(s2)=0;s2!=nil
s3 := make([]int, 0)    //len(s3)=0;cap(s3)=0;s3!=nil

所以要判断一个切片是否是空的,要是用len(s) == 0来判断,不应该使用s == nil来判断。

其根本原因在于后面两种初始化方式已经给切片分配了空间,所以就算切片为空,也不等于nil。但是len(s) == 0成立,则切片一定为空。

注意:在go中 var是声明关键字,不会开辟内存空间;使用 := 或者 make 关键字进行初始化时才会开辟内存空间。

深拷贝和浅拷贝

操作对象

深拷贝和浅拷贝操作的对象都是Go语言中的引用类型

区别如下:

引用类型的特点是在内存中存储的是其他值的内存地址;而值类型在内存中存储的是真实的值。

我们在go语言中通过 := 赋值引用类型就是 浅拷贝,即拷贝的是内存地址,两个变量对应的是同一个内存地址对应的同一个值。

a := []string{1,2,3} 
b := a

如果我们通过copy()函数进行赋值,就是深拷贝,赋值的是真实的值,而非内存地址,会在内存中开启新的内存空间。

举例如下:

a := []string{1,2,3} 
b := make([]string,len(a),cap(a)) 
copy(b,a)

new和make

new

new是GO语言一个内置的函数,它的函数签名如下:

func new(Type) *Type

特点

  • Type表示类型,new函数只接受一个参数,这个参数是一个类型
  • *Type表示类型指针,new函数返回一个指向该类型内存地址的指针。

new函数不太常用,使用new函数得到的是一个类型的指针,并且该指针对应的值为该类型的零值。

举个例子:

func main() {
    a := new(int) 
    b := new(bool)
    fmt.Printf("%T\n", a) // *int 
    fmt.Printf("%T\n", b) // *bool 
    fmt.Println(*a) // 0 
    fmt.Println(*b) // false 
}

使用技巧

var a *int只是声明了一个指针变量a但是没有初始化,指针作为引用类型需要初始化后才会拥有内存空间,才可以给它赋值。

应该按照如下方式使用内置的new函数对a进行初始化之后就可以正常对其赋值了:

   func main() {
    var a *int
    a = new(int)
    *a = 10
    fmt.Println(*a)
}

make

make也是用于内存分配的,区别于new,它只用于slice、map以及channel的内存创建,而且它返回的类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型就是引用类型(指针类型),所以就没有必要返回他们的指针了。

make函数的函数签名

func make(t Type, size ...IntegerType) Type

特点

make函数是无可替代的,我们在使用slice、map以及channel的时候,都需要使用make进行初始化,然后才可以对它们进行操作。

使用技巧

var b map[string]int这段代码,只是声明变量b是一个map类型的变量,需要像下面的示例代码一样使用make函数进行初始化操作之后,才能对其进行键值对赋值:

func main() { 
    var b map[string]int 
    b = make(map[string]int, 10) 
    b["分数"] = 100 
    fmt.Println(b)
}

总结:new与make的区别

  1. 二者都是用来做内存分配的。
  2. make只用于slice、map以及channel的初始化,返回的是类型本身(类型本身就是引用类型(指针类型));
  3. 而new用于内存分配时,在内存中存储的是对应类型的型零值(比如0,false),返回的是该类型的指针类型。

Go的map如何实现排序

我们知道Go语言的map类型底层是由hash实现的,是无序的,不支持排序。

如果我们的数据使用map类型存储,如何实现排序呢?

解决思路

排序map的key,再根据排序后的key遍历输出map即可。

代码实现:

package main

import (
   "fmt"
   "math/rand"
   "sort"
   "time"
)

func main() {
   rand.Seed(time.Now().UnixNano()) //初始化随机数种子

   var scoreMap = make(map[string]int, 30)

   for i := 0; i < 30; i++ {
      key := fmt.Sprintf("stu%02d", i) //生成stu开头的字符串
      value := rand.Intn(30)           //生成0~50的随机整数
      scoreMap[key] = value
   }
   //取出map中的所有key存入切片keys
   var keys = make([]string, 0, 30)
   for key := range scoreMap {
      keys = append(keys, key)
   }
   //对切片进行排序
   sort.Strings(keys)
   //按照排序后的key遍历map
   for _, key := range keys {
      fmt.Println(key, scoreMap[key])
   }
}

运行结果

搞定,非常顺滑!

有更多补充的小伙伴,欢迎在评论区留言交流!

相关推荐

百度首席技术官王海峰:飞桨已拥有750万名开发者 文心一言将逐步开放插件生态

【百度首席技术官王海峰:飞桨已拥有750万名开发者文心一言将逐步开放插件生态】《科创板日报》6日讯,2023世界人工智能大会上,百度首席技术官、深度学习技术及应用国家工程研究中心主任王海峰表示,截至...

那些不得不装的浏览器插件,日英文视频自动翻译、广告、沉浸阅读

这年头各种浏览器层出不穷,要说使用量最大的还是基于chromium内核的吧。MicrosoftEdge、360、QQ……哪个厂商不说它香!chromium系的强大扩展性让我们浏览网页的体验越来越爽了...

百度站长平台:论坛搜索功能升级 推论构化数据插件

站长之家(Chinaz.com)3月26日消息近日,百度站长平台站内搜索功能针对论坛站点新增了搜版块和搜用户功能。此外,还推出了新版的论坛结构化数据插件,分为兼容版和完整版两个版本。注意,兼容版无法开...

警惕!利用百度推广实施的诈骗!(百度推广真的有用吗)

...

百度王海峰:文心3.5效果全面提升 将发布更多百度官方和第三方插件

中证网讯(记者彭思雨)7月6日,2023世界人工智能大会在上海开幕。百度首席技术官、深度学习技术及应用国家工程研究中心主任王海峰表示,文心大模型3.5效果、功能、性能全面提升,实现了基础模型升级、精...

WORDPRESS好用的seo插件:生成百度站点地图

BaiduSitemapGenerator是何方大神?BaiduSitemapGenerator是一个wordpress插件,BaiduSitemapGenerator可以生成格式化sit...

你能容忍百度不经过允许给用户下载插件吗?

文/懒人先生(首发头条)最近,百度又摊上事儿了,这次找事儿的可不是个人,而是网友整个团体啊,事情的缘起是因为有一个网友在网上反映百度地图会自动在后台下载一些热门的音频文件,这样做的后果就是有可能网友们...

提升工作效率的三款excel插件推荐,相信你总会得到有价值的东西

本内容来源于@什么值得买SMZDM.COM|生活家被演南非有这样的一句话“会excel的比会word的挣得多,会ppt的比会excel的挣得多”但我看来,office三件套word、excel、pp...

工具 | 直接在网页上做标记?这些插件简直不要太赞

哈喽,大家好。好久不见啊!!!2021年的第一篇推文来啦~有小伙伴在后台留言:浏览网页时如何做标记?所以这篇推文就来介绍一下~之前的推文中有介绍过,浏览网页时如何快速定位关键词,其实也算是做标记的一种...

良心合集!Adobe Audition常用插件免费下载

八月了时间很快...

用上这几个脚本,多家网盘下载不限速

下载别人分享的文件需要用到各种网盘,有的网盘下载一个小文件也需要转存才能下载,或是需要客户端与会员等操作,在日常使用的时候不是很方便,百度网盘相关的下载工具已经介绍过很多了。今天就来给大家推荐几个其他...

论坛站站长的福音 百度DZ插件跨越式升级

站长之家(chinaz.com)3月31日消息:百度站长平台今日跨越式升级discuz百度结构化数据提交插件,此次跨越式升级提升了收录时效性,而且支持提交有关用户和版块数据。如果你是使用Discuz!...

百度CTO王海峰:文心大模型3.5新增插件机制 使其具备生成实时准确信息的能力

【百度CTO王海峰:文心大模型3.5新增插件机制使其具备生成实时准确信息的能力】《科创板日报》27日讯,百度首席技术官王海峰表示,文心大模型3.5最大的一个变化是新增了插件机制,默认的内置插件“百度...

flutter集成 百度地图 ^2.0.1版本 | 绕坑必备

我之前在flutter中使用高德地图,发现没有引入,总是编译错误,后面我选择了使用flutter_map;flutter_map有一个局限是使用瓦片渲染。且只能渲染;要想效果好一点就用mapbox的...

百度文心一言新增搜索、图表生成等5大原生插件

【百度文心一言新增搜索、图表生成等5大原生插件】《科创板日报》16日讯,今日,文心一言发布五个原生插件:百度搜索、览卷文档(基于文档的交互)、E言易图(数据洞察图表生成)、说图解画(基于图片的交互)、...