1.1Golang语言
1.1.1简介
Go语言保证了即能静态编译语言的安全和性能,又达到了动态语言考法维护的高效率,Go=C+Python,说明Go语言既有C语言开发维护的高效率,又能达到python快速开发的高效率。
1.1.2特点
1)从C语言中继承了很多理念,包括表达式语法,控制结构,基础数据类型,调用参数传值,指针等也保留了和C语言一样的编译执行方式及弱化的指针
2)引入了包的概念,用于组织程序结构,Go语言的一个文件都要归属于一个包,而不能单独存在。
3)垃圾回收机制,内存自动回收,不需要开发人员管理
4)天然并发
(1)从语言层面支持并发,实现简单
(2)groutine,轻量级线程,可实现大并发处理,高效利用多核
(3)基于CPS并发模型实现
5)吸收了管道通信机制,形成Go语言特有的管道channel通过管道channel,可以是西安不同的goroute之间的相互通信
6)函数可以返回多个值
7)新的创新:比如切片slice、延时执行defer
1.2GOlang常用的转义字符
1) \t :一个制表位,实现对齐功能
2) \r:一个 回车,从当前的最前面开始输出,覆盖掉以前内容
和C同
1.3常见DOS命令
1)md test100 新建文件夹test100,多个目录用空格间隔就可
2)dir 查看当前目录下的文件夹和文件
3)cd /d d: 切换到d盘下
4)cd .. 回到上级目录
5)cd\ 回到根目录
6)rd test100 删除test100,只能删除空文件夹
7)rd /q/s test100 /q不用询问; /s包括子文件夹和文件
8)rd /s test100 询问,选择是否删除后在删除
9)echo hello 向当前文件写入hello
10)echo hello >d:\test100\abc.txt 向d:\test100\abc.txt这个路径的文件写入hello
11)copy abc.txt d:\text200\ok.txt 拷贝当前文件下的abc.txt到指定目录下的文件,其中如此例中的ok.txt系统可自己建立
12)move abc.txt d:\text200 移动当前文件夹下面的abc.txt到指定路径下面
13)del abc.txt 删除当前文件夹下面的abc.txt
14)del *.txt 删除当前文件夹下面的所有 .txt
15)cls 清屏
16)exit 退出
绝对路径:从当前盘的盘符最上面开始定位,比如D:开始找到需要的文件路径 cd /d d:test100
相对路径:从当前位置开始定位,去找对应的目录。找这个文件夹下面的子文件或者文件夹。cd test100
1.4安装GO及配置环境变量
1.4.1Go语言的SDK
SDK就是软件开发工具包,我们做GO开发,首先需要先安装并配置好SDK
1.4.2GOlang环境变量配置及其作用
GPROOT:指定go sdk安装目录;
Path:指令 sdk\bin 目录,
GOPATH:就是golang工作目录,项目的源码存放在此目录下
1.4.3golang程序的编写、编译、运行步骤
编写:写源码;编译:go build 源码-》生成二进制可执行文件
运行:1)对.exe 可执行文件运行,速度较快;2)go run 源码
1.5golang程序编写规则
1)go文件的后缀.go
2)go程序区分大小写
3)go语句后不需要写分号,系统自动生成
4)go语句中引用的import包和定义的变量必须使用,否则报错。
5)go中不能把多条语句放在同一行,否则报错
6)go中的大括号成对出现,注意代码风格
2.1变量
2.1.1变量的概念
内存中一个数据存储空间的表示;定义(声明)-》赋值-》使用
2.1.2变量使用注意事项
1)指定变量类型,声明后若不赋值默认0
2)根据值类型推导变量类型
例如:var num=10.1 则num为浮点数
3)省略var,注意:=左侧的变量不因该是已经声明过的,否者会导致编译错误
例如:name:="tom" (等价于var name string name="tom")
4)多变量声明
例如1:var nan1,nan2,nan3 int
例如2:var n1,name,m3=100,"tom",300 一一对应
例如3:n1,name,m3:=100,"tom",300 一一对应
例如4:全局声明
var n1=100
var n2=200
var n3=300
也可改写成:
var(
n1=100
n2=200
n3=300
)
5)该区域的数据值可以在同一类型范围内不断变化
var i int =10
i=20
i=30
i如果赋值为1.1则会报错,可改变数值类型,但是不可以改变类型
6)变量在同一一个作用域不可重名
7)变量三要素:变量名+值+数据类型
8)Golang的变量如果么有赋初值,编译器会使用默认值,int型默认0;string类型默认空串
2.1.3声明变量、初始化、赋值
1)声明变量
基本语法:var 变量名 数据类型
var a int 这就是声明了一个变量,变量名是a;
var num1 float32 声明一个单精度小数类型变量名num1
2)初始化变量
在声明变量时就给值
var a int=45
使用细节:如果声明时就直接赋值,可省略数据类型
var a=12
3)赋值
先声明变量,后赋值
2.2程序中+的使用
1)当左右两边都是数值型时,则做加法运算
2)当左右两边都是字符串时,则做字符串拼接
2.3整数类型
2.3.1常见整数类型
类型 有无符号 占用存储空间 表数范围
int8 有 1字节 -128-127
int16 有 2字节 -2^15-2^12-1
int32
int64
uint8 无 1字节 0-255
uint16 无 2字节 0-2^16-1
uint32
uint64
int 有 32位系统4字节,64位系统8字节
uint 有 同上
rune 有 与int32一样(表示一个unicode码)
byte 无 与int8等价(用于存储单个字符)
2.3.2整数使用细节
1)Golang的整型默认声明为int型
2)如何在程序查看某个变量的字节大小和数据类型
数据类型:fmt.printf("%T",i)
字节大小:
3)Golang程序中整数变量在使用时,遵守保小不保大的原则,即:在保证程序正确运行的情况下,尽量使用占用空间小的数据类型
4)bit:计算机中最小的存储单位;byte计算机中基本存储单元
1byte=8bit
2.4浮点型
2.4.1基本介绍
用于存放小数,比如:1.12
类型 占用存储空间 表数范围
单精度float32 4字节 -3.403E38-3.403E38
双精度double64 8字节 -1.798E308-1.798E308
说明:
1)关于浮点数在计算机中的存储形式:浮点数=符号位+指数为+尾数位
2)尾数部分可能丢失,照成精度损失
2.4.2浮点数使用细节
1)Golang浮点数类型有固定的范围和字段长度,不是具体操作系统影响
2)Golang的浮点类型默认float64
3)十进制数形式:2.12;.13
4)支持科学计数法形式
5)通常开发情况下使用float64
2.5字符类型
2.5.1基本介绍
Golang中没有专门的字符类型,如果要存储单个字符,一般使用byte来保存。字符串就是一串固定长度的字符链接起来的字符序列。Go的字符串是由单个字节链接起来的。就是说对于传统的字符串是由字符组成的,而Go的字符串不同,它是由字节组成的。
其它计算机语言也是由字节组成。
说明:
1)如果我们保存的字符在ASCII表中,比如{0-1,a-z,A-Z}可以直接保存到byte
2)如果我们保存的字符对应码值大于255,这时我们因该考虑使用int类型保存
3)输出字符 使用格式化输出-%c
2.5.2字符类型使用细节
1)字符常量是用单引号('')括起来的单个字符。
2)Go中允许使用转义字符'\'来将其后的字符转变为特殊字符型常量。
3)Go语言的字符使用UTF-8编码,英文1字节,汉字3字节
4)在Go中字符的本质是一个整数,直接输出时,是该字符对应的UTF-8编码的码值。
5)可以直接给某个变量赋一个数字,然后按格式化输出时%c,会输出unicode字符
6)字符类型都是可以运算的相当于Unicode码
2.5.3字符类型本质探讨
1)字符型 存储到计算机中,需要将字符对应的码值找出来
存储:字符-->对应码值-->二进制-->存储
读取:二进制-->码值-->字符-->读取
2)字符和码值的对应关系是事先通过UTF-8决定好的
2.6布尔类型
2.6.1基本介绍
1)布尔类型也叫bool类型,bool类型数据只允许取值true和false
2)bool类型占一个字节。
3)bool适用于逻辑运算,一般用于程序流程控制——if、for
2.7string类型
2.7.1基本介绍
字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是用单个字节连接起来的,使用UTF-8编码标识的Unicode文本
2.7.2使用注意事项和细节
1)统一编码,这样就不会照成乱码
2)字符串一旦赋值了就不能修改,即不能修改字符串中的某个字符。比如:str[0]=b;
3)字符串的两种表现形式
(1)双引号,会识别转移字符
(2)反引号,以字符串的原生形式输出。包括换行和特殊字符,可以实现防止攻击、输出源代码等效果。
4)字符串拼接
'+'号连接,如果字符串太长+一定要写在上一行
2.8基本数据类型的默认值
2.8.1基本介绍
在Go中,当程序员没有给一个变量赋值时,就会保留默认值
2.8.2基本数据默认值
数据类型 默认值
整型 0
浮点型 0
字符串型 ""
布尔类型 false
2.9基本数据类型的相互转换
2.9.1基本介绍
Golang和java/c不同,Go在不同类型的变量之间赋值需要显示转换。不能自都转换
2.9.2基本语法
表达式: T(v) 将值v转换为类型T
T:就是数据类型,比如int32,int64,float32等
v:需要转换的变量
基本数据类型相互转换的注意事项
1)Go中,数据类型的转换可以是从表示范围小-->表示范围大,也可以从表示范围大-->表示范围小
2)被转换的是变量的值,变量本身数据类型没有变化!
3)在转换过程中从表示范围大-->表示范围小如果超过了表示范围会按照溢出处理,不会报错。
2.10基本数据类型和string的转换
2.10.1基本介绍
在程序开发中,经常需要string和基本数据类型的转换
2.10.2基本类型转string类型
方法1:fmt.Sprintf("%参数“,表达式)
参数需要和表达式的类型相匹配
方法2:strconv包的函数
1)func FormatBool
func FormatBool(b bool) string
根据b的值返回"true"或"false"。
2)func Formatint
func FormatInt(i int64, base int) string
返回i的base进制的字符串表示。base 必须在2到36之间,结果中会使用小写字母'a'到'z'表示大于10的数字。
3)func FormatUint
func FormatUint(i uint64, base int) string
是FormatInt的无符号整数版本。
4)formatFloat
func FormatFloat(f float64, fmt byte, prec, bitSize int) string
函数将浮点数表示为字符串并返回。
bitSize表示f的来源类型(32:float32、64:float64),会据此进行舍入。
fmt表示格式:'f'(-ddd.dddd)、'b'(-ddddp±ddd,指数为二进制)、'e'(-d.dddde±dd,十进制指数)、'E'(-d.ddddE±dd,十进制指数)、'g'(指数很大时用'e'格式,否则'f'格式)、'G'(指数很大时用'E'格式,否则'f'格式)。
prec控制精度(排除指数部分):对'f'、'e'、'E',它表示小数点后的数字个数;对'g'、'G',它控制总的数字个数。如果prec 为-1,则代表使用最少数量的、但又必需的数字来表示f。
5)func Itoa
func Itoa(i int) string
Itoa是FormatInt(i, 10) 的简写。
2.10.3string类型转基本数据类型
方法:使用strconv包的函数
1)func ParseBool
func ParseBool(str string) (value bool, err error)
返回字符串表示的bool值。它接受1、0、t、f、T、F、true、false、True、False、TRUE、FALSE;否则返回错误。
2)func ParseInt
func ParseInt(s string, base int, bitSize int) (i int64, err error)
返回字符串表示的整数值,接受正负号。
base指定进制(2到36),如果base为0,则会从字符串前置判断,"0x"是16进制,"0"是8进制,否则是10进制;
bitSize指定结果必须能无溢出赋值的整数类型,0、8、16、32、64 分别代表 int、int8、int16、int32、int64;返回的err是*NumErr类型的,如果语法有误,err.Error = ErrSyntax;如果结果超出类型范围err.Error = ErrRange。
3)func ParseUint
func ParseUint(s string, base int, bitSize int) (n uint64, err error)
ParseUint类似ParseInt但不接受正负号,用于无符号整型。
4)func ParseFloat
func ParseFloat(s string, bitSize int) (f float64, err error)
解析一个表示浮点数的字符串并返回其值。
如果s合乎语法规则,函数会返回最为接近s表示值的一个浮点数(使用IEEE754规范舍入)。bitSize指定了期望的接收类型,32是float32(返回值可以不改变精确值的赋值给float32),64是float64;返回值err是*NumErr类型的,语法有误的,err.Error=ErrSyntax;结果超出表示范围的,返回值f为±Inf,err.Error= ErrRange。
2.10.3string转基本数据类型注意事项
将string转基本数据类型时,要确保string类型能够转成有效的数据。比如把”123“转成整数123,但是不能把”hello"转成一个整数
如果数据非有效数据这转成这个类型的默认值。
2.11指针
2.11.1基本介绍
1)基本数据类型,变量存的就是值,也叫值类型
2)获取变量的地址,用&,比如:var nam int,获取num的地址:&num
3)指针变量存的是一个地址,这个地址指向的空间存的才是值
比如:var ptr *int=&num,ptr类型为*int
4)获取指针类型所指向的值使用*,*ptr
2.11.2指针使用细节
1)值类型和对应的指针类型一一对应
2)值类型包括:基本数据类型int系列、float系列、bool、string、数组和结构体struct
2.12值类型和引用类型的使用特点
1)值类型:变量直接存储值,内存通常在栈中分配
2)引用类型:变量存储的是一个地址,这个地址对应的的空间才真正存储数据,内存通常在堆上分配,当没有变量引用这个地址时,该地址对应的数据空间就变成一个垃圾,由GC来回收。
2.13标识符的命名规范
2.13.1标识符概念
1)Golang对各种变量、方法、函数等命名时使用的字符序列称为标识符
2)凡是自己可以起名字的地方都叫标识符
2.13.2标识符的命名规则
1)由26个英文字母大小写,0-9,_组成
2)数字不能开头
3)标识符严格区分大小写
4)不能包含空格
5)不能单写_,"_"在Go中是一个特殊的标识符,称为空标识符。可以代表任何其他的标识符,但是他对应的值会被忽略。所以仅作为占位符使用,不能作为标识符使用
6)不能以系统保留关键字(25个)作为标识符,比如break,if等
2.13.3标识符命名注意事项
1)包名:保持package的名字和目录保持一致,尽量采取有意义的包名,简短、有意义,不要和标准库冲突。
2)变量名、函数名、常量名采用驼峰法
例如:var stuName string="tom"
3)如果变量名、函数名、常量名首字母大写,则可以被其他包访问;如果小写则只能在本包使用。
2.13.3系统保留关键字
25个,简化代码编译过程中对代码的解析
| break | default | func | interface | select |
| case | defer | go | map | struct |
| chan | else | goto | package | switch |
| const | fallthrough | if | range | type |
| continue | for | import | return | var |
2.13.4系统预定义标识符
36个预定义标识符,包括基础数据类型和系统内嵌函数
| append | bool | byte | cap | close | complex |
| complex64 | complex128 | uint16 | copy | false | float32 |
| float64 | imag | int | int8 | int16 | uint32 |
| int32 | int64 | iota | len | make | new |
| nil | panic | uint64 | println | real | |
| recover | string | true | uint | uint8 | uintprt |
3.运算符
3.1运算符的基本介绍
运算符是一种特殊的符号,用以标识数据的运算、赋值和比较等
3.2算术运算符
算术运算符是对数值类型的变量进行运算的,包括+、-、*、/、%、++、--、+(符号串相加)、+(正号)、-(负号)
注意:
除法运算"/"时,如果两边的数为整数,则计算的结果也为整数(舍弃小数部分)
%运算:a%b=a-a/b*b
只有后置++、--且比如a++只能独立使用,不能b=a++
3.3关系运算符
3.3.1基本介绍
1)关系运算符的结果都是bool型,也就是要么是true,要么是false
2)关系表达式经常用在if结构的条件中或循环结构的条件中
3)包括:==、!=、<、>、<=、>=
3.4逻辑运算
3.4.1基本介绍
用于链接多个条件(一般来讲就是关系表达式),最终的结果也是一个bool值
包括&&、||、!
3.4.2注意事项
1)&&也叫短路与:如果第一个条件为false,这第二个条件不会被判断
2)||也叫短路或:如果第一个条件为true,则第二个条件不会判断,最终结果为true
3.5赋值运算符
3.5.1基本介绍
赋值运算符就是将运算后的值,赋给指定的变量
包括:
=、+=、*=、-=、/=、%=
<<=:左移后赋值,C<<=2相当于C=C<<2
>>=:右移后赋值
&=、^=(按位异或后赋值)、|=
3.5.2赋值运算符的特点
1)运算顺序从右往左
2)赋值运算符的左边只能是变量,右边可以是变量、表达式、常量
3.6位运算(二进制参与运算)
&:两位全为1,结果为1,否者结果为0
|:两位中都为0,结果为0,否者结果为1
^:相同为0,不同为1
<<:符号位不变,低位补0,左移,相当于乘2
>>:低位溢出,符号位不变,并用符号位补溢出的高位,右移相当于除2
注意:计算机中位运算是数的补码参与运算
3.7其它运算符
&(取地址)、*指针变量取值
3.8特别说明
Go语言明确不支持三元运算符
如果要实现三运算符相同的效果,采用if-else结构
4.9运算符的优先级
1)后缀:()、[]、->、++、--
2)单目:+、-、!、~、*、&
3)乘法:*、/、%
4)加法:+、-
5)移位:<<、>>
6)关系:<、<=、>=
7)==、!=
8)&
9)^
10)|
11)&&
12)||
13)赋值运算
14)逗号
注意:只有单目运算、赋值运算符是从右往左,其他从左往右
3.10键盘输入语句
3.10.1介绍
在编程需要接受用户输入的数据,就可以使用键盘输入语句来获取。
3.10.2步骤
1)导入fmt包
2)调用fmt.Scanln()或者fmt.Scanf()
(1)func Scanf
func Scanf(format string, a ...interface{}) (n int, err error)
Scanf从标准输入扫描文本,根据format 参数指定的格式将成功读取的空白分隔的值保存进成功传递给本函数的参数。返回成功扫描的条目个数和遇到的任误。
例如:fmt.Scanf("%d,%f,%c",&a,&b,&c)
(2)func Scanln
func Scanln(a ...interface{}) (n int, err error)
Scanln类似Scan,但会在换行时才停止扫描。最后一个条目后必须有换行或者到达结束位置。
比如:fmt.Scanln(&name)
3.11原码、补码、反码
对于有符号的而言:
1)二进制的最高位为符号位:0表示正数,1表示负数
2)正数的原码、补码、反码都一样
3)负数的反码=原码符号位不变,逐位取反;补码=反码+1
5)0的反码补码都位0
6)在计算机运算过程中,都是以补码的方式运算的
4.程序流程控制在程序中,程序运行的流程控制决定程序是如何执行的,主要有顺序控制、分支控制、循环控制
4.1顺序控制
程序从上到下逐行的执行,中间没有任何判断和跳转
注意:变量、函数等必须先声明后使用(调用)
4.2分支控制
让程序有选择的执行,包括单分支、双分支、多分支
4.2.1单分支
基本语法:
说明:
1)if后的条件表达式建议不用括号括起来,括起来也没错
2){}是必须有的,不可省略
3)Golang支持在if中,直接定义一个变量,比如下面
4.2.2双分支控制
基本语法:
4.2.3多分支控制
基本语法:
说明;
1)else不是必须的
2)只执行一个代码块
4.2.4嵌套分支
在一个分支结构中又完整的嵌套了另一个分支结构,里面的分支结构称为内层分支,外面的分支结构称为外层分支
基本语法:
注意:嵌套的分支不易过多,建议控制在三层内
4.3switch分支控制
基本介绍:
1)switch 语句用于基于不同条件执行不同动作,每一个case分支都是唯一的,从上到下逐一测试,直到比配为止
2)匹配项后面不需要加break
4.3.1基本语法
说明:
1)switch的执行流程是,先执行表达式,得到值,然后和case的表达式进行比较,如果相等,就匹配到,然后执行对应的语句块,然后退出switch控制。
如果没有和任何case匹配,则执行default的语句块,然后退出switch控制
2)Golang中的case后的表达式可以有多个,使用逗号隔开
3)不要写break
4.3.2注意事项
1)case/switch后是一个表达式(常量、变量、有返回值的函数等)
2)case后的各个表达式的值的数据类型必须和switch的表达式数据类型一致
3)case后面的表达式如果是常量值,则要求不能重复
4)default语句不是必须的
5)switch后面可以不带表达式,case后面条件表达式,当if-else使用
6)switch后也可以直接声明/定义一个变量,分号结束,不推荐
例如:switch gread:=90;{
}
7)switch穿透-fallthrough,如果在case语句块后增加fallthrough,则会继续执行下一个case,也叫switch穿透
10)Type Switch:switch 语句可以被用于type-switch来判断某个interface变量中实际指向的变量 类型。
例如:
4.3.3switch和if的比较
1)如果判断的具体数值不多,而且符合整数、浮点数、字符、字符串这几种类型。建议使用switch语句
2)其他情况:对区间判断和结果为bool类型的判断,使用if,if的使用范围更广
4.4for循环控制
基本语法:
for 循环变量初始化;循环条件;循环变量迭代{
循环操作
}
注意事项和细节讨论:
1)循环是返回一个bool值的表达式
2)循环的第二种方式:
for 循环判断条件{
//循环体
}
将变量初始化写在for循环前面,迭代写在循环体内
3)for循环的第三种使用方式
for{
//循环体
}
等价于:for;;{}是一个死循环,结束循环需要break语句使用。
4)Golang提供for-range的方式,可以方便遍历字符串和数组
字符串遍历方式1—传统方式:
字符串遍历2—for -range:
说明:如果字符串遍历中包含中文,则不能采用传统方式。原因是传统的字符串遍历是按照字节来遍历的,go采用UTF-8编码,一个中文字符,对应3字节。
解决方法:1)for - range;2)将str转成[]rune 切片,如下
4.5while,do-while采用for循环实现
4.6多重循环控制
1)将一个循环放在另一个循环体内,就形成了嵌套循环。建议:一般使用两层,最多不要超过三成
2)只有当内层循环为false时跳出内层循环,开始下一次外层循环
3)外层循环m次,内层循环n次,总共循环次数m*n
4.6.1应用案例
1)统计3个班成绩情况,每个班有5名同学,求出各个班的平均分和所有班级的平均分[学生的成绩从键盘输入]
代码:
2)统计每个班的及格人数,每个班有5名同学
3)打印金字塔经典案例
4)打印九九乘法表
4.7跳转控制语句-break
4.7.1基本介绍
break语句用于终止某个语句块的执行,用于中断当前for循环或者跳出switch循环
语法格式:
{
……
break
……
}
注意事项:
break语句出现在嵌套语句中时,可以通过标签指明要终止的时哪一层的语句块。默认跳出最近一层循环。
例如:
4.7.2入门例题
1)随机生成1—100的一个数,直到生成了99这个数,看看一共用了几次?
2)100以内的连续整数求和,输出当第一次和大于20的当前整数
3)实现登录验证,有三次机会,如果用户名为“张三”,密码:999,提示登陆成功,否者提示还剩多少次机会
第二次循环有点小问题,下次来改吧,迭代升级水平
4.8跳转控制语句—continue
4.8.1基本介绍
continue语句用于结束本次循环,继续执行下一次循环
continue语句出现在多层嵌套 的循环语句体时,可以通过标签指明要跳转的是那一层循环。与break同
基本语法:
{
……
continue
……
}
4.8.2例题
1)打印1-100的奇数[使用for—continue]
2)从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序
3)有人100000元,每经过一个路口需要缴费,规则如下:
当现金>50000时,每次缴费5%
当现金小于50000时,每次缴费1000
变成计算该人可以经过多少个路口,使用for-break方式
4.9 跳转控制语句-goto
4.9.1基本介绍
1)Go语句的goto语句可以无条件的跳转到程序中指定的行
2)goto语句通常与条件语句配合使用。可以用来实现条件转移,跳出循环体等功能
3)在Go程序设计中一般不主张使用goto语句,以免造成程序流程的混乱,使理解和调试程序都产生困难
基本语法:
go label
……
label:语句
4.10跳转控制语句-return
4.10.1基本介绍
return 使用在方法或者函数中,表示跳出所在方法或者函数。
说明:
1)如果return是在普通的函数,则表示跳出该函数,不在执行后面的代码
2)如果return 在main函数,终止程序
5.函数5.1函数基本概念
为完成某一功能的程序指令(语句)的集合,称为函数
在Go中,函数分为自定义函数、系统函数
5.2函数的基本语法
func 函数名(形参列表)(返回值列表){
执行语句……
return 返回值列表
}
可以没有形参列表和返回值列表
5.3包
5.3.1概念
包的本质实际上就是创建不同的文件夹来存放文件。go的每一个文件都是属于一个包的,也就是说go是以包的形式来管理文件和项目目录结构的
一个包含文件的最小文件夹就是一个包
5.3.2包的三大作用
1)区分相同名字的函数、变量等标识符(同一个包中变量名和函数名不可以相同)
2)当程序文件很多时可以很好的管理项目
3)控制函数、变量等访问范围,即作用域
5.3.3包的相关说明
打包基本语法:package 包名
引入包的基本语法:import"包的路径“
5.3.4包使用的注意事项和细节讨论
1)在给一个文件打包时,该包对应一个文件夹,比如这里的utils文件夹对应的包名就是utils.文件的包名通常和文件所见的文件夹名一致,一般为小写字母
2)引入包的方式:
(1)import"包名”
(2)import(
"包名“
”包名“
)
先打包package ,再import指令
在import包时,路径从$GOPATH的src下开始,不用带src,编译器会自动从src下开始引入
3)为了让其它包的文件可以访问到本包的函数,这函数名的首字母、变量名需要大写,类似于其他语言的public
4)访问包名.函数名
5)取别名后原来的包名就不能使用了,用别名访问该包的函数和变量
将"model/utlis"重命名为utlis
6)如果要编译成一个可执行文件,就需要将这个包名声明为main,即 package main(语法规范)。如果写的是一个函数库,包名可以自定义。
- 生成可执行文件:编译的指令在GOPATH的项目目录下,编译路径不需要带src,从src下级目录下面开始带,编译器会自动带。
go build model/test
- 如果要指定到指定的路径下面且重命名:
go build -o bin/my.exe model/test
- 注意:编译时需要编译文件的文件夹。
- 项目目录结构如下
5.4返回return 语句
形如:func 函数名(形参列表)(返回值列表){
语句。。。。
return 返回值列表
}
注意:如果需要忽略某个返回值,使用_符号表示占位忽略
5.5递归
5.5.1例题
题1:
题2:
题3:
5.6函数使用的注意事项
func getSum(n1 int,n2 int) int {
return n1+n2
}
func myFun(funvar func(int,int) int,num1 int,num2 int) int {
return funvar(num1,num2)
}
func main(){
a:=getSum
fmt.Printf("a的类型%T,getSum的类型%T\n",a,getSum)//函数可以赋值给变量
res:=a(10,40)//变量的使用方式和函数同
fmt.Println("res=",res)
fmt.Printf("myFun(a,10,20)=%v",myFun(a,10,20))//函数作为参数调用
}
基本语法: type 数据类型别名 数据类型
type myInt int //这时myInt就等价int来使用了
8.支持对函数返回值命名
9.Go支持可变参数
- 支持0到多个参数
func sum (args...int) sum int{
}
- 支持1到多个参数
func sum (n1 int,args...int) sum int{
}
- 说明:1)args是slice切片,通过args[index]可以访问到各个值
2)如果一个函数的形参列表中有可变参数,则可变参数要放在形参列表最后
- 例题:编写一个函数sum ,可以求出1到多个int的和