go golang 笔试题 面试题 笔试 面试

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;希望有大神来回答下。

暂时先写这么多,回头再接着加。

转载注明出处--名白

http://www.cnblogs.com/mingbai/p/go-golangCodingTest.html