华为GO一面


写在前面

今天参加了华为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不会修改intSlice1intSlice2 = append(intSlice2, 4)的时候将底层数组大小从3扩容成了6,所以intSlice1intSlice2底层数组不一样。

这个题目其实很简单,考察的也是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

总结

总体感觉很简单,估计评级不会很高。加油,继续准备二面。

参考

[1]测试驱动开发实践 - Test-Driven Development


文章作者: Alex
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alex !
  目录