go语言基础学习笔记总结1

  1. go语言的目录结构
  2. go语言执行的分析流程
  3. go语言的开发注意事项
  4. go的变量
  5. 常量
  6. 输入输出格式
  7. 类型转换
  8. 循环和分支
  9. 函数
  10. 局部变量和全局变量

一、目录结构

在环境变量中设置GOPARH,项目就到GOPARH指定的目录中运行

为了更好的管理项目中的文件,要求将文件都要放在相应的文件夹中。GO语言规定如下的文件夹如下:。

  1. src目录:用于以代码包的形式组织并保存Go源码文件。(比如: gophs等)。
  2. pkg 目录:用于存放经由go install命令构建安装后的代码包(包含Go库源码文件)的“a"归档文件。
  3. bin目录:与pkg目录类似,在通过go install命令完成安装后,保存由Go命令源码文件生成的可执行文件。

在go语言中包的定义和使用: 定义包名要和目录名相同,在scr下的包名可以为main

在导入包名和调用自定义其它包的时候,尽量使用相对路径,不然他会按照你设置的GOPARH进行搜索了

如:在scr的main文件中调用scr/user1/uz.go中的函数时

import "./user1"

二、执行流程控制

1、如果先编译go buile再运行
go语言基础学习笔记总结1_第1张图片
2、直接运行(他把编译的这个环节给隐藏了)
直接go文件通过go run来进行运行
go语言基础学习笔记总结1_第2张图片

两种运行的区别:
1)如果我们先编译生成了可执行文件,那么我们可以将该可执行文件拷贝到没有go开发环
境的机器上,仍然可以运行
2)如果我们是直接go run go源代码,那么如果要在另外- -个机器上这么运行,也需要go
开发环境,否则无法执行。
3)在编译时,编译器会将程序运行依赖的库文件包含在可执行文件中,所以,可执行文件
变大了很多。

三、go语言的开发注意事项

  1. Go源文件以"go"为扩展名。
  2. Go应用 程序的执行入口是main()方法。
  3. Go语言严格区分大小写。
  4. Go方法由-条条语句构成,每个语句后不需要分号(Go语言会在每行后自动加分号),这也体现出Golang的简洁性。
  5. Go编译器是一 行行进行编译的,因此我们一行就写一条语句,不能把多条语句写在同一个,否则报错
  6. go语言定义的变量或者import的包如果没有使用到,代码不能编译通过。
  7. 大括号都是成对出现的,缺一不可。

四、变量

go语言基础学习笔记总结1_第3张图片
变量声明:var 变量名 类型= 值

如果类型相同,一次可以声明多个变量 ,如var a,b,c int

如var sun int 声明了一个int型的变量,默认为0

自动推导类型 变量名 :=值

注意事项

  1. 所有的字节byte都对应一个ascall码,println会输出ascall码,要输出值printf(“%c”,变量)0对于48,a对应97,A对于65
  2. int和int64相互之间页需要类型转换,转换为int就是int(变量名),转换为int64就是int64(变量名)
  3. 字符用单引号(‘’),字符串用双引号(“”),在使用字符串双引号时系统会自动在后面添加一个结束标志\0,输出时会输出\0前所有的字符,但是字符没有

1、整型

2、浮点型

3、字节型

4、字符串型

go语言基础学习笔记总结1_第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()进行格式化输出
go语言基础学习笔记总结1_第5张图片

输入

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

注意:在不定参数后面不可以加参数,不然只会把一个只给不定参数,其它值给后面的参数

十、作用域

作用域分为局部作用域和全局作用域

在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)
}

全局变量注意的一些方面:

  1. 在函数外部定义的变量 成为全局变量
  2. 作用域是在项目中整个文件去使用
  3. 定义的全局变量名不能和其他文件中的全局变量重名
  4. 全局变量名可以和局部变量名重名
  5. 全局变量储存在内存的数据区
  6. 如果全局变量定义

你可能感兴趣的:(go基础)