脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - Golang易错知识点汇总

Golang易错知识点汇总

2022-09-07 13:55王中阳Go Golang

这篇文章汇总了在开发和刷面试题过程中遇到的Golang容易搞错的知识点,关键部分也都为大家写了代码示例,感兴趣的小伙伴可以了解一下

类型转换和类型断言

类型转换语法: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
", a)
   fmt.Printf("b的类型:%T
", b)
   fmt.Printf("c的类型:%T
", c)
   fmt.Printf("c的值:%v
", c)
   //如果我们不进行类型转换,看下输出结果
   fmt.Printf("不进行类型转换的输出结果:%v
", a/b) //从结果可以看出值为2,丢失了精度
}

打印结果

Golang易错知识点汇总

 

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("未知类型")
   }
}

运行结果

Golang易错知识点汇总

 

全局变量

定义全局变量必须用var,全局变量要定义在函数之外,而在函数之外定义的变量只能用var定义。

 

全局变量使用var,编译通过

Golang易错知识点汇总

 

全局变量不使用var,编译不通过

Golang易错知识点汇总

 

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语言中的字符串不支持下标操作

Golang易错知识点汇总

在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
", string(s2)) //打印结果:转成byte切片:xello

   // 第二种方法 将字符串转为rune切片
   s3 := "王中阳"
   s4 := []rune(s3) //注意:中文字符串要进行修改,只能转成rune切片,不能转成byte切片
   s4[0] = "杨"
   fmt.Printf("转成rune切片:%v
", 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
", s6)           //打印结果:strings替换之后的:ABCdef
}

运行结果

Golang易错知识点汇总

 

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)
}

运行结果

Golang易错知识点汇总

 

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)
}

运行结果

Golang易错知识点汇总

 

总结

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

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

到此这篇关于Golang易错知识点汇总的文章就介绍到这了,更多相关Golang知识点内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文地址:https://juejin.cn/post/7140082929106944036

延伸 · 阅读

精彩推荐
  • GolangGolang断言判断值类型的实现方法

    Golang断言判断值类型的实现方法

    这篇文章主要介绍了Golang断言判断值类型的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们...

    鹿灏楷silves7422021-04-21
  • GolangGo Java算法之同构字符串示例详解

    Go Java算法之同构字符串示例详解

    这篇文章主要为大家介绍了Go Java算法之同构字符串示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    黄丫丫4312022-08-16
  • Golanggolang 如何用反射reflect操作结构体

    golang 如何用反射reflect操作结构体

    这篇文章主要介绍了golang 用反射reflect操作结构体的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    皿小草11592021-06-06
  • GolangGolang中如何实现枚举详析

    Golang中如何实现枚举详析

    举就是将数据值一一列出来,枚举可以用来表示一些固定的值,枚举是常量组成的,下面这篇文章主要给大家介绍了关于Golang中如何实现枚举的相关资料,需要的...

    峰子20127742022-07-11
  • Golanggolang使用aes库实现加解密操作

    golang使用aes库实现加解密操作

    这篇文章主要介绍了golang使用aes库实现加解密操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    robertkun9872021-03-17
  • Golang基于gin的golang web开发:路由示例详解

    基于gin的golang web开发:路由示例详解

    这篇文章主要介绍了基于gin的golang web开发:路由示例详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参...

    陈宏博10002021-01-30
  • Golanggolang HTTP 服务器 处理 日志/Stream流的操作

    golang HTTP 服务器 处理 日志/Stream流的操作

    这篇文章主要介绍了golang HTTP 服务器 处理 日志/Stream流的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    XuYongshi028452021-03-02
  • GolangGo语言中make和new函数的用法与区别

    Go语言中make和new函数的用法与区别

    这篇文章介绍了Go语言中make和new函数的用法与区别,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参...

    奋斗的大橙子8252022-07-16