Golang易错知识点汇总
作者:王中阳Go 发布时间:2024-01-31 14:56:13
类型转换和类型断言
类型转换语法:Type(expression)
类型断言语法为:expression.(Type)
1.类型转换示例代码
package main
import "fmt"
//典型的类型转换示例
func main() {
// 类型转换示例
var a int = 5
var b int = 2
var c float32
c = float32(a) / float32(b) //这里就是典型的类型转换
fmt.Printf("a的类型:%T\n", a)
fmt.Printf("b的类型:%T\n", b)
fmt.Printf("c的类型:%T\n", c)
fmt.Printf("c的值:%v\n", c)
//如果我们不进行类型转换,看下输出结果
fmt.Printf("不进行类型转换的输出结果:%v\n", a/b) //从结果可以看出值为2,丢失了精度
}
打印结果
2.类型断言代码示例
注意:对于类型断言,expression 必须是接口类型
package main
import "fmt"
//经典的类型断言示例 搭配switch使用
func main() {
var x interface{}
x = 1
switch x.(type) { //这就是上面说的expression.(Type)
case float32:
fmt.Println("类型是:float32")
case string:
fmt.Println("类型是:string")
case int:
fmt.Println("类型是:int")
default:
fmt.Println("未知类型")
}
}
运行结果
全局变量
定义全局变量必须用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()
方法
示例代码
package main
import (
"fmt"
"strings"
)
func main() {
//第一种方法 将字符串转成byte切片
s := "hello"
s2 := []byte(s)
s2[0] = 'x'
fmt.Printf("转成byte切片:%v\n", string(s2)) //打印结果:转成byte切片:xello
// 第二种方法 将字符串转为rune切片
s3 := "王中阳"
s4 := []rune(s3) //注意:中文字符串要进行修改,只能转成rune切片,不能转成byte切片
s4[0] = '杨'
fmt.Printf("转成rune切片:%v\n", string(s4)) //打印结果:转成rune切片:杨中阳
// 第三种方法,使用原生包strings 中的 Replace() 方法
s5 := "abcdef"
old := "abc"
newString := "ABC"
s6 := strings.Replace(s5, old, newString, -1) //最后一个参数n的作用是:返回将s5中前n个不重叠old子串都替换为new的新字符串,如果n<0会替换所有old子串。
fmt.Printf("strings替换之后的:%v\n", s6) //打印结果:strings替换之后的:ABCdef
}
运行结果
slice
slice可以通过append方式实现元素的删除。
**切片使用冒号分隔时遵循"前闭后开"原则,即包括前面的值,不包括后面的值。 **
1.删除单个元素
package main
import "fmt"
//使用append 删除单个元素
func main() {
var data = []int{0, 1, 2, 3, 4, 5}
//删除元素2
index := 2
//切片使用冒号分隔时遵循"前闭后开"原则,即包括前面的值,不包括后面的值。
data1 := append(data[:index], data[index+1:]...)
fmt.Println(data1)
}
运行结果
2.删除多个元素
package main
import "fmt"
//使用append 删除多个元素
func main() {
var data = []int{0, 1, 2, 3, 4, 5}
//删除元素0,1,2
index := 2
//切片使用冒号分隔时遵循"前闭后开"原则,即包括前面的值,不包括后面的值。
data1 := append(data[:0], data[index+1:]...)
fmt.Println(data1)
}
运行结果
类型转换和类型断言的对比
定义全局变量只能用var,定义全局变量也可以定义在init()函数中
init()函数的知识点,以及init函数和main函数的执行顺序:先执行引用包的常量和变量、在执行引用包的init函数、再执行本包的常量和变量、再执行本包的init函数、最后才会执行本包的main函数。
Go接口的概念总结,刷面试题的时候可能碰到咬文嚼字的问题,注意避坑。
Go字符串不能通过下标直接修改内容,但是可以通过转成byte[]/rune[]/以及使用原生包strings中的Replace()方法修改内容
Go中的slice不能像map一样直接使用delete()方法删除元素,可以使用append()方法+冒号分隔切片的方式,间接实现切片元素的删除。
来源:https://juejin.cn/post/7140082929106944036
猜你喜欢
- 假设有这样一个任务,希望对某个文件夹(包括所有子文件夹与文件)中的所有文件进行处理。这就需要遍历整理目录树, 处理遇到的每个文件。impor
- 前言随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了windows下YOLO的环境搭建流程。一
- 本文实例讲述了Python贪心算法。分享给大家供大家参考,具体如下:1. 找零钱问题:假设只有 1 分、 2 分、五分、 1 角、二角、 五
- 类视图使用装饰器为类视图添加装饰器,可以使用两种方法。为了理解方便,我们先来定义一个为函数视图准备的装饰器(在设计装饰器时基本都以函数视图作
- <% Function cutbadchar(str) badstr="不|文|明
- Firebug: Firebug 是firefox中最为经典的开发工具,可以监控请求头,响应头,显示资源
- 提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法?方法一:基于Scrapy框架中的Spider的递归爬去进行实现
- 这篇文章主要介绍了Python如何使用字符打印照片,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- 前言:通常我们创建类都是使用class 类名,但是小伙伴们有没有想过,类是由谁来创建的呢,python中常说的万物皆对象,对象是由类创建的,
- 这篇文章主要介绍了python被修饰的函数消失问题解决(基于wraps函数),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的
- python解释器有好多版本,Anaconda里面包含了python解释器,并且包含了很多其他的工具包,所以我们只安装1个Anaconda即
- 在学习return函数时候,还是要知道了解它最主要的函数作用,比如,怎么去实现返回一个值,另外还有就是我们经常会用到的使用return能够进
- 如下所示:#tensorflow 中从ckpt文件中恢复指定的层或将指定的层不进行恢复:#tensorflow 中不同的layer指定不同的
- 在日常的生活和工作中,我们经常会遇到一些大小问题,其中有很多的问题,都是可以使用一些简单的Python代码就能解决。比如不久前的复旦大佬,用
- 功能描述抽奖系统包含如下特点:1、可给不同抽奖者设置不同的权重2、先从价值高的奖品开始抽3、已经中奖的人,不再参与后续的抽奖代码第一个数字表
- Python 中的 main 函数充当程序的执行点,在 Python 编程中定义 main 函数是启
- 前段时日微软(Microsoft)正式发布了.NET Core 2.0,在很多开发社区中反响不错。但还是有一些开发者发出了疑问,.NET C
- 和C/C++、Java等语言一样,python在命名上也有一套约定俗成的规则,符合规范的命名可以让程序的可读性大大增加,从而使得代码的逻辑性
- 数据类型的强制转换如果要将一个数据转换成另一个数据类型,只需要将其放入相应类型的函数中去。Number类型的数据转换强制转换为int可以转换
- 本文向大家介绍了使用SQL语句提取数据库所有表的表名、字段名的实例代码,在SQLserver 中进行了测试,具体内容如下:--查询所有用户表