2022年Go语言的最新面试题有哪些
这篇文章主要介绍了2022年Go语言的最新面试题有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇2022年Go语言的最新面试题有哪些文章都会有所收获,下面我们一起来看看吧。
1、编译执行下面代码会出现什么?
packagemain var( size:=1024 max_size=size*2 ) funcmain(){ println(size,max_size) }
解析 考点:变量简短模式 变量简短模式限制: - 定义变量同时显式初始化 - 不能提供数据类型 - 只能在函数内部使用
结果:
syntaxerror:unexpected:=
2、下面函数有什么问题?
packagemain constcl=100 varbl=123 funcmain(){ println(&bl,bl) println(&cl,cl) }
解析 考点:常量 常量不同于变量的在运行期分配内存,常量通常会被编译器在预处理阶段直接展开,作为指令数据使用,
cannottaketheaddressofcl
3、编译执行下面代码会出现什么?
packagemain funcmain(){ fori:=0;i<10;i++{ loop: println(i) } gotoloop }
解析 考点:goto goto不能跳转到其他函数或者内层代码
gotoloopjumpsintoblockstartingat
4、编译执行下面代码会出现什么?
packagemain import"fmt" funcmain(){ typeMyInt1int typeMyInt2=int variint=9 vari1MyInt1=i vari2MyInt2=i fmt.Println(i1,i2) }
解析 考点:Go 1.9 新特性 Type Alias 基于一个类型创建一个新类型,称之为defintion;基于一个类型创建一个别名,称之为alias。 MyInt1为称之为defintion,虽然底层类型为int类型,但是不能直接赋值,需要强转; MyInt2称之为alias,可以直接赋值。
结果:
cannotusei(typeint)astypeMyInt1inassignment
5、编译执行下面代码会出现什么?
packagemain import"fmt" typeUserstruct{ } typeMyUser1User typeMyUser2=User func(iMyUser1)m1(){ fmt.Println("MyUser1.m1") } func(iUser)m2(){ fmt.Println("User.m2") } funcmain(){ vari1MyUser1 vari2MyUser2 i1.m1() i2.m2() }
解析 考点:Go 1.9 新特性 Type Alias 因为MyUser2完全等价于User,所以具有其所有的方法,并且其中一个新增了方法,另外一个也会有。 但是
i1.m2()
是不能执行的,因为MyUser1没有定义该方法。 结果:
MyUser1.m1 User.m2
6、编译执行下面代码会出现什么?
packagemain import"fmt" typeT1struct{ } func(tT1)m1(){ fmt.Println("T1.m1") } typeT2=T1 typeMyStructstruct{ T1 T2 } funcmain(){ my:=MyStruct{} my.m1() }
**解析 考点:Go 1.9 新特性 Type Alias ** 是不能正常编译的,异常:
ambiguousselectormy.m1
结果不限于方法,字段也也一样;也不限于type alias,type defintion也是一样的,只要有重复的方法、字段,就会有这种提示,因为不知道该选择哪个。 改为:
my.T1.m1() my.T2.m1()
type alias的定义,本质上是一样的类型,只是起了一个别名,源类型怎么用,别名类型也怎么用,保留源类型的所有方法、字段等。
7、编译执行下面代码会出现什么?
packagemain import( "errors" "fmt" ) varErrDidNotWork=errors.New("didnotwork") funcDoTheThing(reallyDoItbool)(errerror){ ifreallyDoIt{ result,err:=tryTheThing() iferr!=nil||result!="itworked"{ err=ErrDidNotWork } } returnerr } functryTheThing()(string,error){ return"",ErrDidNotWork } funcmain(){ fmt.Println(DoTheThing(true)) fmt.Println(DoTheThing(false)) }
解析 考点:变量作用域 因为 if 语句块内的 err 变量会遮罩函数作用域内的 err 变量,结果:
<nil> <nil>
改为:
funcDoTheThing(reallyDoItbool)(errerror){ varresultstring ifreallyDoIt{ result,err=tryTheThing() iferr!=nil||result!="itworked"{ err=ErrDidNotWork } } returnerr }
8、编译执行下面代码会出现什么?
packagemain functest()[]func(){ varfuns[]func() fori:=0;i<2;i++{ funs=append(funs,func(){ println(&i,i) }) } returnfuns } funcmain(){ funs:=test() for_,f:=rangefuns{ f() } }
解析 考点:闭包延迟求值 for循环复用局部变量i,每一次放入匿名函数的应用都是想一个变量。 结果:
0xc0420460002 0xc0420460002
如果想不一样可以改为:
functest()[]func(){ varfuns[]func() fori:=0;i<2;i++{ x:=i funs=append(funs,func(){ println(&x,x) }) } returnfuns }
9、编译执行下面代码会出现什么?
packagemain functest(xint)(func(),func()){ returnfunc(){ println(x) x+=10 },func(){ println(x) } } funcmain(){ a,b:=test(100) a() b() }
解析 考点:闭包引用相同变量 结果:
100 110
10、编译执行下面代码会出现什么?
packagemain import( "fmt" ) funcmain(){ deferfunc(){ iferr:=recover();err!=nil{ fmt.Println(err) }else{ fmt.Println("fatal") } }() deferfunc(){ panic("deferpanic") }() panic("panic") }
关于“2022年Go语言的最新面试题有哪些”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“2022年Go语言的最新面试题有哪些”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注博信行业资讯频道。
版权声明
本文仅代表作者观点,不代表博信信息网立场。