go golang 筆試題 面試題 筆試 面試
發現go的筆試題目和面試題目還都是比較少的,於是乎就打算最近總結一下。雖然都不難,但是如果沒有准備猛地遇到了還是挺容易踩坑的。
就是幾個簡單的筆試題目,也可能面試的時候直接給看讓說結果。
1, 用不同的goroutine去操作map的時候會存在線程同步的問題,把map換成int ,這個問題同樣存在。在go里是這樣。
2,下面這段代碼輸出的值為:
func (){
jsonStr:=[]byte(`{"age":1}`)
var value map[string]interface{}
json.Unmarshal(jsonStr,&value)
age:=value["age"]
fmt.Println(reflect.TypeOf(age))
//float64
}
3,下邊代碼是否有問題,問題在哪里
import (
"sync"
"fmt"
)
type UserAges struct {
ages map[string] int
sync.Mutex
}
func (u *UserAges)Add(name string,age int) {
u.Lock()
defer u.Unlock()
u.ages[name] = age
}
func (u *UserAges)Get(name string)int{
if age,ok:=u.ages[name];ok{
return age
}
return -1
}
問題在於,ages沒有暴露背外部的包,導致調用者無法初始化ages。然后在調用add函數時,就會報錯。考察函數的作用域問題。
4,下邊代碼的輸出結果是什么?
func TestArrayAndSlice(){
s1:=[]int{1,2,3}
s2:=s1[1:]
for i:=range s2{
s2[i]+=10
}
fmt.Println(s2)
s2=append(s2, 4)
for i:=range s2{
s2[i]+=10
}
fmt.Println(s2)
}
輸出結果如下:這個是在考察數組和切片用s2截取s1的下邊為1及之后;而后執行操作。
[12 13]
[22 23 14]
5,下邊代碼輸出什么
func TestDoit(){
doit:= func(arg int) interface{}{
var result *struct{}=nil
if (arg>0) {
result = &struct{}{}
}
return result
}
//輸出結果。
//-1:result: <nil> 為空的匿名結構體
//1://result: &{} 匿名結構體的地址
if res:=doit(1);res!=nil{
fmt.Println("result:",res)
}
}
6,下邊代碼的輸出結果是什么
//放在main里邊
//指定只能用一個邏輯處理器,方便看調度順序。
runtime.GOMAXPROCS(1)
wg:=sync.WaitGroup{}
wg.Add(20)
for i:=0;i<10 ;i++ {
go func() {
fmt.Println("i",i)
wg.Done()
}()
}
for i:=0;i<10 ;i++ {
go func(i int) {
fmt.Println("j",i)
wg.Done()
}(i)
}
wg.Wait()
/*
j 9
i 10
i 10
i 10
i 10
i 10
i 10
i 10
i 10
i 10
i 10
j 0
j 1
j 2
j 3
j 4
j 5
j 6
j 7
j 8
*/
這個要注意,第一個for里沒有傳參數,第二個傳參數了。所以第一個for里啟動的goroutine用的i其實是主線程里的i;之所以都是10,(也有可能前面幾個<10);是因為調用i的時候,i在主線程內已經加到10了。而第二個for里的i是通過參數傳遞,所以會打印0~9;
至於為什么會先打印J,9;希望有大神來回答下。