其他分享
首页 > 其他分享> > go语言网络通讯的发送和接收中的切片问题

go语言网络通讯的发送和接收中的切片问题

作者:互联网

!!!新人入门笔记,以下全是基于测试与猜测,不能保证正确性!!!

原理:
write(a)用循环的方式将字符切片a中的元素单个发送至read(a),直到字符切片a中元素全部发送完毕后结束发送,进入下一步程序;read(a)则在收到信息后以循环的方式单个接收信息并存入字符切片a中字符切片a中原有的内容会被顶掉,write(a)所发送的信息接收完之后录入空值,直到字符切片a空间用尽后结束接收,进入下一步程序。(因为发送的信息自带长度,即已被初始化边界,所以只要是能当字符切片使用就能写入到write()中,但接收需要空间,否则无法存储信息,所以只有初始化边界才能写入read()中)

可能出现的现象:
当快速循环执行write(a)向read(a)发送消息,可能会因为上一个write(a)元素发送完之后,read(a)中的空间还未循环完毕,就接收到下个write(a)发送的信息,导致分开发送的信息会被同一时间接收。

信息传递的格式转换:
写(scan):
1、[]byte(字符切片,可以直接用scanln(&a)函数赋值,能以码的形式保存)
2、string(字符串,可以直接用scanln(&a)函数赋值,能以原样保存)

不可写:
1、[128]byte(字符数组)([...]byte定义时不赋值会报错)(遇到scanln(&a)会直接跳走,无法输入,仅在scanln(&a[n])可单独赋值,可进行循环单独输入)

读(print):
1、string(字符串,可以直接用println(a)函数原样输出)
2、[]byte(字符切片,可以用println(a)函数输出码,用string(a[n:m])转换后可以用println(string(a[n:m]))函数原样输出)

不可读:
1、[128]byte(字符数组,可以a[n:m]的形式当作字符切片使用,用string(a[n:m])转换后可以用println(string(a[n:m]))函数原样输出,但在实际使用时,需要使用循环录入的方式进行赋值,比较麻烦,所以不建议使用)

收(read):
1、[]byte(字符切片,只有在初始化边界后并且不赋值才能使用,否则因为默认边界为0而无法读入接收数据)
2、[128]byte(字符数组,因为自身带有边界,所以,以a[n:m]形式即当字符切片使用,注意不要赋值)

不可收:
1、string(字符串,就算通过[]byte(a)转换为字符切片类型,但未赋值就没有边界,赋值后虽然有边界,但内容无法被顶掉,无法接收新信息)

发(write):
1、[]byte(字符切片,赋值后即可使用,原长发送格式为 a/a[:],若要定义发送长度,则用a[n:m])
2、string(字符串,赋值后用[]byte(a)语法转换后基本能达到和字符切片同样的效果)

不可发:
1、[128]byte(字符数组,可以a[n:m]的形式当作字符切片使用,但在实际使用时,需要使用循环录入的方式进行赋值,比较麻烦,所以不建议使用字符数组存储需要发送的信息)

转换:
a=string(b[n:m])——将b(字符切片,从n到m)转换成字符串形式,赋值给a(string)

a=[]byte(b)——将b(字符串形式)转换成字符切片,并赋值给a([]byte),a([]byte)下限是默认元素的个数,但赋值不受a([]byte)本身的上下限限制,(a[n:m]=[]byte(b)格式错误)

在a(string)中,当表现为a[n],a的表现为字符数组,a[n]为第n个字符的码,此时可对b[n](字符数组类型,表现为数组中的第n个值)进行赋值,但当表现为a[n:m],a的表现为字符串,此时不能对b(字符数组类型)进行赋值,a[n:m]表示从第n到第m的字符原型。

a [128]byte(字符数组类型)可通过[]a[n:m]转化为[]byte(字符切片),但是只能当作字符切片使用,不能完全当字符切片进行赋值,如scanln(&a[:])格式错误,但read(a[n:m])可以接收信息(即给a[n:m]赋值,因为是循环单独赋值)。

猜测:
read(a)不是将值直接赋给字符切片a,而是定义了个和字符切片a完全相同的字符切片(设为n,字符切片a和字符切片n能够相互影响),将值赋给字符切片n后销毁,字符切片a的信息跟随字符切片n一起发生改变,所以字符数组类型a转换字符切片类型a后可以使用,因为原理相同,而字符串a在转换成字符切片a时,是先定义了个和字符串a赋值相同的字符数组(设为n,a和n不能相互影响),然后再以字符数组n为模板转换成字符切片a(字符数组n和字符切片a之间能够相互影响,但字符串a和字符切片a不能相互影响,所以,read()不能将数据录入到字符串中,字符串保持原赋值))。

再次强调:

!!!新人入门笔记,以下全是基于测试与猜测,不能保证正确性!!!

标签:字符,string,网络通讯,切片,数组,go,byte,赋值
来源: https://blog.csdn.net/c2510529649/article/details/122682534