Go_Web 编程
文章目录
几个注意的点:
1、大写字母开头的变量是可导出的,也就是其它包可以读取的,是公用变量;小写字母开头的就是不可导出的,是私有变量。大写字母开头的函数也是一样,相当于 class 中的带 public 关键词的公有函数;小写字母开头的就是有 private 关键词的私有函数。
2、golang 的==引用类型==包括 slice、map、channel、function、pointer 等. 它们在进行赋值时拷贝的是指针值,但拷贝后指针指向的地址是相同的.
2022.7.27
1、bin 目录下面存的是编译之后可执行的文件,pkg 下面存放的是函数包,src 下面保存的是应用源代码(.go文件)。
iota枚举
1.Go 里面有一个关键字 iota,这个关键字用来声明 enum 的时候采用,它默认开始值是 0 每调用一次加 1(但是遇到一个const关键字iota就会重置)。
1.0array、slice、map
Slice
1、slice 通过 array[i:j]来获取,其中 i是数组的开始位置,j 是结束位置,但不包含 array[j],它的长度是 j-i。
对于 slice 有几个有用的内置函数:
• len 获取 slice 的长度
• cap 获取 slice 的最大容量
map
使用 map 过程中需要注意的几点:
• map 是无序的,每次打印出来的 map 都会不一样,它不能通过 index 获取,而必须通过 key 获取
• map 的长度是不固定的,也就是和 slice 一样,也是一种引用类型
• 内置的 len 函数同样适用于 map,返回 map 拥有的 key 的数量
• map 的值可以很方便的修改,通过 numbers[“one”]=11 可以很容易的把 key 为 one的字典值改为 11
make、new 操作
make 用于内建类型(map、slice 和 channel)的内存分配。new 用于各种类型的内存分配。make 只能创建 slice、map 和 channel,并且返回一个有初始值(非零)的 T 类型,而不是*T。
- new 返回指针。(*T)
- make 返回初始化后的(非零)值。(T)
2.3 流程和函数
流程控制
流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑。流程控制包含分三大类:条件判断,循环控制和无条件跳转。
goto
Go 有 goto 语句——请明智地使用它。用 goto 跳转到必须在当前函数内定义的标签。例如假设这样一个循环:
func myFunc() {
i := 0
Here: //这行的第一个词,以冒号结束作为标签
println(i)
i++
goto Here //跳转到 Here 去 }
标签名是大小写敏感
switch
语法如下:
switch sExpr {
case expr1:
some instructions
case expr2:
some other instructions
case expr3:
some other instructions
default:
other code
}
变参
arg …int 告诉 Go 这个函数接受不定数量的参数。注意,这些参数的类型全部是 int。在函数 体中,变量 arg 是一个 int 的 slice:
func myfunc(arg ...int) {}
传值与传指针
传变量就是传值(copy),传变量的地址就是传指针
优点:
1.指针比较轻量级(8byte),变量占用的内存大。
2.多个函数可以操作同一个对象。
defer
延迟语句
在 defer 后指定的函数会在函数退出前调用,采用的是后进先出的模式。
函数作为值、类型
在 Go 中函数也是一种变量,我们可以通过 type 来定义它,它的类型就是所有拥有相同的
参数,相同的返回值的一种类型。
优点:
就是可以把这个类型的函数当做值来传递。
Panic 和 Recover
Go 没有像 Java 那样的异常机制,它不能抛出异常,而是使用了 panic 和 recover 机制
Panic
是一个内建函数,可以中断原有的控制流程,进入一个令人恐慌的流程中。当函数 F 调用
panic,函数 F 的执行被中断,但是 F 中的延迟函数会正常执行,然后 F 返回到调用它的地
方。在调用的地方,F 的行为就像调用了 panic。这一过程继续向上,直到发生 panic 的
goroutine 中所有调用的函数返回,此时程序退出。恐慌可以直接调用 panic 产生。也可以由
运行时错误产生,例如访问越界的数组。
Recover
是一个内建的函数,可以让进入令人恐慌的流程中的 goroutine 恢复过来。recover 仅在延迟
函数中有效。在正常的执行过程中,调用 recover 会返回 nil,并且没有其它任何效果。如果当
前的 goroutine 陷入恐慌,调用 recover 可以捕获到 panic 的输入值,并且恢复正常的执行。
main函数和 init函数
Go 里面有两个保留的函数:init 函数(能够应用于所有的 package)和 main 函数(只能应
用于 package main)。这两个函数在定义时不能有任何的参数和返回值。虽然一个 package
里面可以写任意多个 init 函数,但这无论是对于可读性还是以后的可维护性来说,我们都
强烈建议用户在一个 package 中每个文件只写一个 init 函数。
执行顺序 :先导入包---->>然后执行init()函数----->>执行main()函数。
import
相对路径
import “./model” //当前文件同一目录的 model 目录,但是不建议这种方式来 import
绝对路径
import “shorturl/model” //加载 gopath/src/shorturl/model 模块
上面展示了一些 import 常用的几种方式,但是还有一些特殊的 import,让很多新手很费解,
下面我们来一一讲解一下到底是怎么一回事
点操作
我们有时候会看到如下的方式导入包import( . “fmt”)
这个点操作的含义就是这个包导入之后在你调用这个包的函数时,你可以省略前缀的包名,
也就是前面你调用的 fmt.Println(“hello world”)可以省略的写成 Println(“hello world”)
别名操作
别名操作顾名思义我们可以把包命名成另一个我们用起来容易记忆的名字
import( f “fmt”)
别名操作的话调用包函数时前缀变成了我们的前缀,即 f.Println(“hello world”)
_操作
这个操作经常是让很多人费解的一个操作符,请看下面这个 import
import ( “database/sql”
_ “github.com/ziutek/mymysql/godrv”
)
_操作其实是引入该包,而不直接使用包里面的函数,而是调用了该包里面的 init 函数。
2.4 struct 类型
struct
type TypeName struct{
字段名 类型,
}
struct 的匿名字段
嵌入,把一个结构体嵌入另一个结构体
2.5 面向对象
method
自定义类型中定义method
1.类似java 的面对对象,就是一个结构体实现了某个方法 func (结构体变量 结构体)函数名(){}。
method 继承
说白了就是结构体属性的嵌套,把一个结构体嵌入到另一个结构体里面,然后另一个结构体就继承了前一个结构体实现的method
method 重写
说白了就是同一个函数名对应不同的结构体实现的method。