Go面试看这里了~(十五)

161 篇文章 12 订阅

原文地址:Go面试看这里了~(十五)

1、map什么类型不能作为键?

Go map的key可以是很多种类型,如 bool、数字、string、指针、channel , 还有只包含前面几个类型的interface、types、structs、arrays,但slice、map、function就不行,因为这几个类型不能用==来判断,来看下面这个例子感受下:

type Key struct {
      Path, Country string
}

hits := make(map[Key]int)

很明显两个struct完全相等, 意味着里面的所有变量的值都完全相等。

2、实现一个单例模式?

单例模式:单例对象的类必须保证只有一个实例存在,全局有唯一接口访问。

单例模式的分类:

  1. 懒汉方式:指全局的单例实例在第一次被使用时构建。

  2. 饿汉方式:指全局的单例实例在类装载时构建。

懒汉方式的缺点就是非线程安全,当正在创建时,有线程来访问,此时ins = nil就会再创建,单例类就会有多个实例,代码实现如下:

type singleton struct{}
var ins *singleton

func GetIns() *singleton{
    if ins == nil {
      ins = &singleton{}
    }

    return ins
}

饿汉方式的缺点就是,如果singleton创建初始化比较复杂耗时时,加载时间会延长,代码实现如下:

type singleton struct{}
var ins *singleton = &singleton{}
func GetIns() *singleton{
    return ins
}

懒汉加锁的缺点就是虽然解决并发的问题,但每次加锁是要付出代价的,代码如下:

type singleton struct{}

var ins *singleton
var mu sync.Mutex

func GetIns() *singleton {
  mu.Lock()
  defer mu.Unlock()

  if ins == nil {
    ins = &singleton{}
  }

  return ins
}

使用双重锁的方式就可避免了每次加锁,提高代码效率,代码实现如下:

type singleton struct{}

var ins *singleton
var mu sync.Mutex

func GetIns() *singleton {
  if ins == nil {
    mu.Lock()
    defer mu.Unlock()

    if ins == nil {
      ins = &singleton{}
    }
  }

  return ins
}

最好就是使用sync.Once,代码实现如下:

type singleton struct{}

var ins *singleton
var once sync.Once

func GetIns() *singleton {
  once.Do(func() {
    ins = &singleton{}
  })

  return ins
}

3、局部变量分配在栈上还是堆上?

Go编译器会自动决定把一个变量放在栈还是放在堆,会做逃逸分析(escape analysis),当发现变量的作用域没有跑出函数范围,就可以在栈上,反之则必须分配在堆,如此可释放关于内存的使用限制,更多的关注于程序功能逻辑本身。

C/C++的逻辑非常清楚,声明的局部变量分配在栈,通过动态申请(malloc、new)的内存在堆里。

至此,本次分享就结束了,后期会慢慢补充。

以上仅为个人观点,不一定准确,能帮到各位那是最好的。

好啦,到这里本文就结束了,喜欢的话就来个三连击吧。

扫码关注公众号,获取更多优质内容。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

luyaran

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

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

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

打赏作者

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

抵扣说明:

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

余额充值