12.是否可以编译通过?如果通过,输出什么?
funcmain(){ i:=GetValue() switchi.(type){ caseint: println("int") casestring: println("string") caseinterface{}: println("interface") default: println("unknown") } } funcGetValue()int{ return1 }
解析
考点:type
编译失败,因为type只能使用在interface
13.下面函数有什么问题?
funcfuncMui(x,yint)(sumint,error){ returnx+y,nil }
解析
考点:函数返回值命名在函数有多个返回值时,只要有一个返回值有指定命名,其他的也必须有命名。 如果返回值有有多个返回值必须加上括号; 如果只有一个返回值并且有命名也需要加上括号; 此处函数第一个返回值有sum名称,第二个为命名,所以错误。
14.是否可以编译通过?如果通过,输出什么?
packagemain funcmain(){ println(DeferFunc1(1)) println(DeferFunc2(1)) println(DeferFunc3(1)) } funcDeferFunc1(iint)(tint){ t=i deferfunc(){ t+=3 }() returnt } funcDeferFunc2(iint)int{ t:=i deferfunc(){ t+=3 }() returnt } funcDeferFunc3(iint)(tint){ deferfunc(){ t+=i }() return2 }
解析
考点:defer和函数返回值需要明确一点是defer需要在函数结束前执行。 函数返回值名字会在函数起始处被初始化为对应类型的零值并且作用域为整个函数 DeferFunc1有函数返回值t作用域为整个函数,在return之前defer会被执行,所以t会被修改,返回4; DeferFunc2函数中t的作用域为函数,返回1; DeferFunc3返回3
15.是否可以编译通过?如果通过,输出什么?
funcmain(){ list:=new([]int) list=append(list,1) fmt.Println(list) }
解析
考点:newlist:=make([]int,0)
16.是否可以编译通过?如果通过,输出什么?
packagemain import"fmt" funcmain(){ s1:=[]int{1,2,3} s2:=[]int{4,5} s1=append(s1,s2) fmt.Println(s1) }
解析
考点:appendappend切片时候别漏了'...'
17.是否可以编译通过?如果通过,输出什么?
funcmain(){ sn1:=struct{ ageint namestring }{age:11,name:"qq"} sn2:=struct{ ageint namestring }{age:11,name:"qq"} ifsn1==sn2{ fmt.Println("sn1==sn2") } sm1:=struct{ ageint mmap[string]string }{age:11,m:map[string]string{"a":"1"}} sm2:=struct{ ageint mmap[string]string }{age:11,m:map[string]string{"a":"1"}} ifsm1==sm2{ fmt.Println("sm1==sm2") } }
解析
考点:结构体比较进行结构体比较时候,只有相同类型的结构体才可以比较,结构体是否相同不但与属性类型个数有关,还与属性顺序相关。
sn3:=struct{ namestring ageint }{age:11,name:"qq"}
sn3与sn1就不是相同的结构体了,不能比较。 还有一点需要注意的是结构体是相同的,但是结构体属性中有不可以比较的类型,如map,slice。 如果该结构属性都是可以比较的,那么就可以使用“==”进行比较操作。
可以使用reflect.DeepEqual进行比较
ifreflect.DeepEqual(sn1,sm){ fmt.Println("sn1==sm") }else{ fmt.Println("sn1!=sm") }
所以编译不通过: invalid operation: sm1 == sm2
18.是否可以编译通过?如果通过,输出什么?
funcFoo(xinterface{}){ ifx==nil{ fmt.Println("emptyinterface") return } fmt.Println("non-emptyinterface") } funcmain(){ varx*int=nil Foo(x) }
解析
考点:interface内部结构
non-emptyinterface
19.是否可以编译通过?如果通过,输出什么?
funcGetValue(mmap[int]string,idint)(string,bool){ if_,exist:=m[id];exist{ return"存在数据",true } returnnil,false } funcmain(){ intmap:=map[int]string{ 1:"a",2:"bb",3:"ccc",} v,err:=GetValue(intmap,3) fmt.Println(v,err) }
解析
考点:函数返回值类型nil 可以用作 interface、function、pointer、map、slice 和 channel 的“空值”。但是如果不特别指定的话,Go 语言不能识别类型,所以会报错。通常编译的时候不会报错,但是运行是时候会报:cannot use nil as type string in return argument
.
20.是否可以编译通过?如果通过,输出什么?
const( x=iota y z="zz" k p=iota ) funcmain(){ fmt.Println(x,y,z,k,p) }
解析
考点:iota
结果:
01zzzz4