写在前面
今天参加了华为go语言一面,在此记录一下,帮助自己复盘
基本信息
时间:2023.8.8 19:00-20:10
面试过程-第一部分
自我介绍
基本照着简历说了一遍自己的经历。
根据当前项目询问一些情况
- (1)项目介绍
- (2)项目中有没有用到锁?高并发有没有考虑?表结构是怎么设计的?有没有考虑分表?项目有多少代码量?你在项目中担任什么角色?
第一部分大概30分钟就结束了。一点go基础知识都没有问到。其实还是挺想面试官问到的,毕竟最近准备了一下。
面试过程-第二部分
看一段代码,思考输出是什么
func main() {
intSlice1 := []int{1, 2, 3}
intSlice2 := intSlice1[1:3]
intSlice1[1] = 0
intSlice2 = append(intSlice2, 4)
intSlice2[1] = 5
fmt.Println(intSlice1)
fmt.Println(intSlice2)
intSlice3 := append(intSlice2, 6)
intSlice3[1] = 7
fmt.Println(intSlice2)
fmt.Println(intSlice3)
}
结果:
[1 0 3]
[0 5 4]
[0 7 4]
[0 7 4 6]
我在fmt.Println(intSlice1)
这一行说错了,intSlice2[1] = 5
不会修改intSlice1
,intSlice2 = append(intSlice2, 4)
的时候将底层数组大小从3扩容成了6,所以intSlice1
和intSlice2
底层数组不一样。
这个题目其实很简单,考察的也是slice扩容。我居然答错了,不应该!
将一个字符串转换成整数
考察点:需求分析、异常情况
import (
"errors"
"fmt"
)
const (
Negative = '-'
MaxCount = 63
Flag = int64(10)
)
/*
功能:字符串转换成整数。带符号。30分钟
特殊情况:
1.空字符串
2.0开头的字符串
3.太长的字符串
4.一个负号
5.不支持的字符,只能是[0-9]
*/
func Atoi(s string) (int64, error) {
if len(s) == 0 {
return 0, errors.New("empty string")
}
if s[0] == Negative {
result, err := convertAtoi(s[1:])
if err != nil {
return 0, err
}
return int64(-1) * result, nil
}
return convertAtoi(s)
}
// 将字符串转换成整数,不带符号
func convertAtoi(s string) (int64, error) {
if len(s) == 0 {
return 0, errors.New("empty string")
}
if len(s) > MaxCount {
return 0, errors.New(fmt.Sprintf("string must less %d", MaxCount))
}
if len(s) > 1 && s[0] == '0' {
return 0, errors.New(fmt.Sprintf("can not begin with zero:%s", s))
}
result := int64(0)
for i := range s {
if !checkByte(s[i]) {
return 0, errors.New(fmt.Sprintf("not support char:%s", s))
}
result = int64(s[i]-'0') + Flag*result
}
return result, nil
}
func checkByte(b byte) bool {
return b >= '0' && b <= '9'
}
下面贴出我的测试代码
func main() {
testCases := []TestCase{
{
s: "12345",
want: 12345,
},
{
s: "-123",
want: -123,
},
{
s: "abc",
err: true,
},
{
s: "-",
err: true,
},
{
s: "12478473247823473247823489237489327423472389473242723493242389423984892432489244889",
want: 0,
err: true,
},
{
s: "00123",
err: true,
},
{
s: "123000",
want: 123000,
},
{
s: "12ab23",
err: true,
},
{
s: "123-",
err: true,
},
{
s: "0",
want: 0,
},
{
s: "00",
err: true,
},
{
s: "-0",
want: 0,
},
}
for i := range testCases {
begin := time.Now()
result, err := data20230808.Atoi(testCases[i].s)
//fmt.Printf("i:%v,time cost:%s\n", i, time.Since(begin))
fmt.Printf("i:%v,want:%d,result:%d,err:%v,time cost:%s\n", i, testCases[i].want, result, err, time.Since(begin))
}
}
type TestCase struct {
s string
want int
err bool
}
耗时大概20多分钟,共享屏幕。写完之后面试官说他一直在看着我写,就直接点评了。然后说代码挺好,异常情况考虑很仔细,并且用了测试驱动来测试代码,并且函数有注释。是他面试过的人中写的比较好的。
总结
不足之处:
- 项目整体结构、做的过程中亮点、难点都没有说好,感觉面试官想基于某个点深入问进去,但是没办法问。需要继续整理一下当前所做的项目,争取讲清楚。
- 基础知识其实还行,平时准备的也挺多。不应该答错,有点着急。
可取之处:
- 异常情况考虑全面。其实面试官出题目的时候也说了,这个题不难,主要考察需求分析能力和异常情况。于是我着重思考了各种异常情况。其实这里没有考虑最基本的带
+
的整数,比如+123
- 测试驱动。这里有一篇文章讲测试驱动的测试驱动开发实践 - Test-Driven Development
总结
总体感觉很简单,估计评级不会很高。加油,继续准备二面。