面试官:可以接受转Go吗?

Hey,我是寅贝勒,后端开发一枚😜,欢迎来我的个人网站 www.ly-zone.cloud 一起学习交流~

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经过很多次迭代更新以及一些gingorm的易用框架加持,也内置了包管理工具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语言可以当作你的一个加分项。大厂招收应届生一般不挑技术栈,只要深入一个,并且拥有良好的基础知识和思维,进来再培养就可以了。

好了,以上就是本期视频的全部内容了,如果你喜欢本期视频的话,记得一键三连加关注哦
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寅贝勒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值