- go语言的目录结构
- go语言执行的分析流程
- go语言的开发注意事项
- go的变量
- 常量
- 输入输出格式
- 类型转换
- 循环和分支
- 函数
- 局部变量和全局变量
一、目录结构
在环境变量中设置GOPARH,项目就到GOPARH指定的目录中运行
为了更好的管理项目中的文件,要求将文件都要放在相应的文件夹中。GO语言规定如下的文件夹如下:。
- src目录:用于以代码包的形式组织并保存Go源码文件。(比如: gophs等)。
- pkg 目录:用于存放经由go install命令构建安装后的代码包(包含Go库源码文件)的“a"归档文件。
- bin目录:与pkg目录类似,在通过go install命令完成安装后,保存由Go命令源码文件生成的可执行文件。
在go语言中包的定义和使用: 定义包名要和目录名相同,在scr下的包名可以为main
在导入包名和调用自定义其它包的时候,尽量使用相对路径,不然他会按照你设置的GOPARH进行搜索了
如:在scr的main文件中调用scr/user1/uz.go中的函数时
import "./user1"
二、执行流程控制
1、如果先编译go buile再运行
2、直接运行(他把编译的这个环节给隐藏了)
直接go文件通过go run来进行运行
两种运行的区别:
1)如果我们先编译生成了可执行文件,那么我们可以将该可执行文件拷贝到没有go开发环
境的机器上,仍然可以运行
2)如果我们是直接go run go源代码,那么如果要在另外- -个机器上这么运行,也需要go
开发环境,否则无法执行。
3)在编译时,编译器会将程序运行依赖的库文件包含在可执行文件中,所以,可执行文件
变大了很多。
三、go语言的开发注意事项
- Go源文件以"go"为扩展名。
- Go应用 程序的执行入口是main()方法。
- Go语言严格区分大小写。
- Go方法由-条条语句构成,每个语句后不需要分号(Go语言会在每行后自动加分号),这也体现出Golang的简洁性。
- Go编译器是一 行行进行编译的,因此我们一行就写一条语句,不能把多条语句写在同一个,否则报错
- go语言定义的变量或者import的包如果没有使用到,代码不能编译通过。
- 大括号都是成对出现的,缺一不可。
四、变量
变量声明:var 变量名 类型= 值
如果类型相同,一次可以声明多个变量 ,如var a,b,c int
如var sun int 声明了一个int型的变量,默认为0
自动推导类型 变量名 :=值
注意事项
- 所有的字节byte都对应一个ascall码,println会输出ascall码,要输出值printf(“%c”,变量)0对于48,a对应97,A对于65
- int和int64相互之间页需要类型转换,转换为int就是int(变量名),转换为int64就是int64(变量名)
- 字符用单引号(‘’),字符串用双引号(“”),在使用字符串双引号时系统会自动在后面添加一个结束标志\0,输出时会输出\0前所有的字符,但是字符没有
1、整型
2、浮点型
3、字节型
4、字符串型
5、布尔型
五、常量
显式类型定义 : const 常量名 类型=值
隐式类型定义 : const 常量名=值
多个相同类型的声明可以简写为: const c_name1, c_name2 = value1, value2
注意:常量的值不允许查看地址也不能声明了不给值
ioa枚举常量
const(
a =iota
b
c =iota
d=123
e
f=iota
g
)
fmt.Println(a,b,c,d,e,f,g)
//结果为:0 1 2 123 123 5 6
iota第一个开始从0进行自增赋值
如果两个在一行中,并且都没有自定义赋值,iota数不会进行增加,
如果自定义变量,如果不用iota,那么变量会跟着这个自定义的一样
六、输入输出
输出
fmt.Println()和fmt.Print()的区别就是前者自带换行
使用fmt.Printf()进行格式化输出
输入
fmt.Scanf(&a)//可以直接进行接受输入
Fmt.Scanf(“%d %s”,&a,&b)//代表接受一个整数和一个字符串,其中要用空格进行隔开,不能使用换行
七、类型转换
建议地类型转成高类型,不然会导致数据精度
八、循环和分支
循环
for
for 初始化;条件;变化语句{
......
}
//这个for不像C语言,他不需要括号
在go语言中没有while,但是for也可以实现while
for 条件{
......
}
分支
if
if(){
......
}else if(){
......
}else{
......
}
switch
swicth 变量{
case 条件:
…
case 条件:
…
defualt:
…
}
九、函数
定义:
func 函数名(形参){
\\代码体
}
有返回值时的格式:在go中可以允许有多个放回值
func 函数名(形参)函数返回值{
\\代码体
}
例如:
package main
import "fmt"
func main() {
a:=10
b:=20
sum:=Add(a,b)
fmt.Println(sum)
}
func Add(a int,b int)int{
return a+b
}
匿名函数
函数字面量的语法和函数声明相似,区别在于func关键字后没有函数名
package main
import "fmt"
func main(){
sum :=func (a,b int)int{//把函数作为一个值赋值给sum
return a+b
}(10,20)//使用()直接进行调用
fmt.Println(sum)//函数地址
}
函数字面量的语法和函数声明相似,区别在于func关键字后没有函数名
通过匿名函数这种方式定义的函数可以访问完整的词法环境,就是定义的内部函数可以引用改函数的变量
func squares() func() int { //func() int 为返回值意思着squares的返回值是func(),二func()的返回值是int
var x int
return func() int {
x++
return x*x
}
}
func main() {
f := squares()
fmt.Printf("%T\n",f)
fmt.Println(f()) // "1"
fmt.Println(f()) // "4"
fmt.Println(f()) // "9"
fmt.Println(f()) // "16"
}
squares的例子证明,函数值不仅仅是一串代码,还记录了状态。在squares中定义的匿名内 部函数可以访问和更新squares中的局部变量,这意味着匿名函数和squares中,存在变量引 用。这就是函数值属于引用类型和函数值不可比较的原因。Go使用闭包(closures)技术实 现函数值,Go程序员也把函数值叫做闭包。
函数值
在go语言中,可以把函数看作一个类型的值对待
函数值属于引用类型和函数值不可比较,也不能用函数值作为map的key,但是可以和nil作比较
如果函数类型的零值是nil。调用值为nil的函数值会引起panic错误:
使用函数值,我们可以将遍历结点的逻辑和操作结点的逻辑分离,使得我们可以复用遍历的逻辑,从 而对结点进行不同的操作。(这个我还不知道什么意思)
可变参数
package main
import "fmt"
func main(){
te(1,2,3,4)
}
func te(arr ... int){
for i:=0;i<len(arr);i++{
fmt.Println(arr[i])//1,2,3,4
}
}
注意:在不定参数后面不可以加参数,不然只会把一个只给不定参数,其它值给后面的参数
十、作用域
作用域分为局部作用域和全局作用域
在for中的作用域
func main() {
i :=0
for i:=0;i<3;i++{
fmt.Println(i)//0,1,2
}
fmt.Println(i)//0
}
函数内为局部变量,函数外为全局变量
package main
import "fmt"
var a int = 10//定义全局变量a
func main() {
var a int =1
fmt.Println(a)
Add()
}
func Add()(){
fmt.Println(a)
}
全局变量注意的一些方面:
- 在函数外部定义的变量 成为全局变量
- 作用域是在项目中整个文件去使用
- 定义的全局变量名不能和其他文件中的全局变量重名
- 全局变量名可以和局部变量名重名
- 全局变量储存在内存的数据区
- 如果全局变量定义