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

161 篇文章 12 订阅

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

1、有缓冲和无缓冲channel的区别?

无缓冲:当向channel中存值后,需其它goroutine取值,否则一直阻塞。

有缓冲:不会阻塞,如缓冲为1,只有当放第2个值时,第1个还没被取走才会阻塞。

2、函数返回局部变量的指针是否安全?

函数返回指针不能指向函数内的局部变量,如需返回函数局部变量,需将该变量声明为静态变量。

3、格式化打印时%v 和 %+v 的区别?

`%v` 和 `%+v` 都可以用来打印 struct 的值,区别在于 `%v` 仅打印各个字段的值,`%+v` 还会打印各个字段的名称。

4、如何判断两slice是否相等?

当两个slice的数据类型、长度相同,且下标值也是相等的,那这两个slice就是相等的,Go根据slice不同的数据类型有三种方式实现。

两slice全是[]byte类型,使用Go标准库bytes的Equal来验证。

如果在判断两个slice数据类型都不是[]byte的时候,就可以使用用Go标准库reflect的reflect.DeepEqual,其用于深度比较两个对象包括内部包含的元素是否都相等。

Go使用reflect通常需付出性能代价,如果已确定slice数据类型,即可手动实现slice的相等判断,案例如下:

func testEq(a, b []int) bool {
    // If one is nil, the other must also be nil.
    if (a == nil) != (b == nil) {
        return false;
    }
 
    if len(a) != len(b) {
        return false
    }
 
    for i := range a {
        if a[i] != b[i] {
            return false
        }
    }
 
    return true
}

5、结构体Tag的用处?

可通过Tag来增强结构体的定义,带上一些meta信息。

6、如何交换两个变量的值?

Go提供多重赋值的特性可轻松实现变量的交换,如下:

var a = 1
var b = 2
a,b = b,a 

7、如何表示枚举值(enums)?

通常使用常量(const) 来表示枚举值,如下:

type StuType int32

const (
  Type1 StuType = iota
  Type2
  Type3
  Type4
)

func main() {
  fmt.Println(Type1, Type2, Type3, Type4) // 0, 1, 2, 3
}

8、是否支持默认参数或可选参数?

Go不支持可选参数,也不支持方法重载,可用变长参数(通俗来说也就是...)的特性来模拟默认参数。

9、rune类型?

int32的别名,几乎在所有方面等同于int32,用来区分字符值和整数值,处理unicode或utf-8字符。

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

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

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

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

  • 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、付费专栏及课程。

余额充值