0 说说自己的心理路程

大一通过读C Primer Plus,考取了c语言计算机二级证书,便以为了解了不少。后面便只顾学习大学课程,还恰巧没有重视408四大计算机基础课程,仅仅是数据结构学的多一些,且学习数据结构用的是c语言,所以难免再花时间用Go语言来学习一遍。仅仅了解了Java的Spring Boot和MySql的一些简单命令语句,便觉得很不错了,到头来现实才给我当头一棒,告诉我山外有山,但我相信,没有来不及,只有抓住当下,一步一脚印,才能更好的发展自己。

现在学习了Go语言,正在看一些Go语言的书籍,参加了几次面试,是让我有了更清醒和更通透的目标,世上无难事,我需要继续努力。

引用毛主席的诗句:踏遍青山人未老,风景这边独好。

1 go与其他语言

1 面向对象语言

面向对象语言:object-oriented programming,是一种基于对象概念的编程范式。把一切客观存在的事物视为对象。对象是通过数据和数据的操作方法组合在一起,并且相互依赖。

对象可以访问并修改自己的字段

对象利用属性和方法的私有、公共可见性,对象的内部状态受保护,不受外界影响,被封装的。

面向对象三大特点:

  • 封装:封装是指将数据(属性)和数据的操作方法(行为)绑定在一起,形成一个独立的单元(即类)。
  • 继承:继承允许创建一个新类(子类)从现有类(父类)派生。子类继承了父类的所有属性和方法
  • 多态:多态允许不同类的对象对同一消息做出响应。面向对象中的 “多态” 指的同一个行为具有多种不同表现形式或形态的能力,具体是指一个类实例(对象)的相同方法在不同情形有不同表现形式。
    多态也使得不同内部结构的对象可以共享相同的外部接口,也就是都是一套外部模板,内部实际是什么,只要符合规格就可以。

2 go与java的区别

java通过线程来实现并发(线程映射到内核),而go通过goroutine和channel处理并发。所以go有了轻量级的并发模型,更容易扩展到多个cpu核心,而java是多线程并发,所以没有足够的可扩展性。

两者都具备垃圾回收机制。

go的继承是通过组合来实现的,基类以Struct的方式定义,子类只需要把基类作为成员放在子类的定义中,支持多继承;而Java的继承通过extends关键字完成,不支持多继承。

go路由配置采用的是http协议。

3 go是面向对象语言吗

不是传统意义上的面向对象语言,但它确实支持一些面向对象编程(OOP)的特性。Go 没有类的概念,也没有传统的继承机制。

多态

  • 定义:通过接口实现多态性,允许不同类型的对象通过相同的接口进行交互。

嵌入(Embedding)

  • 定义:可以通过嵌入其他结构体或接口来实现组合,这在某种程度上类似于继承

Go 通过大写首字母来控制访问权限(大写表示公开,小写表示私有),而不是通过 publicprivate 等关键字。

Go可以直接选择是否有返回值,无需采用void来表现只有一个空返回。

2 基础

1 为什么选择golang

go语言简洁,规范严格明了,但又是自由高效的,go语言兼备了快速的开发效率和运行效率,实现了组合的思想,支持当前所有的编程范式。Go拥有强大的编译检查、严格的编码规范和完整的软件生命周期工具,具有很强的稳定性,稳定压倒一切。那么为什么Go相比于其他程序会更稳定呢?这是因为Go提供了软件生命周期(开发、测试、部署、维护等等)的各个环节的工具,如go tool、gofmt、go test。

go语言的goroutine协程和channel管道能够更高效的处理并发。

go由google开发

强大的标准库-生态

部署方便,源码编译成执行文件后,可以直接运行,减少了对其它插件依赖。不像其它语言,执行文件依赖各种插件,各种库,研发机器运行正常,部署到生产环境,死活跑不起来 。****

2 golang 中 make 和 new 的区别?(基本必问)

都是用来分配内存的

make是用于创建slice切片、map映射、channel管道等引用类型,make会初始化,如分配切片底层数组并设置长度和容量,map底层的哈希结构,可能设置channel的缓冲区大小,返回的是初始化的非零值的一个实例。

new是用于分配值类型的内存,比如string、in,返回的是分配零值(nil)的指针,仅仅是一个内存地址。

扩展:若是new一个slice,此时长度和容量都是0,而data需要通过append的方式赋值。

3 for range 的时候它的地址会发生变化么?

答:在 for a,b := range c 遍历中, a 和 b 在内存中只会存在一份,即之后每次循环时遍历到的数据都是以值覆盖的方式赋给 a 和 b,a,b 的内存地址始终不变。由于有这个特性,for 循环里面如果开协程,不要直接把 a 或者 b 的地址传给协程。解决办法:在每次循环时,创建一个临时变量。

4 go defer,多个 defer 的顺序,defer 在什么时机会修改返回值?

作用:defer延迟函数,释放资源,收尾工作;如释放锁,关闭文件,关闭链接;捕获panic;
避坑指南:defer函数紧跟在资源打开后面,否则defer可能得不到执行,导致内存泄露。
多个 defer 调用顺序是 LIFO(后入先出),defer后的操作可以理解为压入栈中
defer,return,return value(函数返回值) 执行顺序:首先return,其次return value,最后defer。defer可以修改函数最终返回值,修改时机:有名返回值或者函数返回指针

5 uint 类型溢出问题