go语言找工作一般都认为是其他语言转行过来的,一般会理解为C语言转行过来的尤其体现在面试上)

go语言在使用指针时,会使用内部的垃圾回收机制(gc : garbge collector),开发人员不需要手动释放内存。垃圾主要指的是变量的内存。

git clone “ssh://wangshuaikang@172.19.10.28:10008/rtls-platform/rtfm” && scp -p -P 10008 wangshuaikang@172.19.10.28:hooks/commit-msg “rtfm/.git/hooks/“

go语言中不定长数组叫切片。

内存逃逸

  1. // 编译器在编译期间会发现name不会逃逸,而city会逃逸
  2. func testPtr1() *string {
  3. name := "Duck"
  4. p0 := &name
  5. fmt.Println("name",*p0)
  6. city := "深圳"
  7. str := &city
  8. return str
  9. }
golang如何将错误信息打印到文本中?

标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。(2>&1)

编译                                                                文件名                            
go build -o test.exe "-m -m -l" 11_内存逃逸        >>1.txt 2>&1

如何在日志中快速查找内容并加颜色显示?
  查找内容 日志
grep name 1.txt --color

defer(延迟)
延迟,关键字,可以用于修饰语句,函数,确保这条语句可以在当前栈退出的2时候执行

lock.Lock()
a := "hello"
lock.Unlock() <==经常忘记解锁,导致出现锁竞争的问题,这边不解锁别人想要获取锁那边用不到了

go语言可以使用defer来解决这个问题

                执行顺序
lock.Lock()             //1
defer lock.Unclock() //3    //在当前栈退出的时候(例如:函数结束时)
a := "hello"         //2    

{
    f1,_ := file.Open()
    defer fl.Close() //避免文件未关掉
}

并发基础
并发:电脑同时听歌、看小说、看电影。CPU根据时间片进行划分,交替执行这三个程序,我们人可以感觉是同时产生的。
并行:多个CPU(多核)同时执行

管道总结
1、管道写满了,写阻塞
2、当缓冲区读完了,读阻塞
3、如果管道没有使用make分配空间,管道默认是nil
4、从nil管道读取数据、写入数据,都会阻塞(注意,不会崩溃)
5、从一个已经close管道写入数据时,会崩溃
6、从一个已经close的管道读取数据时,都会返回零值(不会崩溃)
7、关闭一个已经close的管道,程序会崩溃
8、关闭管道的动作,一定要在写段,不应该放在读端。否则写段继续写会崩溃
9、读和写的次数,一定对等.否则:
    在多个go程,资源泄漏
    在主go程中,程序崩溃

socket流程图
image.png

http

1、概述
java
php,现在都在尝试使用go语言重写
python,豆瓣
go语言 ===> beego,gin两个主流的web框架

http协议:我们使用浏览器访问的时候发送的就是http请求。
1、http是应用层协议,底层还是依赖传输层:tcp(短连接),网络层(ip)
2、无状态的,每一次请求都是独立的,下次请求需要重新建立连接
3、https:
1、http是标准协议 ===> 明文传输看,不安全
2、https不是标准协议 ===>https=http+ssl(非对称加密,数字证书) ==>加密
3、现在所有网站会尽量要求使用https开发:安全

2、http的请求报文格式
image.png
image.png

一个http请求可以分为4部分:
1、请求行:包含三部分
1、格式:方法 + URL + 协议版本号
2、实例:POST + /chapter/user + HTTP1.1
3、请求方法:
1、GET:获取数据
2、POST:上传数据(表单格式、json格式)
3、PUT:修改数据
4、DELETE:删除数据
2、请求头
1、格式:key:value
2、可以有很多的键值对(包含协议)
3、常见的重要头:
1、Accpet:接受数据格式
2、User-Agent:描述用户浏览器
3、Connection:Keep-Alive(长链接)、close(短连接)
4、Accept-Encoding:gzip、xxx,描述可以接受的编码
5、Cookie:由服务器设置的key=value数据,客户端下次请求的时候可以携带过来
6、Content-Type:
1、application/from(表示伤处见的数据是表单格式)
2、application/json(表示body的数据是json格式)
7、用户可以自定义的:
1、name:Duck
2、age:18
3、空行
1、告诉服务器,请求头结束了,用于分割
4、请求包体
1、一般在POST方法时,会配套提供body
2、在GET的时候可以提供body,但是这样容易让人混淆,建议不要使用
3、上传两种数据格式:
1、表单:姓名、性别、年龄
2、json数据格式

启动tcp的sever案例,使用APIPOST发起HTTP请求,查看HTTP请求头信息
image.png

前端和后台传输数据方法:
1、放在请求头中
2、放到请求包中
3、放在URL中:GET /USER?ID=1001&SCORE_ID=90&SCHOOL=MIDDLESCHOOL(常用)
1、?代表参数和URL
2、多个参数之间使用&分割,每一个参数数据都是一个键值对

image.png
http响应格式也分为4部分:
1、第一部分:状态行
1、协议格式:协议版本号 + 状态码 + 状态描述
2、实例1: HTTP/1.1. + 200 + OK
3、实例1: HTTP/1.1. + 404 + not found
4、常用的状态码:
1、1xx ===> 客户端可以继续发送请求(一般感知不到)
2.、2xx ===> 正常访问
3、3xx ===> 重定向
4、4xx
1、401 ===> 未授权 not anthorized
2、404 ===> Not found
5、5xx
1、501 ===> Internal Error(服务器内部错误)

2、第二部分:响应头
1、Content-Type:application/json
2、Server:Apache
3、Data:Mom,12,Sep
4、….
3、第三部分:空行
1、用于分割,表示下面已经没有响应头
4、第四部分:
1、通常返回json数据

JSON

{
  "anchor_addr": "AB123C",
  "anchor_alias": "基站A",
  "map_id": 1,
  "xn": 1.2,
  "yn": 10.21,
  "zn": 12
}

记住,json语法要求最后一个元素后面,不能加逗号。

json编解码
在网络中传输的时候,把结构体,编码成json字符串 ,传输过程:结构体 ==> json字符串,称为编码。
接收字符串的时候,需要把json字符串转换成结构体,操作过程:json字符串 ==> 结构体,称为解码。

结构体中加标签是为了json编码时候用的,结构体大写字母开头的经过json编码后还是大写字母开头的。在开发过程中所有的key统一都是小写字母的开头的。

总结:
1、对于结构体进行编码时(json):字段的首字母必须大写,否则无法编码
2、如果json格式要求key要小写,那么可以通过(tag)来解决
3、tag细节

    Name    string    `json:"-"` 
    // ===> 在使用json编码时,"-"这个编码不参与
    Subject string    `json:"subject_name"` 
    // ===> 在使用json编码时,该字段会编码成subject_name
    Age     int        `json:"age,string"`      
    // ===> 在使用json编码时,该字段会转换成string类型,一定要有2个字段:名字,类型。中间不能有空格
    Address string `json:"address,omitempty"` 
    // ===> 在使用json编码时,如果该字段为空会忽略该字段,不参与编码