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 ...
Golang入门学习(2)
Go的第二课——Go的特性&变量
Go的一些特性这次又学了点特性就是:
如果引入的包在文件中没有被用到则会导致编译通不过,这一点比较匪夷所思了,因为很多语言都没有这种限制。
同样,变量也有这个限制,定义的变量没有使用过也会报错。
入口函数为 main 函数
源文件必须 .go 为后缀
大小写敏感的语言
标准api文档在线:https://studygolang.com/pkgdoc(PS:这玩意可以直接保存下来离线观看)
Go的变量基础用法和注意事项每个编程语言最基本的单位就是变量了,那来看看 go 的一个定义和操作变量的方法吧。
基本数据类型
整数型((u)int(默认是64位),(u)int8,(u)int16,(u)int32,(u)int64,byte)
浮点类型(float(默认是float64),float32,float64)
字符型(没有专门的数据类型,一般使用 byte)
布尔型(bool)
字符串(string)
派生/复杂数据类型
指针(pointer)
数组([])
结构体(struct)
管道(Channel)
函数(func)
切 ...
Golang入门学习(1)
Go的第一课——简介&开发环境安装
最近完成了 C++ 的基础内容,其它的内容也要跟上来了,今天学学 go。
Go简介Go 是由 罗伯特·格瑞史莫、罗勃·派克及肯·汤普逊于2007年9月开始设计的语言,2009年11月正式宣布推出,静态强类型、编译型,高并发,并且具有垃圾回收机制的语言。
SDK安装点我跳转到下载页面
用 windows installer 可以一键配置环境变量,go 语言的编译器就叫 go,语言文件的后缀也是(.go)。
编译常用选项
build:编译一个可执行文件,-o 指定文件名,若不指定则默认与源文件一致。
run:直接运行一个 go 文件
编译执行eg1.
1go build main.go
编译 main.go 文件并生成 main.exe(windows)
eg2.
1go build main.go -o hello.exe
编译 main.go 文件并生成 hello.exe
eg3.
1go run main.go
直接运行 main.go 中的语言脚本
Go的一些特性
每个 go 文件必须属于一个包(package)
语句可 ...
C++的一些特性(4)
C++的一些特性(4)
C++的内存管理内存泄露在普通的 C 语言程序中。我们可以使用 malloc 函数动态地分配内存,然而若我们没有及时地对使用完成的内存进行释放,就会造成内存泄露。
来看下面的一个例子
1234567891011121314#include <stdio.h>#include <stdlib.h>void f(void){ void* s; s = malloc(50); return;}int main(void){ while (true) f(); /* Malloc函数迟早会由于内存泄漏而返回NULL*/ return 0;}
我们平时在用 PC 的时候可能没有任何感觉,毕竟如果占用内存过多我们关掉这个程序,甚至说重启一下电脑,肯定就没有这个问题了。但是内存泄露往往不发生在 PC 当中,而是会在服务器上,而服务器中运行的服务一般是常驻程序,一般情况下进程不允许被关闭更不允许随便重启,因此若服务的进程存在上述的内存泄露则迟早会耗尽服务器的内存资源。
智能指针C ...
C++的一些特性(3)
C++的一些特性(3)
列表初始化用一对大括号可以给一个数组,结构体,甚至是对象成员初始化。
数组1234567#include<iostream>using namespace std;char s[] = {'x','i','a','0','j','i','2','3','3'};int main() { puts(s); system("pause");}
结构体初始化,传参,返回都可以。
初始化结构体1234567891011#include<iostream>using namespace std;typedef struct __Info { int a; double b;}Info, * PInfo;int main() { Info s = & ...
C++的一些特性(2)
C++的一些特性(2)
左值和右值概念这两个概念其实就涉及到我们的赋值和引用。左值直观的理解就是在等号左边的值,右值就是出现在等号右边的值。左值一定是占据了内存中一个可识别的位置的,而右值则不一定有。
比较容易混淆的两个例子可能是
12x++;++x;
其中,x++ 是右值,++x 是左值。
也很好理解,我们在重载前置 ++ 的时候,是先加再返回,这个时候我完全可以给它加上之后返回一个原对象。但是后置 ++ 则不行,我需要先给它保存原对象,然后原对象++,返回刚刚保存的对象。
函数返回值一般情况下为右值,少数情况下,比如在定义返回值的时候类型加了引用(&),那么得到的值可能是左值。判断是否为左值很简单,在该值之前加一个 & 看看能否取出一个地址来。
左值引用和右值引用左值引用写法:
12int a=1;int &b=a;
引用其实前面介绍过了,就是绑定一个对象,让我对引用对象操作与实际被绑定的对象操作没有任何区别,也就是说在执行完 int &b=a 之后,a 和 b 变量没有区别的,都是操作同一块内存。
左值引用在执行的时候它的对象必须是一个左值 ...
C++的一些特性(1)
C++的一些特性(1)
这一章讲一下 C++ 比 C 多的一些东西吧,不然有时候真的感觉 C 和 C++ 区别不大的。
一些其它的函数定义内联函数内联函数是指在调用的时候不使用 call,而是用函数的代码替换这里的函数调用,可以节省这里时间上的效率损失,常见于逻辑简单,需要频繁调用的函数,这里省下的时间开销就很大,在函数定义前加关键字 inline 可以把函数声明为内联。当然,逻辑复杂的函数也可以使用 inline,但是编译器不一定会听,编译器会综合考虑要不要对这个函数使用内联。
裸函数在函数定义前加关键字 __deplspec(naked) 可以把函数声明为裸函数,裸函数是指什么都不具备的函数,不会自动给你压栈,也不会自动给你返回,什么都需要自己做。
一般来说,使用naked函数时需要注意以下问题:
函数必须显式返回。一般通过 __asm ret的内嵌汇编指令返回。
不可以通过任何方式使用局部变量。若声明一个局部变量,并在代码中为其赋值,则会更改父函数中相应位置的局部函数的值。
只能通过esp引用参数。因为子函数继承了父函数的ebp寄存器,所以只能通过esp引用参数。
nake ...