Go语言基础2 | 青训营笔记

112 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

iota

iota是go语言的常量计数器,只能在常量的表达式中使用。

iota在const关键字出现时将被重置为0。const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引)。 使用iota能简化定义,在定义枚举时很有用。

举个例子:

 const (
         n1 = iota //0
         n2        //1
         n3        //2
         n4        //3
     )
几个常见iota实例

使用_跳过某些值

 const (
         n1 = iota //0
         n2        //1
         _
         n4        //3
     )

iota声明中间插队

 const (
         n1 = iota //0
         n2 = 100  //100
         n3 = iota //2
         n4        //3
     )
     const n5 = iota //0

定义数量级 (这里的<<表示左移操作,1<<10表示将1的二进制表示向左移10位,也就是由1变成了10000000000,也就是十进制的1024。同理2<<2表示将2的二进制表示向左移2位,也就是由10变成了1000,也就是十进制的8。)

 const (
         _  = iota
         KB = 1 << (10 * iota)
         MB = 1 << (10 * iota)
         GB = 1 << (10 * iota)
         TB = 1 << (10 * iota)
         PB = 1 << (10 * iota)
     )

多个iota定义在一行

 const (
         a, b = iota + 1, iota + 2 //1,2
         c, d                      //2,3
         e, f                      //3,4
     )

基本数据类型

整型

整型分为以下两个大类: 按长度分为:int8、int16、int32、int64 对应的无符号整型:uint8、uint16、uint32、uint64

其中,uint8就是我们熟知的byte型,int16对应C语言中的short型,int64对应C语言中的long型。

特殊整型
类型描述
uint32位操作系统上就是uint32,64位操作系统上就是uint64
int32位操作系统上就是int32,64位操作系统上就是int64
uintptr无符号整型,用于存放一个指针

注意: 在使用intuint类型时,不能假定它是32位或64位的整型,而是考虑intuint可能在不同平台上的差异。

注意事项 获取对象的长度的内建len()函数返回的长度可以根据不同平台的字节长度进行变化。实际使用中,切片或 map 的元素数量等都可以用int来表示。在涉及到二进制传输、读写文件的结构描述时,为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使用intuint

数字字面量语法

Go1.13版本之后引入了数字字面量语法,这样便于开发者以二进制、八进制或十六进制浮点数的格式定义数字,例如:

v := 0b00101101, 代表二进制的 101101,相当于十进制的 45。 v := 0o377,代表八进制的 377,相当于十进制的 255。 v := 0x1p-2,代表十六进制的 1 除以 2²,也就是 0.25。

而且还允许我们用 _ 来分隔数字,比如说: v := 123_456 表示 v 的值等于 123456。

%b表示输出二进制,%d表示输出十进制,以0x开头的数字是十六进制

浮点型

Go语言支持两种浮点型数:float32float64。这两种浮点型数据格式遵循IEEE 754标准: float32 的浮点数的最大范围约为 3.4e38,可以使用常量定义:math.MaxFloat32float64 的浮点数的最大范围约为 1.8e308,可以使用一个常量定义:math.MaxFloat64

复数

complex64和complex128

 var c1 complex64
 c1 = 1 + 2i
 var c2 complex128
 c2 = 2 + 3i
 fmt.Println(c1)
 fmt.Println(c2)

复数有实部和虚部,complex64的实部和虚部为32位,complex128的实部和虚部为64位。

布尔值

Go语言中以bool类型进行声明布尔型数据,布尔型数据只有true(真)false(假)两个值。

注意:

  1. 布尔类型变量的默认值为false
  2. Go 语言中不允许将整型强制转换为布尔型.
  3. 布尔型无法参与数值运算,也无法与其他类型进行转换。
字符串

Go语言中的字符串以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、float32、float64 等)一样。 Go 语言里的字符串的内部实现使用UTF-8编码。 字符串的值为双引号(")中的内容,可以在Go语言的源码中直接添加非ASCII码字符,例如:

 s1 := "hello"
 s2 := "你好"
字符串转义符

Go 语言的字符串常见转义符包含回车、换行、单双引号、制表符等,如下表所示。

转义符含义
\r回车符(返回行首)
\n换行符(直接跳到下一行的同列位置)
\t制表符
'单引号
"双引号
\反斜杠

举个例子,我们要打印一个Windows平台下的一个文件路径:

 package main
 import (
     "fmt"
 )
 func main() {
     fmt.Println("str := "c:\Code\lesson1\go.exe"")
 }
多行字符串

Go语言中要定义一个多行字符串时,就必须使用反引号字符:

 s1 := `第一行
 第二行
 第三行
 `
 fmt.Println(s1)

反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出。

字符串的常用操作
方法介绍
len(str)求长度
+或fmt.Sprintf拼接字符串
strings.Split分割
strings.contains判断是否包含
strings.HasPrefix,strings.HasSuffix前缀/后缀判断
strings.Index(),strings.LastIndex()子串出现的位置
strings.Join(a[]string, sep string)将字符串切片中存在的所有元素连接为单个字符串
 package main
 ​
 import (
     "fmt"
     "strings"
 )
 ​
 func main() {
     m := "I&LOVE&YOU"
     fmt.Println(strings.Split(m,"&"))//输出I LOVE YOU
     fmt.Println(strings.Contains(m,"I"))//输出true
     fmt.Println(strings.HasPrefix(m,"I&"))//输出true
     fmt.Println(strings.HasSuffix(m,"YOU"))//输出true
     fmt.Println(strings.Index(m,"YOU"))//输出7
     fmt.Println(strings.LastIndex(m,"YOU"))//输出7
     
     // array of strings. 
     str:= []string{"Geeks", "For", "Geeks"} 
   
     // joining the string by separator 
     fmt.Println(strings.Join(str, ",")) //输出Geeks,For,Geeks
 }