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]{ /*方法实现*/}fun ...
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}
最简单的一个加法函数:
123456789101112131415package m ...
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 可以返回一个数组的长度,目测不止,应该可以返回很多种的集合类数据的长度。
1234567891011packa ...
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 的写法指定跳出哪一重的循环。
12345678910 ...
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,也就是%rip)存放当前指令执行的地址,还包含了 3 ...
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() { var i = 5 ...
Golang入门学习(3)
Go的第三课——变量的强制转换和格式化字符串输出
Go变量的类型转换数值类型的相互转换和C/C++不同,golang的变量赋值如果类型不一致必须显式转换,也就是强制转换。如果没有强制转换,不管是高精度赋值给低精度还是低精度赋值给高精度都会编译错误。
语法:T(v)可以把值v转换为T类型的值。
12var n int=1var f float=float(n)
数据从高精度转低精度会截断,低精度转高精度会扩展(CSAPP知识)。
还需要注意一点,如果尝试给一个变量加上或减去超过自己表示类型的常数则也会编译错误,比如说下面的语句都会导致编译不通过。
123var i8 int8=128var i16 int16=65536var i32 int32=2147483648
float 与 int 之间的相互转换与 C 语言应该差不多,会出现丢失小数或者是丢失精度的一些问题。
数值转字符串不能直接转,但是有这么几种方式:
格式化字符串
strconv 函数转
格式化字符串其实就跟 C 语言的 sprintf 函数差不多,在 golang 里面也有这么个函数 fmt.Spr ...