“我报名参加金石计划1期应战——分割10万奖池,这是我的第2篇文章,点击检查活动详情”
这篇文章汇总了我在开发和刷面试题过程中遇到的容易搞错的知识点,要害部分也都为我们写了代码示例。
每个知识点都手撸代码进行了验证,确保内容的准确性。
我收拾的《# Go言语学习专栏》现已被540多位小伙伴重视,想系统学习Go言语的小伙伴能够重视一下,硬核原创内容继续更新中。
类型转化和类型断语
类型转化语法: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()办法+冒号分隔切片的方法,直接完成切片元素的删去。
好了,今天的内容就到这儿,重视我,继续更新硬核内容。
送福利
找我唠嗑点这儿或许直接加微信:wangzhongyang1993
✌️进Go学习群点这儿,重视大众号:程序员晋级打怪之旅,投稿你的文章。
领小册优惠券点这儿,或许重视大众号:程序员晋级打怪之旅