一天面试三家公司-Java和Go语言,收获很大

  • 今天面试了三家公司,有一家直接给出了意向,分享一下在面试过程中出现的问题

1.Go语言相关的

1.1 选择题(可能存在多个选项正确):

  • 1.定义一个包内全局字符串变量,下面语法正确的是 ( AD )
    A. var str string
    B. str := “”
    C. str = “”
    D. var str = “”
  • 2.通过指针变量 p 访问其成员变量 name,下面语法正确的是( AB )
    A. p.name
    B. (*p).name
    C. (&p).name
    D. p->name
  • 3.关于init函数,下面说法正确的是( AB )
    A. 一个包中,可以包含多个init函数
    B. 程序编译时,先执行导入包的init函数,再执行本包内的init函数
    C. main包中,不能有init函数
    D. init函数可以被其他函数调用
  • 4.golang中没有隐藏的this指针,这句话的含义是( ACD )
    A. 方法施加的对象显式传递,没有被隐藏起来
    B. golang沿袭了传统面向对象编程中的诸多概念,比如继承、虚函数和构造函数
    C. golang的面向对象表达更直观,对于面向过程只是换了一种语法形式来表达
    D. 方法施加的对象不需要非得是指针,也不用非得叫this
  • 5.golang中的指针运算包括( BC )
    A. 可以对指针进行自增或自减运算
    B. 可以通过“&”取指针的地址
    C. 可以通过“*”取指针指向的数据
    D. 可以对指针进行下标运算
  • 6.关于main函数(可执行程序的执行起点),下面说法正确的是( ABCD )
    A. main函数不能带参数
    B. main函数不能定义返回值
    C. main函数所在的包必须为main包
    D. main函数中可以使用flag包来获取和解析命令行参数
  • 7.关于整型切片的初始化,下面正确的是( BCD )
    A. s := make([]int) // 不满足条件,必须什么切片的长度,不是nil切片,也不是空切片
    B. s := make([]int, 0)
    C. s := make([]int, 5, 10)
    D. s := []int{1, 2, 3, 4, 5}
  • 8.关于函数声明,下面语法错误的是( CD )
    A. func f(a, b int) (value int, err error)
    B. func f(a int, b int) (value int, err error)
    C. func f(a, b int) (value int, error)
    D. func f(a int, b int) (int, int, error)
  • 9.关于接口,下面说法正确的是( B )
    A. 只要两个接口拥有相同的方法列表(次序不同不要紧),那么它们就是等价的,可以相互赋值
    B. 如果接口A的方法列表是接口B的方法列表的子集,那么接口B可以赋值给接口A
    C. 接口查询是否成功,要在运行期才能够确定
    D. 接口赋值是否可行,要在运行期才能够确定
  • 10.关于channel,下面语法正确的是( ABCD )
    A. var ch chan int
    B. ch := make(chan int)
    C. <- ch
    D. ch <-

1.2判断题:

  • 1.给一个 nil channel 发送数据,造成永远阻塞 T
  • 2.从一个 nil channel 接收数据,造成永远阻塞 T
  • 3.给一个已经关闭的 channel 发送数据,引起 panic T
  • 4.从一个已经关闭的 channel 接收数据,如果缓冲区中为空,则返回一个零值 T
  • 5.一个类只需要实现了接口要求的所有函数,我们就说这个类实现了该接口 T
  • 6.一个类实现接口时,需要导入接口所在的包 F
  • 7.接口由使用方按自身需求来定义,使用方无需关心是否有其他模块定义过类似的接口 T
  • 8.同级文件的包名不允许有多个 T
  • 9.interface{}是可以指向任意对象的Any类型 T
  • 10.内置函数delete可以删除数组切片内的元素 T

1.3 程序输出题:

  • 1.请写出以下代码具体输出内容:
    package main
    import (
    “fmt”
    )
    func main() {
    defer_call()
    }
    func defer_call() {
    defer func() { fmt.Println(“A”) }()
    defer func() { fmt.Println(“B”) }()
    defer func() { fmt.Println(“C”) }()
    panic(“触发异常”)
    }
    答案:
    C
    B
    A
  • 2.请写出以下代码具体输出内容:
    func main() {
    s := make([]int, 5)
    s = append(s, 1, 2, 3)
    fmt.Println(s)
    }
    答案:
    [1,2,3]
  • 3.请写出以下代码具体输出内容:
    type Slice []int
    func NewSlice() Slice {
    return make(Slice, 0)
    }
    func (s* Slice) Add(elem int) *Slice {
    *s = append(*s, elem)
    fmt.Print(elem)
    return s
    }
    func main() {
    s := NewSlice()
    defer s.Add(1).Add(2)
    s.Add(3)
    }
    答案:
    3
    1
    2

1.4 问答题:

  • 1.请写出你了解的Golang中常用的性能分析方法
    答:分析中间代码文件,查看具体的优化过程
  • 2.请描述golang中的协程,并说明和操作系统的进程、线程区别
    答:进程是资源的控制单位,线程是调度的基本单位,进程是堆栈资源独占的,而线程是堆共享而栈独占的,进程之间进行切换的开销较大,线程之间进行切换的开销中等。而协程的占用内存更小,是线程的千分之一,根据GMP进行调度,一个内核线程对应一组协程,协陈高的并发度更高,切换的开销更加小。
  • 3.golang中的引用类型包含哪些
    答:map、slice、chan、interface{}
  • 4.请描述golang的select机制
    答:slect机制是一种IO多路复用的机制,在golang中,select配合chan进行使用,监听多个chan上面的事件,没有事件的时候会进行阻塞,当事件来的时候会进行相应的触发。
  • 5.golang的channel特性主要有哪些?
    答:是引用型的数据类型,分为带缓存的chan和不带缓存的chan,带缓存的是非同步的,不带缓存的是同步的。chan是go协程进行消息传递的利器。
  • 6.golang中的锁有哪些?并简单说明下
    答:有syn.mutex锁,还有读写锁,读锁可以支持多协程进行进行读,写锁是独占锁,只有当前占用的协程可以进行操作。
  • 7.请说明下异步和非阻塞的区别
    答:异步:一般会存在一个回调的过程,比如在一个流程中,将一些耗时的业务异步剥离出去,整体业务进行向下执行,等到异步处理完成回调之后继续执行,可以进一步做到流量消峰。
    非阻塞:是当执行到一个点的时候会继续运行下去,比如带缓存的chan,当添加一个值的时候,可以继续添加,当chan满的时候,会进行阻塞,停止到当前点。
  • 8.请说明cookie和session的区别
    答:cookie和session一般用来服务器和客户端保存会话标志用的,session存在服务器端,用于表示每一个用户,新的用户进行访问服务器的时候,为其标志一个sessionId,并写入到response中的cookie中,客户端的浏览器会默认保存从后端传输过来的cookie并进行保存,下次客户端进行访问的时候带上cookie,服务器就能标识出诗哪个用户,以及用户相关的一些权限等。

1.5 编程题

  • 1.请定义一个单链表,并用golang实现该单链表反转
    输入:A->B->C
    输出:C->B->A
package main

import "fmt"

// 单链表的结构
type list struct {
	Value string
	Next *list
}
func main() {
	// 第一题
	// 1.初始化一个单链表
	list1 := new (list)
	list2 := new (list)
	list3 := new (list)
	list1.Value = "A"
	list2.Value = "B"
	list3.Value = "C"
	list1.Next=list2
	list2.Next=list3
	list3.Next =nil
	// 2.反转操作,采用头插法进行反转
	head := new (list)
	head.Next = nil
	tail  := head
	for(list1!=nil){
		tep:= list1
		list1 = list1.Next
		tep.Next=head.Next
		head.Next=tep
		tail=tep
	}
	list1 = head.Next
	for(list1!=nil){
		fmt.Println(list1.Value)
		list1 = list1.Next
	}
	fmt.Println(tail)
}
  • 2.查找字符串中的第一个唯一字符
    给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1 。 案例:
    s = “leetcode” 返回 0.
    s = “loveleetcode”, 返回 2.
    注意事项: 您可以假定该字符串只包含小写字母。
package main

import "fmt"

func main() {
	// 第二题
	s := "leetcode"
	//用nums[]统计小写字符出现的次数
	nums :=  [26]int{}
	for i:=0 ;i< len(s) ; i++{
		nums[s[i]-97]++
	}
	var flag = true
	for i:=0 ; i<26 ;i++{
		if(nums[s[i]-97] == 1){
			flag = false
			fmt.Println(i)
			break
		}
	}
	if flag{
		fmt.Println(-1)
	}
}

2.Java语言相关的

  • 2.1 String、StringBuffer、StringBuilder的认识
  • 2.2 HashMap的认识
  • 2.3 volatile的认识
  • 2.4 线程池的参数设置
  • 2.5 SpringBoot常用的注解
  • 2.6 session和cookie的作用
  • 2.7 http报文的格式
  • 2.8 redis中的基本数据类型
  • 2.9 redis的在实际项目中的运用
  • 2.10 如何提升QPS
  • 2.11 进程和线程的区别
  • 2.12

3.总结

  • 先面在点,要拓宽自己的知识面,然后去进行补充自己的知识点。加油!!!
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿联爱学习

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

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

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

打赏作者

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

抵扣说明:

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

余额充值