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

转载于:https://www.cnblogs.com/mingbai/p/go-golangCodingTest.html

要解析JSON文件,可以使用json-c库,具体步骤如下: 1. 引入json-c库的头文件 ```c #include <json-c/json.h> ``` 2. 读取JSON文件内容 ```c FILE *fp = fopen("filename.json", "r"); if (fp == NULL) { printf("Failed to open file\n"); return -1; } char buffer[1024]; fread(buffer, 1, 1024, fp); fclose(fp); ``` 3. 解析JSON文件内容 ```c struct json_object *json_obj = json_tokener_parse(buffer); ``` 4. 获取JSON对象的值 ```c // 获取字符串类型的值 const char *str_value; json_object_object_get_ex(json_obj, "key", &str_value); printf("%s\n", str_value); // 获取整数类型的值 int int_value; json_object_object_get_ex(json_obj, "key", &int_value); printf("%d\n", int_value); // 获取数组类型的值 struct json_object *arr_obj; json_object_object_get_ex(json_obj, "key", &arr_obj); int arr_len = json_object_array_length(arr_obj); for (int i = 0; i < arr_len; i++) { struct json_object *item = json_object_array_get_idx(arr_obj, i); // 处理数组项 } ``` 完整的示例代码如下: ```c #include <stdio.h> #include <json-c/json.h> int main() { FILE *fp = fopen("example.json", "r"); if (fp == NULL) { printf("Failed to open file\n"); return -1; } char buffer[1024]; fread(buffer, 1, 1024, fp); fclose(fp); struct json_object *json_obj = json_tokener_parse(buffer); const char *str_value; json_object_object_get_ex(json_obj, "name", &str_value); printf("name: %s\n", str_value); int age_value; json_object_object_get_ex(json_obj, "age", &age_value); printf("age: %d\n", age_value); struct json_object *hobby_arr_obj; json_object_object_get_ex(json_obj, "hobbies", &hobby_arr_obj); int hobby_arr_len = json_object_array_length(hobby_arr_obj); printf("hobbies:\n"); for (int i = 0; i < hobby_arr_len; i++) { struct json_object *item = json_object_array_get_idx(hobby_arr_obj, i); printf("- %s\n", json_object_get_string(item)); } json_object_put(json_obj); return 0; } ``` 需要注意的是,使用完json对象后,需要调用`json_object_put`函数释放内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值