Golang入门学习(12)
Go的第12课——包管理
包
包可以区分命令空间(一个文件夹中不能有两个同名文件),也可以更好的管理项目。go
中创建一个包,一般是创建一个文件夹,在该文件夹里面的 go
文件中,使用package关键字声明包名称,通常,文件夹名称和包名称相同。并且,同一个文件下面只有一包。
创建包
新建一个文件夹,文件夹名就是包名,在里面所有的 go 文件中加入一句
package xxx。
比如我要创建一个 DAO 包。
1234567package DAOimport "fmt"func test() { fmt.Println("DAO:Test")}
导入包
要使用某个包下面的变量或者方法,需要导入该包,导入包时,要导入从
GOPATH 开始的包路径,例如,在 service.go
中导入 DAO 包,但是需要点小小的操作。
注意事项
一个目录下只能有一个package
import 后面的其实是GOPATH
开始的相对目录路径,包括最后一段。但由于一个目录下只能有一个package, ...
Golang入门学习(11)
Go的第11课——接口
接口
基本用法
接口像是一个公司里面的领导,他会定义一些通用规范,只设计规范,而不实现规范。
go
语言的接口,是一种新的类型定义,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。
语法格式和方法非常类似。
12345678910111213141516171819/*定义接口*/type interface_name interface { method_name1[return_type] method_name2[return_type] method_name3[return_type] ... method_namen[return_type]}/*定义结构体*/type struct_name struct{ /*variables*/}/*实现接口方法*/func(struct_name_variable struct_name)method_name1()[return_type]{ /*方法实现*/ ...
Golang入门学习(10)
Go的第10课——类型定义和结构体
类型定义
定义语法跟之前的函数类型一样,使用 type 关键字
1type newtype oldtype
这里我们是给 oldtype 定义了一个别名,相当于是 typedef
只是 go 里面相对于 C 是反着写的。
123456789101112131415161718package mainimport "fmt"type pid_t intfunc main() { var pid pid_t pid = 1 if pid == 1 { fmt.Println("SYSTEM PROCESS") } else { fmt.Println("COMMON PROCESS") }}/*SYSTEM PROCESS*/
结构体
基本介绍
go语言没有面向对象的概念了,但是可以使用结构体来实现,面向对象编程的一些特性,例如:继承、组合等特性。
在这里 ...
Golang入门学习(9)
Go的第9课——特殊语句&指针的基本应用
defer语句
go语言中的 defer
语句会将其后面跟随的语句进行延迟处理。在
defer 归属的函数即将返回时,将延迟处理的语句按
defer 定义的逆序进行执行,也就是说,先被 defer
的语句最后被执行,最后被 defer 的语句,最先被执行。
下面给个例子:
123456789101112131415161718package mainimport "fmt"func main() { fmt.Println("start") defer fmt.Println(1) defer fmt.Println(2) defer fmt.Println(3) fmt.Println("end")}/*startend3 2 1 */
可以发现 defer 申明的语句一律是在最后执行,并且先被 defer
的语句最后执行。
它可以有以下用途:
关闭文件句柄
锁资源释放
数据库连接释放
...
Golang入门学习(8)
Go的第八课——闭包
闭包
基本介绍
闭包就是一个函数和与其相的引用环境组合的一个整体(实体)
例子
给一个这样的累加器的例子
123456789101112131415161718192021package mainimport "fmt"func Addupper() func(int) int { var n int = 10 return func(x int) int { n = n + x return n }}func main() { f := Addupper() fmt.Println(f(1)) fmt.Println(f(2))}/*1113*/
在 Addupper 中定义了一个 n
变量返回了一个匿名函数,匿名函数的作用就是和外部的 n 相加然后返回。
这个匿名函数和外部的变量 n 就构成了一个闭包,我们调用 Addupper
相当于是得到了一个对象,这个 n
就是对象的属性,返回的结果就是 ...
Golang入门学习(7)
Go的第七课——函数
函数
函数简介
函数是 golang
中的一级公民,我们把所有的功能单元都定义在函数中,可以重复使用。函数包含函数的名称、参数列表和返回值类型,这些构成了函数的签名(signature),有点像
C++ 的名称粉碎机制。
函数的特性
go语言中有3种函数:普通函数、匿名函数(没有名称的函数)、方法(定义在struct上的函数)。receiver
go语言中不允许函数重载(overload),也就是说不允许函数同名。
go语言中的函数不能嵌套函数,但可以嵌套匿名函数。
函数是一个值,可以将函数赋值给变量,使得这个变量也成为函数。
函数可以作为参数传递给另一个函数。I函数的返回值可以是一个函数。
函数调用的时候,如果有参数传递给函数,则先拷贝参数的副本,再将副本传递给函数。
函数参数可以没有名称。
函数定义
根据如下格式定义
123func function_name([parameter_list]) [return_list]{ //main logic}
最简单的一个加法函数:
12345678 ...
Golang入门学习(6)
Go的第六课——复杂数据类型的定义和使用
数组(Array)
定义
数组是相同数据类型的一组数据的集合,数组一旦定义长度不能修改,数组可以通过下标(或者叫索引)来访问元素。
定义方法:
1var identifier [size]type
但是数组初始化又有点奇怪,并不能直接在后面等号,而是这样子去初始化
1var identifier = [size]type{val1, val2 ...}
当然,如果少了 var 那就要把等号变为
:=。如果是初始化,那么 size 可以填
... 来让后面给的值决定前面的 size。
除此之外还可以指定下标初始化。
12345678package mainimport "fmt"func main() { var s = [...]int{0: 1, 2: 2, 1000: 9} fmt.Print(s[1000]) }
函数 len
可以返回一个数组的长度,目测不止,应该可以返回很多种的集合类数据的长度。
1234 ...
Golang入门学习(5)
Go的第五课——控制语句的关键字使用
今天属实是摆了,主要是玩了有点久 + 补 CSAPP
的知识,所以也就补了一点点知识点。
一些关键字
fallthrough
原来 switch 可以下滑,只需要在最后使用关键字 fallthrough
即可,并且只能在 case 当中的最后一行使用,其余地方使用均会报错。
1234567891011121314151617181920package mainimport "fmt"func main() { c := 1 switch c { case 1: fmt.Println(1) fallthrough case 2: fmt.Println(2) default: fmt.Println(0) }}/*12*/
break
它的一般用途和 C 语言是差不多的,跳出当前循环或者是跳出当前的
case。
主要有一个 break label 的写法指定跳出哪一重的循环 ...
CS:APP第四章复习
其实第四章一开始感觉不是我该学的,但是想想自己也要考研,计组也会讲这些,而这本书应该是会比计组讲的好的,所以还是硬着头皮学吧。
2022-12-27 UPDATE:完成了这一章
每天 % 一遍:CSAPP 永远的神!!!计算机的教科书我愿称他为最好!
计算机体系结构图
Y86-64指令集体系结构
我们知道,x86-64 指令集体系结构的电脑是很经典的 CISC(complex
instruction set computer)。这里方便学习就定义一个精简指令集 Y86-64
结构。
程序员可见的状态
Y86-64程序中的每条指令都会读取或修改处理器状态的某些部分,这称为程序员可见的状态。
这里的“程序员”既可以是用汇编代码写程序的人,也可以是产生机器级代码的编译器
Y86-64 的状态类似 x86-64。有 15
个寄存器:%rax,%rcx,%rdx,%rbx,%rsp,%rbp,%rsi,%rdi 以及
%r8-%r14。为了方便指令编码,少了一个 %r15 寄存器。
其中,%rsp
被用于入栈出栈,程序计数器(PC,也就是%r ...
Golang入门学习(4)
Go的第四课——运算符和控制流
运算符
自增(++)和自减(--)它是单独的语句,不属于运算符,其余的那些运算符跟
C 语言一模一样。
控制流
选择语句
选择结构依然是 if-else 和 switch 这两个分支语句,但是多了一个 select
语句。
if特性
没有什么过多的特性,无非就是 if
的条件不需要加括号以及后面的语句必须要和 if 在同一行。
1234567if true{//通过}if true//不通过,因为大括号不与if在同一行{}
并且可以在 if 语句中进行初始化,比如下面这个例子。
123if age:=1;age>=18{ fmt.Println("您已成年")}
此时 age 的作用域在 if 语句中,出了这个语句这个变量失效。
switch特性
这里多了一个特性是不再会有下滑的过程。
123456789101112131415package mainimport "fmt"func main() ...