Go 容易搞错的知识点汇总
这篇文章汇总了我在开发和刷面试题过程中遇到的容易搞错的知识点,关键部分也都为大家写了代码示例。
每个知识点都手撸代码进行了验证,确保内容的准确性。
我整理的《Go 语言学习专栏》已经被 540 多位小伙伴关注,想系统学习 Go 语言的小伙伴可以关注我一下,硬核原创内容持续更新中。
类型转换和类型断言
类型转换语法:Type(expression)
类型断言语法为:expression.(Type)
1.类型转换示例代码
打印结果
2.类型断言代码示例
注意:对于类型断言,expression 必须是接口类型
运行结果
全局变量
定义全局变量必须用 var,全局变量要定义在函数之外,而在函数之外定义的变量只能用 var 定义。
全局变量使用 var,编译通过
全局变量不使用 var,编译不通过
init 函数
这是官方对于 init()函数的介绍:
变量除了可以在全局声明中初始化,也可以在 init ()函数中初始化。这是一类非常特殊的函数,它不能够被人为调用,而是在每个包完成初始化后自动执行,并且执行优先级比 main 函数高。初始化总是以单线程执行,并且按照包的依赖关系顺序执行。一个可能的用途是在开始执行程序之前对数据进行检验或修复,以保证程序状态的正确性。
如何觉得上面这一大段话不好理解的话,可以看我的总结:
init 函数可以在任何包中有 0 个、1 个或多个;
main 函数只能在 main 包中有且只有一个,但是 main 包中也可以有 0 个、1 个或多个 init 函数;
init 函数和 main 函数都不能被显式调用;
Go 语言中变量、init 函数、main 函数的执行顺序
首先初始化导入包的变量和常量
然后执行导入包的 init 函数
然后初始化本包的变量和常量
然后执行本包的 init 函数
最后执行本包的 main 函数
Go 接口总结
这是我在刷题的时候碰到的,总结出来给大家:
如果两个接口拥有相同方法列表(顺序可以不一致),那么这两个接口实质上同一个接口
接口 A 是接口 B 的子集,意味着 A 的方法 B 中都有,那么 A 是 B 的基类,所以 A=B 是可行的
接口是否能够调用成功,需要运行的时候才能知道
接口赋值是否可行,在编译阶段就可以知道
Go 字符串
Go 语言中的字符串不支持下标操作
在 go 语言中,字符串是一种基本类型,和其它开发语言不同,Go 的字符串是由单个字节连接起来的。
Go 语言统一使用 utf-8 编码标识 Unicode 文本。当字符为 ASCII 编码时,占用 1 个字节,其它字符占用 2 到 4 个字节,中文占用 3 个字节
如何修改字符串的内容呢?
有三种方法:
将字符串转成 byte 切片,再根据下标替换内容
将字符串转为 rune 切片,再根据下标替换内容
使用原生包
strings
中的Replace()
方法
示例代码
运行结果
slice
slice 可以通过 append 方式实现元素的删除。
切片使用冒号分隔时遵循"前闭后开"原则,即包括前面的值,不包括后面的值。
1.删除单个元素
运行结果
2.删除多个元素
运行结果
总结
这篇文章汇总了我在开发和刷面试题过程中遇到的容易搞错的知识点,包括:
类型转换和类型断言的对比
定义全局变量只能用 var,定义全局变量也可以定义在 init()函数中
init()函数的知识点,以及 init 函数和 main 函数的执行顺序:先执行引用包的常量和变量、在执行引用包的 init 函数、再执行本包的常量和变量、再执行本包的 init 函数、最后才会执行本包的 main 函数。
Go 接口的概念总结,刷面试题的时候可能碰到咬文嚼字的问题,注意避坑。
Go 字符串不能通过下标直接修改内容,但是可以通过转成 byte[]/rune[]/以及使用原生包 strings 中的 Replace()方法修改内容
Go 中的 slice 不能像 map 一样直接使用 delete()方法删除元素,可以使用 append()方法+冒号分隔切片的方式,间接实现切片元素的删除。
好了,今天的内容就到这里,关注我,持续更新硬核内容。
版权声明: 本文为 InfoQ 作者【王中阳Go】的原创文章。
原文链接:【http://xie.infoq.cn/article/a561318a526c1dfb2448e6c7e】。文章转载请联系作者。
评论 (1 条评论)