1、引言
大家好哇,我是寅贝勒,最近有很多小伙伴都在经历实习、秋招的面试,相信有很多的小伙伴都会碰到面试的公司、部门用的编程语言和自己熟悉的不同,有很多朋友给我私信说现在有很多面试官都会问能不能接受转Go语言,问问我的建议,诶这不是巧了吗,这视频素材就来了,熟悉我的朋友都知道我今年毕业,校招去的字节,在快毕业的那段时间和入职这几周还没有接触业务,都在熟悉Go语言以及相关的框架。
那这期视频就想来分享一下我这个卡了咪转Go的感受。因为在学校做的项目包括暑期在阿里实习的时候都是用的Java,所以主观上会更多的以Java的角度去看待Go,同时我也会尽量说的通俗易懂,让刚刚接触编程的小伙伴们有一个大概的了解。
2、Go初体验
2.1 Go的起源
我先简单介绍一下Go语言的起源,Go 语言(Golang)起源 2007 年,是谷歌内部的项目,并于 2009 年正式对外发布,java我记得是1995年发布的。设计Go的初衷就是使它的编译速度媲美C或C++,语法简洁而且更加安全,原生支持并发。
① 中间这位是Rob Pike,Go 语言项目总负责人,贝尔实验室 Unix 团队成员,参与的项目包括 Plan 9,Inferno 操作系统和 Limbo 编程语言;
② 左边是RobertGriesemer,参与开发 JavaHotSpot 虚拟机
③ 右边这位是Ken Thompson,贝尔实验室 Unix 团队成员,C 语言、Unix 和 Plan 9 的创始人之一,与 Rob Pike 共同开发了 UTF-8 字符集规范
2.2 Go的学习体验
先说结果,整体感受下来还不错,毕竟Go的发展非常迅猛,尤其是新版本1.18还加入了泛型。写到这里的时候突然发现自己真的好幸运,在学校学Java的时候有了springboot
全家桶,做项目不用饱受JSP的摧残;Go经过很多次迭代更新以及一些gin
、gorm
的易用框架加持,也内置了包管理工具mod
,不用写令人恶心的代码和配置。我觉得框架成熟这点对于刚接触一门语言来说是十分友好的,可以自己直接上手写一些小项目来练手,接下来从几点谈谈感受,先分享一些直观感受。
1、规范性
规范大于约定,就是说如果我不跟你约定,你必须这套规范来,如果不按照规范来编译都过不了。
- 比如导的包以及定义的变量,如果没有使用就会报错,不能容纳多余的语句。
- 还有命名规范,定义的变量能否被外部引用,Java中是通过关键字public或者private来决定,Go中是通过变量的大小写来区分
- Go上不允许函数重载,必须具有方法和函数的唯一名称。Java允许函数重载。
2、速度上,网上都是用阶乘来测试性能,自己在本机跑了一遍可以看到,单线程的情况下
另外,Go中还有一个比较厉害的特点在于原生支持高并发,并发场景下Go采用的是资源粒度更小的协程,自己也跑了几个小demo来测试性能,发现Go的性能比Java没有非常显著的增强,我就在网上寻求答案,最终找到了这句话:
Go性能的高低和程序员的编程能力有关
package main
import (
"fmt"
"math/big"
"strconv"
"time"
)
func main(){
allInputs := [5]int64{10000, 50000, 100000, 500000, 1000000}
var i int = 1
for i=0;i<len(allInputs);i++ {
var before = GetTimeStamp()
var factorial *big.Int = big.NewInt(1)
var j int64 = 1
for j=1; j<=allInputs[i]; j++ {
factorial = factorial.Mul(factorial,big.NewInt(j))
}
var after = GetTimeStamp()
var elapsedTime = after - before
gap,_ := strconv.ParseFloat(fmt.Sprintf("%.2f", float64(elapsedTime)/float64(1000)), 64)
fmt.Printf("%v 阶乘用的时间为%v秒\n",allInputs[i],gap)
}
}
func GetTimeStamp() int64 {
// 获取毫秒时间戳
return time.Now().UnixNano() / int64(time.Millisecond)
}
import java.math.BigDecimal;
import java.math.BigInteger;
class TestDemo {
public static void main(String []args) {
int[] allInputs = new int[]{10000, 50000, 100000, 500000, 1000000};
for (int i = 0; i < allInputs.length; i++) {
BigInteger number = BigInteger.valueOf(allInputs[i]);
BigInteger result = BigInteger.valueOf(1);
long before = System.currentTimeMillis();
for (int j = 1; j <= allInputs[i]; j++) {
result = result.multiply(BigInteger.valueOf(j));
}
long after = System.currentTimeMillis();
System.out.println(allInputs[i] + "阶乘所花费的时间" +
new BigDecimal((float)(after - before)/1000).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue()+"秒");
}
}}
3、面向对象
我尽量分享的清楚一些,这里和Java区别比较大,面向对象的三大基本特性:封装
、继承
、多态
。
需要明确的一点是,Go不是面向对象语言,但是不妨碍它拥有面向对象的特性。
- 首先是封装,Go没有类的概念,采用结构体的方式封装,且结构体中只有属性,方法和结构体是分开的,可以看到方法是绑定在结构体上,Go中很少有引用,一般都是指针。可能作者是想给结构体的使用者更多的灵活性。也就是说即使你不是结构体的作者,你也可以自由的为它加上新的“成员方法”。
- 继承,在Java中我们已经用习惯的继承方式在Go中是没有的,Go中继承他是通过组合的方式来实现的,让一个结构体A包含一个结构体B,从而实现A去继承B的特性。
- 多态通常的说就是,使用父类对象的地方都可以使用子类的对象,简单来说,多态意味着父类型的变量可以引用子类型的对象。举个例子,水果分为很多种,橘子、香蕉,现在我要一个水果(不指明要哪种水果),给我个橘子或者香蕉都是ok的,这个就是父类型的变量可以引用子类型的对象。Java默认允许多态,而Go却没有,Go中的多态是通过
接口
实现的。
package main
import "fmt"
type Code interface {
introduce()
}
type Java struct {
name string
}
func (javaTest Java) introduce() {
fmt.Println("this is java")
}
type Go struct {
name string
}
func (goTest Go) introduce() {
fmt.Println("this is go")
}
func introduce(code Code) {
code.introduce()
}
func main() {
introduce(&Java{})
introduce(&Go{})
}
可以看到当我们给系统添加一个功能的时候,不是通过修改代码,而是通过增添代码来完成,那么就是开闭原则
的核心思想了。Go中通过interface来提供一层抽象的接口,从而实现高内聚,低耦合。
3、视频计划:
我发现其实有很多小伙伴都对Go语言比较感兴趣,但是迫于工作或者学业的压力暂时还用不到Go语言,想要了解却被几十个小时的教程视频劝退,而且Go语言目前处于高速发展的阶段,变得比较快,许多视频中讲的语法已经不那么适用了。
所以我打算把Go分成初级、高级、实战三部分,以Java转过来的视角在自己学习的过程中去做一系列的分享视频,每次更新都会把视频放在对应的博客上,内容尽量精简易懂,靠视频可以完成入门,难点部分补充文档链接保证大家在有精力的前提下能够深入了解,视频不会变但文档可以更新,有任何修改的地方我会及时更新博客。
博客上有我为大家准备的见面礼(学习资料以及学习工具),大家自取就好,资料的更新和动态我也会第一时间发在公众号上,公众号上也有给大家准备大厂的内推链接,感兴趣的小伙伴可以顺手关注一下。
另外我在公司所在的团队,每周都有跬步计划,就是讲一些大家经常使用但是挖的比较深的技术栈,比如上期讲的是mysql,其中的索引、buffer、集群等部分大家都有深耕的去讲。之后我也会挑一些精彩的部分同样以博客+视频的方式分享给大家,希望小伙伴们可以关注一下,方便后续及时推送给大家。
大家想看什么题材视频可以在视频下方留言互动哦,每期视频的博客链接我都会放在简介中,方便大家去查看。
4、回答问题:
那对于大家该如何看待Go语言呢,我有一个小小的看法,那就是“拒绝吃老技术的本,要时刻学习新技术保持自己”,不管你目前正在用的是什么技术栈,有机会多学一点总是没错的。把Go当作自己的第二编程语言我觉得是个十分利好的决定。
但是如果你是一个正在找工作的校招生,我建议以Java或者C++为主,为什么呢,因为现在的情况是Go的岗位普遍在大厂,大厂的应用场景多且有资本去试错,小厂还是以稳定的运行下去为目标,况且即使你面试Go的岗位也是可以面Java或者C++的知识点的,Go语言可以当作你的一个加分项。大厂招收应届生一般不挑技术栈,只要深入一个,并且拥有良好的基础知识和思维,进来再培养就可以了。
好了,以上就是本期视频的全部内容了,如果你喜欢本期视频的话,记得一键三连加关注哦