就是几个简单的笔试题目,也可能面试的时候直接给看让说结果。
1, 用不同的goroutine去操作map的时候会存在线程同步的问题,把map换成int ,这个问题同样存在。在go里是这样。
2,下面这段代码输出的值为:

 func t(){
    jsonStr:=[]byte(`{"age":1}`)
    var value map[string]interface{}
    json.Unmarshal(jsonStr,&value)
    age:=value["age"]
    fmt.Println(reflect.TypeOf(age))
    //float64
}

区别:

func t() {
	jsonStr := []byte(`{"age":1}`)
	var value map[string]int

	json.Unmarshal(jsonStr, &value)
	age := value["age"]
	fmt.Println(reflect.TypeOf(age))
	//int
}

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)
	}
}

output:

result: &{}

6,下边代码的输出结果是什么
//放在main里边
//指定只能用一个逻辑处理器,方便看调度顺序。

func t2(){
	
runtime.GOMAXPROCS(1)
wg:=sync.WaitGroup{}
wg.Add(20)
//step 1
for i:=0;i<10 ;i++  {
    go func() {
        fmt.Println("i",i)
        wg.Done()
    }()
}

fmt.Println("--------------------")

//step 2
for j:=0;j<10 ;j++  {
    go func(j int) {
        fmt.Println("j",j)
        wg.Done()
    }(j)
}
wg.Wait()
}

output:

--------------------
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;