zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    重拾node第一天
    layui采坑记录 (上卷)QUQ
    解决IOS固定定位 fixed的不兼容
    layui 启用禁用切换详解
    jq form表单渲染单选框内容渲染
    vue 工具函数的封装 时间格式化函数
    CSS常见的继承属性
    git简单使用指南
    常用git命令大全
    react项目使用antd
  • 原文地址:https://www.cnblogs.com/mingbai/p/go-golangCodingTest.html
Copyright © 2011-2022 走看看