go语言(基础知识)

1. 基本数据的转换

  • Go在不同类型的变量之间赋值时需要显示转换,即golang中数据类型不能自动转换;
  • 被转换的是变量存储的数据(值),变量本身的数据类型没有变化;
  • 范围小向范围大转换时,按溢出处理,不会报错

2. 常见的引用类型与值类型

  • 值类型: int, float, bool, string, 数组, 结构体struct
  • 引用类型:指针、slice切片, map, 管道chan, interface

3. 标识符注意事项

  • 下划线"_" 本身是一个特殊的标识符,用于忽略某个返回值;
  • int, float系列不是系统保留关键字,可作为标识符,但不推荐;
  • 变量名、函数名、常量名首字母大写,则可以被其他的包访问,首字母小写,则只能在本包中使用;
  • 系统保留关键字有25个,预定标识符为36个。

4. 原码,反码及补码

  • 二进制的最高位是符号位,0表示正数,1表示负数;
  • 正数的原码,反码,补码都一样;
  • 负数的反码 = 它的原码符号位不变,其它位取反;
  • 负数的补码 = 它的反码 + 1;
  • 0的反码、补码都是0;
  • 在计算机运算的时候,都是以补码的方式来计算的。

5. 易漏运算符

  • 异或运算符^ 对应位不同结果为1,否则为0
  • 右移运算符>> 低位溢出,符号位不变,并用符号位补溢出的高位
  • 左移运算符<< 符号位不变,低位补0

6. break与continue区别

  • break用于终止某个语句块的执行,用于终端当前for循环或跳出switch语句
  • continue语句用于结束本次循环,继续执行下一循环

7. 函数的注意事项

  • go语言不支持函数重载(指函数名相同,但形参数目或类型不同)
  • 在go中,函数本身也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量了。通过该变量可以对函数调用
  • 函数既然是一种数据类型,因此在go中,函数可以作为形参,并且被调用

8. 关于init的面试题

  • 如果main.go和utils.go都含有变量定义,init函数时,执行的流程为
  • utils.go: 变量定义 - init函数 -
  • main.go: 变量定义 - init函数 - main函数

9.匿名函数:没有名字的函数

  • 如果某个函数只是希望使用一次,可以考虑使用匿名函数,匿名函数也可实现多次调用(将匿名函数赋给一个变量)

10.闭包:一个函数和其相关的引用环境组合的一个整体(实体)

var n int = 10
return func(x int) int{
       n = n + x
       return n
}
  • 如上代码块,返回的是一个匿名函数,但是这个匿名函数引用到函数外的n,因此这个匿名函数就和n形成一个整体,构成闭包
  • 说明:当我们反复的调用f函数时,因为n是初始化一次,因此每调用一次就进行累计,体现出闭包的优越性

11.defer

  • 当执行到defer时,会将defer后面的语句压入到独立的栈(defer栈),当函数执行完毕后,再从defer栈,按照先入后出的方式出栈,执行

12.字符串中常用的系统函数

  • 字符串转整数
n, err := strconv.Atoi("12")
  • 整数转字符串
str := strconv.Itoa("12")
  • 字符串转 []byte
var bytes = []byte("hello go")
  • []byte转字符串
str = string([]byte{97,98,99})
  • 10进制转2,8,16进制
str = strconv.FormatInt(123, 2) //2->8,16

*查找子串是否在指定的字符串中

strings.Contains ("seafood", "food") //true

*统计一个字符串有几个指定的子串

strings.Count ("ceheese", "e") //4

*不区分大小写的字符串比较(==是区分大小写的)

strings.EqualFold ("abc", "ABC") //true

*返回子串在字符串第一次出现的index值,如果没有返回-1

strings.Index("NLT_abc", "abc") //4

*返回子串在字符串最后一次出现的index值,如果没有返回-1

strings.LastIndex("go golang", "go") //3

*将指定的子串替换成另一个子串,n可以指定你希望替换几个,n=-1表示全部替换

strings.Replace("go golang", "go","go语言",n) //3

*按照指定的某个字符,为分割标识,将一个字符串拆分成字符串数组

strings.Split("NLT_abc,123,ok", ",") 
*将字符串的字母进行大小写的转换
```go
strings.ToLower("GO")  //go
strings.ToUpper("gO")  //GO

13.内置函数new和make的区别

  • new: 用来分配内存,主要是用来分配值类型,比如int,float, struct返回的是指针
  • make: 用来分配内存,主要用来分配引用类型,比如channel, map, slice

14. 错误处理机制

  • 使用defer+recover处理错误,好处:进行错误处理后,程序不会轻易挂掉,如果加入预警代码,就可以让程序更加的健壮
  • 自定义错误,使用errors.New和panic内置函数(输出错误信息,并退出程序)

15.map

  • map的key必须是可比较的类型,因此key不能是slice、map、function类型
  • 删除使用delete(map, “key”),如果我们要删除map的所有key,没有一个专门的方法一次删除,可以遍历key,逐个删除;或者map= make(…), make一个新的,让原来的称为垃圾,被gc回收
  • 查找, 若ok为true,则cities存在”no1"这个key,值为val; ok为false表示没有
val, ok := cities["no1"]
  • map的容量达到后,再向map增加元素,会自动扩容,并不会发生panic,也就是说map能动态的增长键值对

16.JSON

  • json(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写。同时也易于机器解析和生成
  • 在编程语言中,一切都是对象。因此,任何的数据类型都可以通过Json来表示,例如字符串、数字、对象、数组、map、结构体等

17. 单元测试

  • 测试用例文件名必须以_test.go结尾。比如cal_test.go,cal不是固定的
  • 测试用例函数必须以Test开头,一般来说就是Test+被测试的函数名,比如TestAddUpper
  • TestAddUpper (t testing.T)的形参类型必须是testing.T
  • 一个测试用例文件中,可以有多个测试函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值