🌞

Golang系列教程--基础结构与类型

📜本文内容


🐵基础类型

布尔型

类型 内存占用大小 取值范围
bool 1字节 true和false

数值类型

🐒1.无符号整型
类型 内存占用大小 取值范围
uint8又称byte 1字节 0~255
uint16 2字节 0~65535
uint32 4字节 0~4294967295
uint64 8字节 0~18446744073709551615
🐒2.有符号整型
类型 内存占用大小 取值范围
int8 1字节 -128~127
int16 2字节 -32768~32767
int32 4字节 -2147483648~2147483647
int64 8字节 -9223372036854775808~9223372036854775807

注:Golang中的int在未明确指定位数时,默认为int32

🐒3.浮点型
类型 内存占用大小 取值范围
float32 4字节 1.4e-45~3.4e38
float64 8字节 4.9e-324~1.8e308

字符串

Go中的字符串由字节组成,不可变类型,使用UTF-8编码

1
name = "hello"

常用处理字符串的包 - strconv:提供了多种数值与字符串转化的函数 - strings:提供多种字符串处理的方法

基础类型默认取值

布尔型 数值类型 字符串
false 0 ""

错误类型

  • Go内置的接口,Go中的errors包实现了Error()函数,当然也可以自定义实现错误类型

    1
    2
    3
    
    type error interface {
    Error() string
    }
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    
    package main
    
    import "fmt"
    
    type TestError struct {
    	Msg string
    }
    
    // 实现了Error接口
    func (e TestError) Error() string {
    	return fmt.Sprintf("%v", e.Msg)
    }

🐵变量

  • 声明形式:
    • var [变量名] [变量类型]: var name string
    • new: b := new(bool) new会分配被置零的存储,在此b的值为false
    • make: make(chan bool) 新建mapslicechannel类型的数据
  • 注意:
    • 关键字不能作为变量名,例如const/var/import等
    • 首字母大写则该变量可导出
    • 函数内声明的为局部变量,全局变量则在import语句后作声明
  • 初始化:
    • 未手动赋值,变量被初始化成默认值,int:0string:""bool:false

指针变量

🐒1.* 和 & 的区别
& *
取地址符号 指针运算符
对变量取地址 一个变量是指针类型
指针变量所处的存储单元
a = *&a a = &&&&*&a

*&可以相互抵消,&*不可以抵消

指向指针的指针

1
2
3
i = 1
var ptr *int = &i
var pptr **int = &ptr
ptr pptr
ptr是一个指针变量
ptr的类型是*int
pptr是一个指针变量
pptr的类型是**int,也是&ptr
*ptr = 1 **pptr = 1

变量命名

推荐阅读:驼峰命名法

变量声明程序例子

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main

import "fmt"

type qq int
type pp float32

func main() {
 // 用var声明变量,用 = 赋值,Go会自动检测变量的类型
 var name = "haha"
 fmt.Println(name)

 // 省略var关键字,用 := 初始化,Go会自动检测变量的类型
 name1 := "hahaha"
 fmt.Println(name1)

 var a, b = 1, 2
 var c, d = 3, "ha"
 fmt.Println(a, b, c, d)

 //默认初始化为0
 var a1 qq
 fmt.Println(a1)
 var s1 pp
 fmt.Println(s1)
}
1
2
3
4
5
haha
hahaha
1 2 3 ha
0
0

变量生命周期

  • 包级别变量:整个程序执行过程
  • 局部变量:每次执行声明时建立一个实体,一直生存到它不可访问,函数的参数和返回值都是局部变量,不可访问后,其实体所占的内存空间将被收回

值类型和引用类型

值类型 引用类型
基本数据类型
数组
结构体
指针
slice
map
channel
interface
变量直接存储值,内存通常在栈中分配 变量存储的值是一个地址,这个地址对应的空间 才真正存储数据,内存通常在堆上分配,当没有任何变量引用这个地址时,会被GC回收

🐵常量

  • 常量是无法改变的,在声明时就已确定好具体的值,通常包含基本数据类型和字符串类型
  • 用关键字const修饰
  • 常量可作枚举

常量定义

1
2
3
4
5
6
7
8
pacakge main

import "fmt"

const(
  Country = "China"
  Weight = 10
)

常量模拟枚举

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
package main

import "fmt"

type Weight int

const (
	State1 Weight = iota //开始生成枚举常量,State1为0
	State2
	State3
	State4
	State5
)

func main() {
	fmt.Printf("%d, %d, %d, %d, %d\n",State1, State2, State3, State4, State5)

  var level Weight = State5
  fmt.Printf("level is: %d\n",level)
}
1
2
0, 1, 2, 3, 4
level is: 4
updatedupdated2019-12-162019-12-16