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语言的开发工具

Go语言开发工具

2.4Windows下配置Golang环境变量

在Go开发中,需要配置那些环境变量
Go需要配置的环境变量

2.5Go语言快速入门

创建项目结构
1)目录结构说明
项目结构
2)代码如下:
第一个go程序,hello.go
对上图的说明
(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 指定编译后文件的名称+源代码文件名称。
在编译过程中,如果程序有错误,编译时,会在错误的那行报错。
在go文件编译过程中,程序错误,编译时,会在错误的那行报错

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)如果变量名、函数名、常量名首字母大写,则可以被其他包访问;如果首字母小写,则只能在本包中使用(首字母大写就是公开的,首字母小写就是私有的)

3.16预定义标识符

在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值