前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >封面选的好,绅士少不了!别闹了,还是好好刷Go易错的知识点吧~

封面选的好,绅士少不了!别闹了,还是好好刷Go易错的知识点吧~

作者头像
王中阳Go
发布于 2022-10-26 06:30:21
发布于 2022-10-26 06:30:21
33500
代码可运行
举报
文章被收录于专栏:Go语言学习专栏Go语言学习专栏
运行总次数:0
代码可运行

图不重要,还是坚持刷知识点吧!

类型转换和类型断言

类型转换语法:Type(expression)

类型断言语法为:expression.(Type)

1.类型转换示例代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 必须是接口类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 函数高。初始化总是以单线程执行,并且按照包的依赖关系顺序执行。一个可能的用途是在开始执行程序之前对数据进行检验或修复,以保证程序状态的正确性。

如何觉得上面这一大段话不好理解的话,可以看我的总结:

  1. init函数可以在任何包中有0个、1个或多个;
  2. main函数只能在main包中有且只有一个,但是main包中也可以有0个、1个或多个init函数;
  3. init函数和main函数都不能被显式调用;

Go语言中变量、init函数、main函数的执行顺序

  1. 首先初始化导入包的变量和常量
  2. 然后执行导入包的init函数
  3. 然后初始化本包的变量和常量
  4. 然后执行本包的init函数
  5. 最后执行本包的main函数

Go接口总结

这是我在刷题的时候碰到的,总结出来给大家:

  1. 如果两个接口拥有相同方法列表(顺序可以不一致),那么这两个接口实质上同一个接口
  2. 接口A是接口B的子集,意味着A的方法B中都有,那么A是B的基类,所以A=B是可行的
  3. 接口是否能够调用成功,需要运行的时候才能知道
  4. 接口赋值是否可行,在编译阶段就可以知道

Go字符串

Go语言中的字符串不支持下标操作

在go语言中,字符串是一种基本类型,和其它开发语言不同,Go的字符串是由单个字节连接起来的。

Go语言统一使用utf-8编码标识Unicode文本。当字符为ASCII编码时,占用1个字节,其它字符占用2到4个字节,中文占用3个字节

如何修改字符串的内容呢?

有三种方法:

  1. 将字符串转成byte切片,再根据下标替换内容
  2. 将字符串转为rune切片,再根据下标替换内容
  3. 使用原生包 strings 中的 Replace() 方法

示例代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.删除单个元素

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.删除多个元素

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)
}

运行结果

总结

这篇文章汇总了我再开发和刷面试题过程中遇到的容易搞错的知识点,包括:

  1. 类型转换和类型断言的对比
  2. 定义全局变量只能用var,定义全局变量也可以定义在init()函数中
  3. init()函数的知识点,以及init函数和main函数的执行顺序:先执行引用包的常量和变量、在执行引用包的init函数、再执行本包的常量和变量、再执行本包的init函数、最后才会执行本包的main函数。
  4. Go接口的概念总结,刷面试题的时候可能碰到咬文嚼字的问题,注意避坑。
  5. Go字符串不能通过下标直接修改内容,但是可以通过转成byte[]/rune[]/以及使用原生包strings中的Replace()方法修改内容
  6. Go中的slice不能像map一样直接使用delete()方法删除元素,可以使用append()方法+冒号分隔切片的方式,间接实现切片元素的删除。

好了,今天的内容就到这里

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员升级打怪之旅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Golang之旅27-Golang知识点总结1
字符串是由一连串的字符连接起来的字符序列,使用的utf-8编码标识的unicode文本。
皮大大
2021/03/02
3780
Golang之旅3-基本数据类型
GO语言中的数据类型十分丰富,包含:整型、浮点型、布尔型,还有数组、切片、结构体、函数、map、通道chanel等
皮大大
2021/03/02
8290
2.Go编程快速入门学习
描述: 在编程语言中标识符就是程序员定义的具有特殊意义的词,比如变量名、常量名、函数名等等。 Go语言中标识符由字母数字和(下划线)组成,并且只能以字母和开头。 举几个例子:abc, _, _123, a123。
全栈工程师修炼指南
2022/09/29
9890
02.GO变量和数据类型(幼儿园级别教程 )
声明: (1) GO版本:go version go1.21.5 windows/amd64 (2) 开发工具:vscode (3) 微信公众号:给点知识 如果版本不一样再环境变量的配置上多少有点问题。1.11 GO版本之前使用GOPATH 之后可以使用go.mod 要不然导入模块包那块会有问题。
读懂原理
2024/01/21
2731
02.GO变量和数据类型(幼儿园级别教程 )
Go语言基础之基本数据类型
整型分为以下两个大类: 按长度分为:int8、int16、int32、int64 对应的无符号整型:uint8、uint16、uint32、uint64 其中,uint8就是我们熟知的byte型,int16对应C语言中的short型,int64对应C语言中的long型。
twelvecoder
2021/12/24
5170
Go 语言基本数据类型
注意: 在使用 int 和 uint 类型时,不能假定它是 32 位或 64 位的整型,而是考虑 int 和 uint可能在不同平台上的差异。
BUG弄潮儿
2024/01/22
1190
Go 语言基本数据类型
Go 学习
第一,语言简单,上手快。Go 语言的语法特性简直是太简单了,简单到你几乎玩不出什么花招,直来直去的,学习难度很低,容易上手。
wywwzjj
2023/05/09
1.9K0
Go 学习
Go语言基础速刷手册
这个“不务正业”的阿巩,今天冒着现学现卖的风险来和大家分享Go了,作为既具备C的理念又有Python 姿态的语言,怎么能不来试上一试呢!
才浅Coding攻略
2022/12/12
8980
Go 基础之基本数据类型
Go 语言整型可以分为平台无关整型和平台相关整型这两种,它们的区别主要就在,这些整数类型在不同 CPU 架构或操作系统下面,它们的长度是否是一致的。
贾维斯Echo
2023/10/18
5240
Go 基础之基本数据类型
对标 C + Python,明早我要会看 go 代码
官网下载,我用 Linux amd 那个版本的。一百多兆,自己估计一下网速。 直接解压到 /usr/local 目录下:
看、未来
2022/05/06
9200
对标 C + Python,明早我要会看 go 代码
Go语言中常用的基本数据类型
Go语言中以bool类型进行声明布尔型数据,布尔型数据只有true(真)和false(假)两个值。
极客运维圈
2020/03/23
1.3K0
go 语言string之解析
string 在go中如何定义的? string 的底层原理与细节? string 如何具体使用?
Tim在路上
2021/02/04
6210
[GO语言基础] 三.变量声明、数据类型、标识符及编程练习12题
作为网络安全初学者,会遇到采用Go语言开发的恶意样本。因此从今天开始从零讲解Golang编程语言,一方面是督促自己不断前行且学习新知识;另一方面是分享与读者,希望大家一起进步。前文介绍了Go的编译运行、语法规范、注释转义及API标准库知识;这篇文章将介绍Golang的变量、数据类型和标识符知识,并通过12道编程练习进行提升。 这系列文章入门部分将参考“尚硅谷”韩顺平老师的视频和书籍《GO高级编程》,详见参考文献,并结合作者多年的编程经验进行学习和丰富,且看且珍惜吧!后续会结合网络安全进行GO语言实战深入,加油~
Eastmount
2021/02/25
7700
Go语言学习(三)| 基础数据类型
字符串在Go中是 UTF-8 的由双引号(")或反引号(``)包裹的字符序列(类型为string)。如果使用单引号则表示一个字符(UTF-8编码)一旦给变量赋值,字符串就不能修改了。如果想要修改可使用如下方式:
Mervyn
2020/07/21
4000
[GO语言基础] 三.变量声明、数据类型、标识符及编程练习
作为网络安全初学者,会遇到采用Go语言开发的恶意样本。因此从今天开始从零讲解Golang编程语言,一方面是督促自己不断前行且学习新知识;另一方面是分享与读者,希望大家一起进步。前文介绍了Go的编译运行、语法规范、注释转义及API标准库知识;这篇文章将介绍Golang的变量、数据类型和标识符知识,并通过12道编程练习进行提升。这系列文章入门部分将参考“尚硅谷”韩顺平老师的视频和书籍《GO高级编程》,详见参考文献,并结合作者多年的编程经验进行学习和丰富,且看且珍惜吧!后续会结合网络安全进行GO语言实战深入,加油~
Eastmount
2021/12/03
6550
[GO语言基础] 三.变量声明、数据类型、标识符及编程练习
Golang 基础:Go Module, for range, 切片, map, struct 等使用和实现
https://time.geekbang.org/column/article/428267
张拭心 shixinzhang
2022/05/10
1.3K0
Golang 基础:Go Module, for range, 切片, map, struct 等使用和实现
GO语言基础
golang可执行程序, package main,并且有且只有一个main入口函数
用户9645905
2023/10/27
2270
GO语言基础
Golang 语言的编程技巧之类型
Golang 语言是一门静态类型的编程语言,我们在编写代码时,为了提升代码的灵活性,有时会使用空接口类型,对于空接口类型的变量,一般会通过类型断言判断变量的类型,而且可能还会遇到需要类型转换的场景。本文我们就来介绍一下类型断言、类型转换和类型选择。
frank.
2021/04/16
7670
《Go语言入门经典》7~9章读书笔记
结构体是一系列具有指定数据类型的数据字段,它能够让您通过单个变量引用一系列相关的值。通过使用结构体,可在单个变量中存储众多类型不同的数据字段。通过使用结构体,可提高模块化程度,还能够让您创建并传递复杂的数据结构。
跑马溜溜的球
2020/12/07
4510
go-基本数据类型和运算符
Go语言中的基本数据类型有: 整型、浮点型、布尔型、字符串、数组、切片、map、函数、结构体和通道(channel)等。
新人小试
2020/02/29
6210
相关推荐
Golang之旅27-Golang知识点总结1
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文