go语言中,结构体是值类型,函数传参是通过拷贝,那为啥在unmarshal等函数中要结构体字段大写?

Python010

go语言中,结构体是值类型,函数传参是通过拷贝,那为啥在unmarshal等函数中要结构体字段大写?,第1张

在 Go 语言中,结构体是一种值类型,当传递结构体参数时,会进行值拷贝。如果结构体字段是小写的,它们在外部是不可见的,不能被读取或者访问,因此我们必须对字段进行大写。

在 unmarshal 函数中,读取的是 JSON 或者 XML 等格式的数据,需要映射到结构体字段中。如果字段为大写,它们就可以被外部的 unmarshal 函数读取,否则无法访问这些字段。因此,将结构体字段大写变成了一种规范,以保证结构体字段可以被 unmarshal 函数读取。

想进大厂,但不知道该如何入手,不妨从先过八股文的题量开始,比如先过个50题,然后一边面,一边学,进大厂就只不过是时间问题了,加油打工人!

本篇一共10题,大概花20分钟阅读。

1.golang的switch语句有什么特点?

switch关键字是通过对比key和case后面的value来选择需要执行的语句,与其他语言比如php和java不同的是,golang的switch默认不会去执行下一个case的语句,除非你显示的添加了一行fallthough关键字。

2.golang的select当有多个goroutine准备就绪,它是如何选择的?

select语句是用来处理与channel IO相关的逻辑,当有多个channel准备就绪的时候,其是伪随机选择一个goroutine来接收,然后执行相关的语句块。

Note: select关键字常用于和goroutine超时相关的逻辑设计。

3.golang什么时候会panic?

这里总结了8种,应付面试官应该是够了

4.子协程出现panic能在父协程使用recover()捕获吗?

不能,只能在子协程内部使用recover()捕获panic,协程只能捕获自己的panic。

5.什么样的panic不可恢复

6.defer函数的执行顺序是怎么样的?

7.unsafe.Pointer和uintptr是用来干什么的呢?

在golang中,为了安全性,是不允许指针像C++那样进行类型转换以及计算的,但是有些场景又必须要这么做怎么办呢?于是出现了unsafe.Pointer用于指针类型转换,比如*int64可以转换为*int64,出现了uintptr用于指针运算。

对于unsafe.Point有以下几点性质:

uintptr官方的定义是

其是用来做指针运算的

Note:

第三行的目的是为了获取age属性,age属性在stuct中处于第二列,首先是把student转换成unsafe.Point,获取指向student的指针,然后再转换成uintptr进行指针运算,然后通过unsafe.offset获取student.age相对于student的偏移量加上student的起始地址就能获得student.age的起始地址,然后转换成*int类型,就可以读取age属性了。

8.常用unsafe.Point和uintptr做什么呢,这么做有什么好处呢?

unsafe.Point常用于操作结构体的私有变量,以及类型转换。

好处就是golang中只有unsafe.Point能做到这个事,其他方法都做不到,反射的底层也是用unsafe.Point做的。

9.unsafe.Point和unintptr有什么坑呢?

千万要小心,不要为uintptr起一个中间变量 ,例如这样:

这是因为当发生gc的时候,可能会修改变量的内存地址,同时也会修改指向该变量的指针指向新的地址。但是uintptr是一个整数,其不是一个指针,因此在gc修改变量的时候,可不会修改它的值,他还指向原来的地址,然后转化成unsafe.Point进行操作,当然会报错。

10. string转byte的零拷贝技术

string在golang中的的存储结构为:

我们可以定义一个一样的结构体,然后用unsafe.Point把其转化成我们定义结构体,这样就可以把其私有属性,映射成共有属性了。

这个结构体golang已经帮我们定义好了,如下:

同理,slice的存储结构可以映射成,如下结构体,golang也已经帮我们定义好了

接来下就是具体的代码:

其实就是修改了一下byte切片data所指向的地址空间以及len就行了。

参考资料:

https://zhuanlan.zhihu.com/p/240856451 unsafe.Point

每日一词11:go unnoticed

1.认识这个词(基础篇)

词:go unnoticed

英英释义:not to be noticed

例句:Hard work hardly goes unnoticed.

2.体会这个词 (进阶篇)

“go unnoticed”的意思是“被忽略” “未被注意”,是一个学习者可能会觉得有点“别扭”的地道常见表达。比如,你一直勤勤恳恳、踏踏实实的做事,别人是不可能注意不到的,这时我们就可以说:

Hard word hardly goes unnoticed.

你可能已经注意到了,“go unnoticed”前面常与 rarely/hardly 连用,用双重否定的形式加强表达效果。

英文中“go + un___ ”的表达还有很多,比如“go unrecognized”(没有人承认/认可)和“go unreported”(没有被报道)。我们在阅读时要留意这种形式的表达,并且在口语和写作中找机会把它们用出来。

比如,想表达“很多食物被浪费掉了”,我们可能一下子会想到说:

Much food goes wasted.

我们套用“go + un__”格式,也可以说成:

Much food goes unconsumed.

相比“goes wasted”,“goes unconsumed”同样地道,但更为少见。掌握了 go+un__ 不仅可以完美替换同义表达,增强表达的多样性,在写作中还能让考官眼前一亮,或者让外国朋友印象深刻。

3.从认识到会用(作业)

1)翻译下面的句子:

人们不会对善良视而不见。

参考翻译:Kindness hardly goes unnoticed.

2)你还见到过哪些“go + un___”的表达?结合自己的生活、学习、工作、兴趣等,先想象在什么语境下会用到这个表达,然后再进行造句。

场景:不会对这样的一个错误视而不见。

造句:Such a mistake hardly goes unnoticed.

总结:

go unnoticed      被忽略,未被注意

rarely/hardly+go unnoticed

        (双重否定加强语气)

类似结构:go unrecognized,

                go unreported

Much food goes wasted    等同于

Much food goes unconsumed

记:格式  go+un______

背:

    1. Hard work hardly goes unnoticed.

    2. Much food goes unconsumed

    3. Kindness hardly goes unnoticed.