Golang学习笔记
第一章 Golang开山篇
1.1Golang的学习方向
区块链研发工程师
Go服务器端(美团)/数据处理,处理大并发/游戏软件工程师(后台)
Golang分布式/云计算软件工程师(盛大云cdn,京东(消息推送))
1.2Golang的应用领域
1.2.1区块链的应用
1.2.2后台的服务应用
后端服务器应用
1.2.3云计算/云服务后台的应用
Go语言建立新的网络服务(盛大云CDN)
*学习方法介绍:如何快速深入的学习一个新技术或者是一个知识点
我们有一个需求
1、项目开发是,我们需要解决某个问题
2、跳槽,学习新技术
先看看使用现有技术能否解决现有的问题 (1)使用传统的方法(发现可以解决但是不够好)(2)使用新技术
学习一下新技术或者知识点(1)原理(2)基本语法
快速入门案例(1)简单(2)能够了解新技术或者知识点的基本使用(不需要涉及技术细节)
讨论这个新技术或者知识点的细节 (1)怎么使用更规范(2)使用陷阱(3)需要使用时,注意什么…
第二章 Golang 的概述
2.1 什么是程序
程序:就是完成某个功能指令的集合。
2.2 Go语言的特点
·
既能到达静态编译语言的安全和性能,又达到了动态语言开发维护的高效率。
1、从C语言中继承了多个理念,包括表达式语法、控制结构、基础数据类型,调用参数传值,指针等,保留了和C语言一样的编译执行方式及弱化的指针。
2、引入包的概念,用于阻止程序结构,go语言的一个文件要归属一个包,不能单独存在。
3、垃圾回收机制,内存自动回收。
4、天然并发
(1)从语言层面支持并发,实现简单。
(2)goroutine,轻量级线程,可实现大并发处理,高效利用多核。
(3)基于CPS并发模型实现。
(4)吸收了管道通信机制,形成Go语言特有管道channel,通过它可以实现不同的goroute之间的相互通信
(5)Go函数支持返回多个值
//写一个程序,实现同时返回和、差
//go 函数支持返回多个值
func getSunAndSub(n1 int,n2 int)(int,int){
sum:=n1+n2
sub:=n1-n2
return sum,sub
}
(6)新的创新:例如切片slice、延时执行defer等
2.3Go语言的开发工具
2.4Windows下配置Golang环境变量
在Go开发中,需要配置那些环境变量
2.5Go语言快速入门
创建项目结构
1)目录结构说明
2)代码如下:
对上图的说明
(1)go文件的后缀是 .go
(2)package main
表示该hello.go文件所在的包是main,在go中, 每个文件都必须归属一个包。
(3)import“fmt”
表示,引入一个包,包名fmt,引入该包后,就可以使用fmt包的函数,比如fmt.println
(4)func main(){
}
func 是一个关键字,表示一个函数。
main是函数名,是一个主函数(即程序的入口)
(5)fmt.Println(“hello”)
表示调用fmt函数中的pringln输出“hello”
3)通过gobuild命令对hello.go文件进行编译
编译后生成hello.exe 可执行文件
执行hello.exe文件
或者执行go run hello.go 命令,对小程序直接进行编译
go run 命令相对执行速度较慢。
go build编译文件后,执行hello.exe文件相对速度较快。
指定编译后文件名称用:go build -o 指定编译后文件的名称+源代码文件名称。
在编译过程中,如果程序有错误,编译时,会在错误的那行报错。
2.6 Go程序开发的注意事项
1)Go源代码文件是以”.go”结尾的。
2)Go应用程序的执行入口是main()函数。
3)Go语言是严格区分大小写的。
4)Go方法是一条条语句构成,每个语句后面不需要分号(Go语言会在每行后自动加分号),体现了Golang的简洁性。
5)Go编译器是一行行进行编译的,不能将多条语句写在一起,不然会报错。
6)Go语言定义的变量或者import的包如果没有使用到,或者声明变量后没有使用,则编译不能通过。
7)大括号都是成对出现的,缺一不可。
2.7Go语言中的转义字符(escape char)
说明常用的转义字符如下:
1)\t :一个制表位,实现对齐功能。(通常使用以实现对齐功能)
2)\n :换行符。
3)\\:一个\
4)\":一个 "
5)\r:一个回车
6)案例截图
package main
//fmt包中提供格式化、输入、输出的函数
func main() {
//演示转义字符中\t的使用
fmt.Println("tom\tjack")
fmt.Println("hello\nworld")
fmt.Println("c:\\User\\Administrator")
fmt.Println("tom说\"I love you\"")
\r 回车,从当前行的最前面开始输出,覆盖掉以前的内容,替换覆盖前面的内容
//fmt.Println("天龙八部雪山飞狐\r张飞")
}
2.8Golang开发常见的问题和解决方法
1、找不到文件
解决方法:源文件名不存在或者写错,或者当前路径错误。
小结和提示:
学习编程最容易犯的错是语法错误,Go要求必须按照语法规则编写代码,如果程序中违反了语法规则,例如:忘记了大括号、引号,或者拼写错了单词,Go编译器会报语法错误。
要求:尝试着去看懂编译器会报告的错误信息。
2.9 注释(comment)
1、介绍注释
用于注解说明解释程序的文字就是注释,注释提高了代码的阅读星;
注释是一个程序员需要具有的良好变成习惯。将自己的思想通过注释先整理出来,再用代码去体现。
2、在Golang中注释有两种形式
1)行注释
基本语法
//注释内容
2)块注释
/注释文字/
2.10 规范代码的使用
1、争取的注释和注释风格
1)Go语言推荐用行注释进行注释整个方法和语句。
2)带看Go源码
2、正确的缩进和空白
1)使用一个tab操作,实现缩进,默认整体向右边移动,使用shift+tab整体向做移动
2)使用gofmt进行格式化,例如gofmt main.go或者gofmt -w main.go(该指令可以将格式化的内容重新写入文件中,当程序员重新打开文件时,就回看到格式化后的文件)
3)运算符的两边习惯性的加空格,例如 var num = 1 + 1 * 5
4)G0语言的代码风格.
package main
import "fmt"
func main() {
fmt.Println("hello")
}
上面的写法是正确的.
package main
import "fmt"
func main(
fmt.Println("hello,world!")
}
Go设计者思想:一个问题尽量只有一个解决办法。
5)一行最高不超过80个字符。
2.9Dos的常用指令
1、dos的基本介绍
Dos:Dos:Disk Operating System磁盘操作系统,简单说一下windows的目录结构
2、DOS的基本操作原理
1)查看当前目录是什么
案例演示:dir
`
2)切换到其他盘符:切换到D盘:cd /d d:
3)切换到当前盘的其他目录下:cd d:\test100
绝对路径:从当前盘的最上面开始定位,比如D:从当前盘找到对应的目录
相对路径:从当前位置开始定位,去找对应的目录
4)切换到上一级
cd …
5)切换到根目录
cd
6)新建目录
md 文件名称
7)删除目录
删除空目录
rd ok100
删除目录以及下面的子目录和文件,不询问
rd /s/q ok100
删除目录以及下面的子目录和文件,带询问
rd /s ok100(目录名称)
2.10文件操作
新建或追加内容到文件:echo hello > d:(文件路径)(绝对路径方式)
echo hello(在文件路径下)(相对路径)
拷贝文件:copy 文件名 拷贝到的路径下
copy 文件名 拷贝到的路径下\重新指定名
移动(剪切)文件:move 文件名 移动(剪切)路径
删除文件:del 文件名称
删除所有文件:del *.txt
清屏:cls
退出dos:exit
2.11本章总结
1)Go语言的SDK是什么?
SDK是软件开发工具包。做Go开发首先要进行SDK配置
2)Golang环境配置及其作用。
GOROOT:指定go sdk的安装目录。
Path:指令sdk\bin 目录:go.exe godoc.exe gofmt.exe
GOPATH:就是golang工作目录:所有的项目源码都在这个目录下
3)Golang程序的编写、编译、运行步骤是什么?能否一步执行?
编写:就是写源码
编译:go build 源码=》生成一个二进制可执行文件
运行:1、对可执行文件运行 xx.exe ./可执行文件 2、go run 源码
4)Golang程序编写的规则。
1)go文件的后缀 .go
2)go程序区分大小写
3)go的语句后,不需要带分号
4)go定义的变量,或者import包,必须使用,如果没有使用,就会报错。
5)go中,不要把多条语句放入在同一行,否则就会报错。
6)go中的大括号要成对出现,而且风格是
func main(){
//语句
}
7)在配置环境、编译、运行中出现基本的错误。
第三章 Golang变量
3.1为什么需要变量
1、一个程序就是一个世界
2、变量是程序的基本组成单位
不论是使用哪种高级程序语言编写程序,变量都是其程序的基本组成单位。
`
上图中sum,sub都是变量。
3.2变量介绍
1、变量的概念
变来给相当于内存中一个数据存储空间的表示。可以将变量看做是一个房间的门牌号,通过门牌号我们可以找到房间,同理,通过变量名可以访问到变量(值)。
2、变量使用的基本步骤
1)声明变量(也可以叫做定义变量)
2)赋值
3)使用
3、变量入门
package main
import "fmt"
func main() {
//定义变量/声明变量
var i int
//给i赋值
i=10
//使用变量
fmt.Println("i=",i)
}
输出
3.3变量使用注意事项
1)变量表示内存的一个存储区域
2)该区域有自己的名称(变量名)和类型(数据类型)
3)Golang变量使用的三种方式
(1)第一种:指定变量类型,声明后若不赋值,使用默认值(int的默认值是0)
(2)第二种:根据值自行判断变量类型(类型推导)
(3)第三种:省略var,注意 :=左侧的变量不应该是已经声明过的,否则会导致编译错误(name := "tom"<<=>>var name string name = "tom")
4)多变量声明
在编程中,Golang可以一次声明多个变量。
举例:
//演示golang如何一次性声明多个变量
package main
import "fmt"
func main(){
var n1, n2, n3 int
fmt.Println("n1=",n1,"n2=",n2,"n3=",n3)
//一次性声明多个变量的方式2
var n1, name , n3 = 100, "tom", 888
fmt.Println("n1=",n1 ,"name=", name, "n3=", n3)
//一次性声明多个变量的方式3,同样可以使用类型推导
n1, name , n3 := 100, "tom~", 888
fmt.Println("n1=",n1 ,"name=", name, "n3=", n3)
}
如何一次性声明多个全局变量(在go中函数外部定义变量就是全局变量):
package main
import "fmt"
var n1 = 100
var n2 = 200
var name = "jack"
var (
n3 = 300
n4 = 900
name2 = "mary"
)
func main{
//输出全局变量
fmt.Println("n1=",n1, "name=", name, "n2=", n2)
fmt.Println("n3=",n3, "name2=", name2, "n4=", n4)
}
5)变量在某一区域的数据值可以在同一个类型的范围内不断变化(重点)
错误代码展示:
package main
import "fmt"
//变量使用的注意事项
func main(){
//该区域的数据值可以在同一类型范围内不断变化
var i int = 10
i = 30
i = 50
fmt.Println("i=", i)
i = 1.2 //int,原因是不能改变变量类型
}
6)变量在同一个作用域(在一个函数或者在代码块)内不能重名
错误代码展示
package main
import "fmt"
//变量使用的注意事项
func main(){
//该区域的数据值可以在同一类型范围内不断变化
var i int = 10
i = 30
i = 50
fmt.Println("i=", i)
//变量在同一个作用域(在一个函数或者在代码块)内不能重名
var i int = 50
//i := 99
}
7)变量=变量名+值+数据类型(变量三要素)
8)Golang的变量值如果没有赋初值,编译器会使用默认值,比如 int 默认值 0 ,string 默认值为空串,小数默认值为 0 。
3.4变量的声明,初始化和赋值
1、声明变量
基本语法:var 变量名 数据类型
例如: var a int
2、初始化变量
在声明变量的时候,就赋值
使用细节:如果声明时就直接赋值,可以省略数据类型
var b = 400
3、给变量赋值
如先声明了变量:var num int
然后,再给值 num = 789;这就是给变量赋值。
3.5程序中 + 号的使用
1、当左右两边都是数值型时,则做加法运算
2、当左右两边都是字符串,则做字符串拼接
3.6变量的数据类型基本介绍
`
3.7整数类型
`
int的无符号类型
整型的类型
3.8整型的使用细节
1)Golang各整数类型分:有符号和无符号,int uint 的大小和系统有关。
2)Golang的整型默认声明为int型(fmt.Printf(“n1 的 类型 %T”,n1))
3)如何在程序查看某个变量的字节大小和数据类型
package main
import (
"fmt"
"unsafe"
)
func main() {
var n2 int64 = 10
//unsafe.Sizeof(变量)是unsafe包的一个函数,可以返回变量占用的字节数
fmt.Printf("n2 的 类型 %T n2占用的字节数是 %d", n2, unsafe.Sizeof(n2))
}
4)Golang程序中整型变量在使用时,遵守保小不保大的原则,即:在保证程序正确运行下,尽量使用占用空间小的数据类型。【如:年龄】
var age byte = 90
5)bit:计算机中的最小存储单位。byte:计算机中基本存储单元。
1byte= 8 bit
3.9小数类型/浮点型
3.9.1基本介绍
小数类型就是用于存放小数的,比如 1.2 0.23 -1.911
3.9.2案例演示
package main
import (
"fmt"
)
func main() {
var price float32 = 89.12
fmt.Println("price=",price)
}
3.9.3小数类型的分类
对上图的说明:
1、关于浮点数在机器中存放形式的简单说明,浮点数=符号位+指数位+尾数位
说明:浮点数都是有符号的。
package main
import (
"fmt"
)
func main() {
var price float32 = 89.12
fmt.Println("price=",price)
var num1 float32 = -0.00089
var num2 float64 = -0.2312412412
fmt.Println("num1=",num1,"num2=",num2)
}
2、尾数部分可能丢失,造成精度损失。
说明:float64的精度比float32的要准确
说明:如果我们要保存一个精度高的数,则应该选择float64
3、浮点型的存储分为三部分,符号位+指数位+尾数位 在存储过程中,精度会有丢失
3.9.4浮点型的使用细节
1、Golang浮点类型有固定的范围和字段长度,不受具体OS(操作系统)的影响。
2、Golang的浮点型默认声明为float64类型
3、浮点型常量有两种表示形式
十进制数形式 :如:5.12 .512(必须有小数点)
科学技术法形式:如:5.1234e2=5.12*10的2次方 5.12E-2 = 5.12/10的2次方
4、通常情况下,应该使用 float64,因为他比float32更精确。
3.10字符类型
3.10.1基本介绍
Golang中 没有专门的字符类型,如果要存储单个字符(字母),一般用byte来保存。
字符串是一串固定长度的字符连接起来的字符序列。Go的字符串室友单个字节连接起来的,也就是说对于传统的字符串是由字符组成的,而Go的字符串不同,它是由字节组成的。
package main
import "fmt"
func main() {
var c1 byte = 'a'
var c2 byte = '0' //字符的0
//当我们直接输出byte值,就是输出了的对应的字符的码值
// ‘a’ ==》
fmt.Println("c1=", c1)
fmt.Println("c2=", c2)
//如果我们希望输出对应字符,需要使用格式化输出
fmt.Printf("c1=%c c2=%c\n", c1, c2)
//var c3 byte = '北' //overflow溢出
var c3 int = '北' //overflow溢出
//fmt.Printf()[字符串形式,格式化符号以 % 开头, %s 字符串格式,%d 十进制的整数格式。]
fmt.Printf("c3=%c c3对应码值=%d",c3 ,c3)
}
对上述代码的说明
1)如果我们保存的字符在ASCII表中,比如[0-10,a-z,A-Z...]直接可以保存到byte中
2)如果我们保存的字符对应的码值大于255,这时我们可以考虑使用int类型保存
3)如果我们需要安装字符的方式输出,这是我们需要格式化输出,即fmt.Printf("%c" , c1)..
3.9.2字符的使用细节
1)字符常量是用单引号(’ ‘)括起来的单个字符。例如:var c1 byte = ‘a’ var c2 int = ‘中’ var c3 byte = ‘9’
2)Go中语序使用转义字符‘\’来将其后的字符转变成特殊字符常量。例如:var c3 char = ‘\n’ //’\n’表示换行符
3)go语言的字符使用UTF-8编码(查询UTF-8编码表)
(http://www.mytju.com/classcode/tools/encode utf8.asp)
英文字母-1个字节 汉字-3个字节
4)在Go中,字符的本质是一个整数,直接输出是,是该字符对应的UTF-8编码的码值
5)可以直接给某个变量赋一个数字,然后按格式化输出是%c,会输出改数字对应的unicode字符
var c4 int = 22269 // 22269-> '国' 120 ->'x'
fmt.Printf("c4=%c", c4)
`
6)字符类型是可以进行运算的,相当于一个整数,因为它都对应Unicode码。
var n1 = 10 + 'a' // 10 + 97 = 107
fmt.Println("n1=", n1) //输出107
`
3.10.3字符类型本质探讨
1)字符型存储到计算机中,需要将字符对应的码值(整数)找出来
存储:字符->对应码值–>二进制>存储
读取:二进制->码值->字符>读取
2)字符和码值的对应关系是通过字符编码表决定的(是规定好)
3)G0语言的编码都统一成了UTF-8。非常的方便,很统一,再也没有编码乱码的困扰了。
3.10.4布尔类型(bool)
基本介绍
1)布尔类型也叫bool类型,bool类型数据值允许取值true和false
2)bool类型占1个字节
3)bool类型适于逻辑运算,一般用于程序流程控制
->if条件控制语句
->for循环控制语句
案例演示
package main
import (
"fmt"
"unsafe"
)
func main() {
var b = false
fmt.Println("b=", b)
//bool类型占用的存储空间是一个字节
fmt.Println("b 的占用空间 =",unsafe.Sizeof(b))
//bool类型只能取true或者false
}
`
使用细节说明
不可以用0或非0的整数替代true和false
3.10.5字符串类型:string
基本介绍
字符串就是一串固定长度的字符连接起来的字符序列。G0的字符串是由单个字节连接起来的。G0语言的字符串的字节使用UTF-8编码标识Unicode文本
入门案例:
package main
import "fmt"
//演示Golang中string类型的使用
func main() {
//string的基本使用
var address string = "北京长城 110 hello world!"
fmt.Println(address)
}
3.10.6注意事项和使用细节
1)Go语言的字符串的字节使用UTF-8编码标识Unicode文本,这样Golang统一使用UTF-8编码,中文
乱码问题不会再困扰程序员。
2)字符串一旦赋值了,字符串就不能修改了:在Go中字符串是不可变的。
3)字符串的两种表示形式
(1)双引号,会识别转义字符
(2)反引号(``),以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果
4)字符串的拼接方式
`
var str = "hello" + "world"
str += "haha"
fmt.Println(str)
·
5)当拼接字符串过长时,可以分行写,注意:需要将+保留在上一行
// 当一个拼接的操作很长时,可以分行写,注意:需要将加号保留在上一行
str4 :="hello" + "world" + "hello" + "world" + "hello" + "world" +
"hello" + "world" + "hello" + "world" + "hello" + "world" +
"hello" + "world"
fmt.Println(str4)
3.10.7基本数据类型的默认值
![在这里插入图片描述](https://img-blog.csdnimg.cn/2e5eb77a351d409ea96c6ba45ade0255.png)
在go中,数据类型都有一个默认值,当程序员没有赋值时,就会保留默认值,在Go中,默认值又叫零值
var a int //0
var b float32 //0
var c float64 //0
var isMarried bool //false
var name string //""
//这里的%v表示按照变量的值输出
fmt.Printf("a=%d,b=%f,c=%f,isMarryied=%v",a,b,c,isMarried,name)
·
3.11基本数据类型的转换
3.11.1基本介绍
Golang和java/c不同,Go在不同类型的变量之间赋值时需要显式转换。也就是说Golang中数
据类型不能自动转换
。
3.11.2基本语法
表达式T(v)将值v转化为类型T
T:就是数据类型,例如int32,int64,float32等等 v:就是需要转换的变量
案例演示
package main
import "fmt"
//演示Golang中基本数据类型的转换
func main() {
var i int = 100
//希望将 i =》转换为float
var n1 float32 = float32(i)
var n2 int8 = int8(i)
var n3 int64 = int64(i) //低精度——>高精度
fmt.Printf("i=%v n1=%v n2=%v n3=%v",i,n1,n2,n3)
}
输出结果:
基本数据类型的转换的注意事项
1)G0中,数据类型的转换可以是从表示范围小->表示范围大,也可以范围大-->范围小
2)被转换的是变量存储的数据(即值),变量本身的数据类型并没有变化!
3)在转换中,比如将 int64 转换成 int8,编译时不会报错,只是转换的结果是按溢出处理。
3.12基本数据类型和string的转换
3.12.1介绍
在程序开发中,我们经常需要将基本数据类型转成string类型
或者将string类型转换成基本数据类型
3.12.2基本数据类型转string类型
方式一:fmt.Sprintf("%参数",表达式)(开发中推荐使用该种方式)
1)参数需要和表达式的数据类型相匹配
2)fmt.Sprintf()…会返回转换后的字符类型
函数的介绍
package main
import "fmt"
//演示Golang中基本数据类型转string
func main() {
var num1 int = 99
var num2 float64 = 23.456
var b bool = true
var mychar byte = 'h'
var str string //空的str
//使用第一种方式转换 fmt.Sprintf方法
str = fmt.Sprintf("%d",num1)
fmt.Printf("str type %T str=%v\n", str, str)
str = fmt.Sprintf("%f",num2)
fmt.Printf("str type %T str=%v\n", str, str)
str = fmt.Sprintf("%t",b)
fmt.Printf("str type %T str=%q\n", str, str)
str = fmt.Sprintf("%c",mychar)
fmt.Printf("str type %T str=%q", str, str)
}
`
方式二:使用strconv包的函数
var num5 int64 = 4567
str = strconv.Itoa(int(num5))
fmt.Printf("str type %T str=%q\n", str, str)
3.13string类型转基本数据类型
1)使用strconv包的函数
package main
import (
"fmt"
"strconv"
)
//演示Golang中string转成基本数据类型
func main() {
//转bool
var str string = "true"
var b bool
//strconv.ParseBool(str)会返回两个值(value bool,err error)
//因为只想获取到value bool,不想获取err,所以忽略
b, _ = strconv.ParseBool(str)
fmt.Printf("b type %T b=%v\n", b, b)
//转int
var str2 string = "1234590"
var n1 int64
var n2 int
n1,_= strconv.ParseInt(str2, 10,0)
n2 = int(n1)
fmt.Printf("n1 type %T n1=%v\n", n1, n1)
fmt.Printf("n2 type %T n2=%v\n", n2, n2)
//转float
var str3 string = "123.456"
var f1 float64
f1,_ = strconv.ParseFloat(str3, 64)
fmt.Printf("f1 type %T f1=%v", f1, f1)
}
`
说明:因为返回的是int64或者float64,如果希望要得到int32或者float32等进行如下处理
var num5 int32
num5 = int32(num)
注意事项:在将String类型转成基本数据类型是,要确保String类型能够转成有效的数据,比如 可以把“123”,转成一个整数,但是不能吧“hello”转成一个整数,如果给这样做,Golang直接将其转成0,其他类型也是将其转成默认值:float=>0 bool=>false
package main
import (
"fmt"
"strconv"
)
//演示Golang中string转成基本数据类型
func main() {
//注意:
var str4 string = "hello"
var n3 int64
n3,_ = strconv.ParseInt(str4,10,64)
fmt.Printf("n3 type %T n3=%v", n3, n3)
}
`
3.14指针
3.14.1基本介绍
1)基本数据类型,变量存的就是值,也叫做值类型
2)获取变量的地址,用&,比如:var num int ,获取num的地址,&num
3)指针类型,指针变量存的是一个地址,这个地址指向的空间存的才是值
比如:var ptr int = &num //ptr是一个指针变量,ptr的类型是int,ptr本身的值是&i
4)获取指针类型所指向的值,使用:*
5)举例说明
var num int = 1
var i = 999
var ptr *int = &i
3.14.2指针使用细节
1)值类型,都有对应的指针类型,形式为数据类型,int的指针int,float指针*float
2)值类型包括:基本数据类型int系列,float系列,bool,string、数组和结构体struct
值类型和引用类型
常见的值类型和引用类型
1)值类型:基本数据类型int系列,float系列,bool,string、数组和结构体struct
2)引用类型:指针、slice切片、map、管道chan、interface等都是引用类型
值类型和引用类型的使用特点
1)值类型:变量直接存储值,内存通常在栈中分配
示意图:
·
2)引用类型,变量存储的是一个地址,这个地址对应的空间才真正存储数据(值),内存通常在对上分配,当没有任何变量引用这个地址时,该地址对应的数据空间就成为一个垃圾,由GC来回收。
示意图:
·
3)内存的堆区和栈区的示意图
Golang中根据使用时间来区分进行存放
3.15Golang中标识符的命名规范
3.15.1 标识符的概念
1)Golang对各种变量、方法、函数等命名时使用的字符序列称为标识符
2)凡是自己可以起名字的地方都叫标识符,例如var num int
3.15.2标识符的命名规则
1)由26个英文字母大小写,0-9,组成
2)数字不可以开头
3)Golang中严格区分大小写
4)标识符不能包含空格
5)下划线“”本身是Go中一个特殊的标识符,称为空标识符。可以代表任何其他的标识符,但是它对应的值会被忽略(比如:忽略某个返回值)。所以仅能被作为占位符使用,不能作为标识符使用。
6)不能以系统保留关键字作为标识符,比如break,if 等等…
保留关键字(共25个)
3.15.3标识符命名的注意事项
1)包名:保持package的名字和目录保持一致,尽量采取有意义的包名,简短,有意义,不要和标注库冲突。
2)变量名、函数名、常量名:采用驼峰法
举例:var stuName string = “tom”
3)如果变量名、函数名、常量名首字母大写,则可以被其他包访问;如果首字母小写,则只能在本包中使用(首字母大写就是公开的,首字母小写就是私有的)