这可能是最全的golang的"=="比较规则了吧

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了这可能是最全的golang的"=="比较规则了吧相关的知识,希望对你有一定的参考价值。

参考技术A 大家经常用"=="来比较两个变量是否相等。但是golang中的"=="有很多细节的地方,跟php是不一样的。很多时候不能直接用"=="来比较,编译器会直接报错。

golang中基本类型的比较规则和复合类型的不一致,先介绍下golang的变量类型:

golang中的基本类型

比较的两个变量类型必须相等。而且,golang没有隐式类型转换,比较的两个变量必须类型完全一样,类型别名也不行。如果要比较,先做类型转换再比较。

复合类型是逐个字段,逐个元素比较的。需要注意的是, array 或者struct中每个元素必须要是可比较的,如果某个array的元素 or struct的成员不能比较(比如是后面介绍的slice,map等),则此复合类型也不能比较。

逐个成员比较类型和值。每个对应成员的比较遵循基本类型变量的比较规则。

但是如果struct中有不可比较的成员类型时:

可以看到,struct中有slice这种不可比较的成员时,整个struct都不能做比较,即使没有对slice那个成员赋值(slice默认值为nil)

slice和map的比较规则比较奇怪,我们先说普通的变量引用类型&val和channel的比较规则。

引用类型变量存储的是某个变量的内存地址。所以引用类型变量的比较,判断的是这两个引用类型存储的是不是同一个变量。

上面看起来比较废话,但是得理解引用类型的含义。不然对判断规则还是不清楚。

slice类型不可比较,只能与零值nil做比较。

关于slice类型不可比较的原因,后面会专门写文章做讨论。

map类型和slice一样,不能比较,只能与nil做比较。

接口类型的变量,包含该接口变量存储的值和值的类型两部分组成,分别称为接口的动态类型和动态值。 只有动态类型和动态值都相同时,两个接口变量才相同:

而且接口的动态类型必须要是可比较的,如果不能比较(比如slice,map),则运行时会报panic。因为编译器在编译时无法获取接口的动态类型,所以编译能通过,但是运行时直接panic:

golang的func作为一等公民,也是一种类型,而且不可比较

上面说过,map和slice是不可比较类型,但是有没有特殊的方法来对slice和map做比较呢,有

reflect.DeepEqual函数可以用来比较两个任意类型的变量

对map类型做比较:

对slice类型做比较:

对struct类型做比较:

可以发现,只要变量的类型和值相同的话,reflect.DeepEqual比较的结果就为true

直接看用例:

结果为:

1, golang的类型再定义和类型别名
2,golang的slice和map为什么不可以比较

1, https://medium.com/golangspec/equality-in-golang-ff44da79b7f1

2, https://studygolang.com/articles/19144
3, https://juejin.im/post/5d5ff27d518825637965f3f3

这可能是目前世界上最全的流媒体知识科普文章

流媒体,流媒体,流动的媒体!

不装了,我摊牌了,这就是目前世界上最全的流媒体知识科普文章。

我们每天都在看的各种短视频(抖音、快手)、长视频(优酷、爱奇艺、腾讯视频、Bilibili等等)、直播平台(斗鱼、虎牙)。
也可能通过各大新闻媒体报道过,新闻媒体喜欢把各大长短“视频网站”都叫做“流媒体平台”。
也许有人会觉得好奇,为啥报纸新闻这些叫“媒体”,把视频网站叫做“流媒体”。可能还有很多人听过“多媒体”这一词,那么这里的“媒体”、“多媒体”和“流媒体”究竟是什么,他们之间究竟隐藏着什么不可告人的秘密(关系)?

今天,博主就带着大家一起来揭秘(分析研究)这些个“媒体”!

什么是媒体?

媒体是个笼统的统称。(没想到吧,是不是各种百科搜不到,但是可能有人已经想到了,博主为了本篇文章的严谨性,查字典次数超过九年义务教育的总和。)。
我们能看到的,感知到的,能用来存放信息和传播信息的都可以叫做媒体。比如报纸、新闻、传媒(广播、电视、报刊杂志)、多媒体(计算机中的文字、声音、图像、视频等文件)都是”媒体“。甚至于磁带、磁盘、光盘和U盘、移动硬盘等也全都是”媒体“。

什么是传媒?

“传媒”也是一种媒体,全称是“传播媒体”。特指的是通过广播、电视、报刊杂志等方式进行信息传播的一种方式。

什么是多媒体?

多媒体也是“媒体”的一种。特指电脑中存储的文字、声音、图像、视频等文件。
【名词解释参考自新华字典】

什么是流媒体?

流媒体指的是通过”网络”传输的”媒体“,它还是媒体,只不过是在网络中“流动”的媒体,比如视频流、音频流、文字流等。比如我们日常用的较多的各种长短视频(奈飞、disney+、youtube、优酷,爱奇艺、某企鹅视频)、直播平台(斗鱼虎牙)和各种音乐平台(网抑云音乐、ku狗,某企鹅扣扣音乐等)。

对于近几年比较热门的“游戏流媒体”,也就是“云游戏”.我在2019年的发表过相关的文章:https://eguid.blog.csdn.net/article/details/88753133,有兴趣的可以看一看。因为云游戏还涉及到GPU虚拟化技术,所以超纲了,不在本文讨论范围内。

到这里,我们也知道了“流媒体”只是“媒体”里的其中一个子类,特指的经过网络传输的媒体。搞清楚了这些概念,你以为这就完了?
而让音视频能够在网络上进行传输自然需要对应的“流媒体技术”。

流媒体技术

流媒体想要在网络中传输当然也少不了“网络传输技术”,除了传输以外,当然少不了要传输的数据,也就是视频流、音频流等数据流。
要处理这些数据则涉及到音视频制作、采集、制作、编解码、推流等“音视频处理技术”。

到这里,才是我们今天要探讨的”流媒体技术“,它包含“网络传输技术”和“音视频处理技术”,两者缺一不可。

音视频处理技术

音/视频本身是两种数据,不管是硬件上还是程序中,他们都是分开的独立数据流。我们会分开讲这两块技术。

视频技术

视频就是连续的图像。
根据图像顺序的排列,播放器就可以播放视频,但是这里出现问题了,播放器应该什么时候播放某一张图片,间隔多久显示下一张图片?

图像技术由于涉及技术内容过多,会在后面的文章中单独介绍。

帧率

显然根据图像顺序播放设备或者播放器是不知道该如何进行播放的,我们需要给这个连续图像设定一个恒定的播放速度,让播放器/播放设备能够以一定的速度去显示每一张图像,这就是”帧率“的概念。

扩展:大家小时候应该都看过连环画,就是那种每页纸上面都只有一个静态动作,连续翻页就会动起来的”小人书“。翻页的速度越快,小人的动作也越快;翻得慢,小人动作也慢;这种动画已经构成了最基础的视频概念:帧率,即:每秒翻页数量,指的视频一秒钟连续显示的图像数量。

现在,出现了电视、显示器、投影仪等现代显示设备,让我们能够更清晰、更智能的方式观看到图像画面,这些图像技术还将一直影响着我们的日常生活。

压缩算法

压缩算法会放在视频传输中讲,因为设备到设备之间传输图像一直都是使用像素传输,比如从小时候电视机和dvd上常用的3根红白绿三色av线和后来传输rgb的vga线,以及现在常用的hdmi高清显示线和dp显示线等。
所以重点来了:压缩算法专为无线传输和网络传输时使用。

很多人可能只觉得这里的无线传输和网络传输只是指的手机使用得2g、3g、4g、5g网和路由器得无线wifi,那就大错特错了,这两个使用场景只是这其中很小的一个分类。

扩展知识:无线电视广播

以前没有网络的时候,电视广播信号是如何传输的?
答案是:发射电磁波模拟信号。

全国每个县城及以上的地方都还保留有”电视塔“,它就是专门用来发送电视广播信号的发射源。只需要使用制式天线就可以接收到这些广播信号。
电视塔

除了地面的电视广播信号以外,可能有些地方还用过卫星电视,就是像一口锅一样的卫星电视信号接收装置。
卫星信号接收装置

我国主要使用pal制式的广播模拟信号进行传输视频。
年纪稍大一点的小伙伴应该都知道,小时候家里的电视机都是有天线的,要把天线架起来才能收到电视信号。在国内这个天线就是用来接收和解析电视塔发射的pal制式广播信号(pal广播制式中的视频规定是25帧/每秒)。

pal制式信号和yuv和rgb像素数据之间的关系

电视机会把接收到的pal信号解析出yuv数据。

  1. 黑白电视解析pal信号和显示原理
    如果是黑白电视,则使用Y(亮度/灰阶)就可以让电子枪根据灰阶发射能量不同的电子束轰击屏幕中的荧光粉,荧光粉就会发光,电子束的能量越强,被轰击的荧光风发光越亮,这样黑白电视机的屏幕就可以显示黑白的视频图像画面了。
    如果有信号不好,就会出现”雪花“,放在现在就叫”花屏“。
    黑白电视机

  2. 彩色电视解析pal信号和显示原理
    如果是彩色电视,则将yuv转换为RGB三基色,然后三色电子枪轰击屏幕上的RGB三色荧光点就会出现发光,把屏幕上所有RGB三色荧光点轰击一遍就显示出一张完整的图像了,这样连续不断的轰击,就产生连续的画面了。发展到彩色电视和crt显示器,这里的RGB三色荧光点已经跟现代lcd和led显示原理基本相似了。
    彩色电视机

  3. 液晶电视(lcd屏幕)解析pal信号和显示原理
    如果是液晶电视(lcd屏幕)则需要配合显卡或者编解码器,由显卡/编解码器输出rgb像素到显示器/电视。液晶电视的lcd背光是常亮的,电视机只要根据rgb矩阵控制对应的位置rgb像素点透光就可以让各个像素点显示不同颜色,这样就实现了完整图像的显示。led除了去除了lcd的背光,变成了rgb像素点自发光之外,其他基本相同。
    液晶电视

黑白电视、彩色电视和液晶电视原理,pal广播信号以及yuv、rgb像素等知识,博主也会在后面的文章中详细介绍,本章只是简单陈述,不作深入探讨,有兴趣的可以自行拓展了解。

那么问题来了,为什么明明从彩色电视时代就开始使用rgb像素了,传输数据为什么还要用yuv数据?
5. 是因为为了兼容黑白电视,黑白电视只要能够从yuv分量中的取得y分量就可以显示图像,彩色电视则需要根据uv分量结合y亮度就可以转换出rgb像素数据。
6. yuv分量比rgb数据量减少了1/3,压缩后的数据量相比rgb更小,有利于无线广播传输,即使是后来的ADSL拨号网络时代的小水管,yuv压缩后更小的体积显然比rgb更有利于在网络中传输。

音频技术

想要了解音频,就是一段声音的采样。
这里我们更需要了解的是”声音“是什么,才能更好理解音频的概念。
声音就是一种空气震荡,既然是震荡,那就有谷有锋有频率,这种波就表示声音的响度(声音大小),震荡的频率表示声音高低(也就是音阶,分低音、中音、高音,每个人的声音发声的大小和音阶都有各有特点)。超过一定频率和高于一定频率,人耳都是听不到的。
而这里的”音频“,就是一种把声音的模拟声音信号转化为pcm采样数字信号数据。

虽然pcm也可以传输,但是我们很多时候为了减少传输量和降低存储文件空间占用大小,依然会把pcm压缩成其他编码格式,比如aac,mp3等进行传输和存储。
除了编解码以外,音频还涉及到各种降噪技术和语音识别,文字转语音,语音转文字等之类的扩展应用。

网络传输技术

人类用了不知道多少年的时间,才从使用身体动作和语言来传播信息发展到通过活版印刷术的纸质传播信息。
直到1835年发明了有线电报电话机再到1895无线电磁波传输技术的应用,使人类进入无线电时代。一直到今天,有线传输和无线电传输依然在发挥不可替代的作用。有线传输发展出了电缆和光缆传输电信号和光信号,而无线电磁波技术发展到今天,我们日常使用的手机使用的4g、5g依然在不断改进优化无线传输技术。
拨号网络设备
5g

以上都是实际的硬件技术,而我们日常开发中主要接触的是网络传输技术。在软件开发中,也就是网络协议,主要是以tcp和udp为主的应用层协议。
我们需要通过这种tcp和udp协议帮助我们在网络中传输这些数据。
为了更好更快更稳定的在网络中传输视频数据,出现了很多流媒体协议

流媒体协议

比如安防监控领域经常使用的rtp、rtsp协议,flash时代横行的rtmp/flv协议,再到flash被淘汰,H5登顶后的flv,hls,dash,webrtc等各种流媒体协议百花齐放的时代。除此以外也不乏各大公司或个人基于udp和tcp构建的私有流媒体协议。

音视频压缩算法

尽管我们已经可以通过直接传输yuv/rgb像素数据和pcm音频采样数据就可以实现音视频传输了。但是不光是以前,即使是现在,如果要传输未经压缩的图像和音频数据,以现在的网络带宽也是远远不够的。

我们做一个简单的数学计算,假设图像分辨率是1920x1080,帧率是25fps,那么一秒钟需要传输多少数据?答案是:155,520,000 字节/秒,约等于151,875kbps/s,约等于148Mbps/s,这还是没算上pcm音频数据的情况下,如果再算上音频数据和视频传输协议的占用,即使是最理想状态下,要观看和传输一个未压缩的1080P高清视频也至少需要200兆以上的带宽,你家的带宽达到200兆了嘛?
况且,现在已经有4k视频和8k视频了,如果没有压缩,1000兆的带宽连4k视频都看不了,更别提8k了。

这也是为什么我们要对图像和音频进行压缩。
而根据压缩算法的不同,出现了很多图像压缩算法。

图像压缩

jpeg/jpg,png图片编码格式等。

为什么拿jpeg和png举例,因为这两个是两个方向的典型
jpeg是基于yuv图像数据的有损压缩编码,压缩率很高
png是基于rgba像素的无损压缩编码格式,压缩率没有jpg高

补充:gif也是基于rgb像素的压缩,但是它的rgb颜色范围只有256色,所以会出现偏色情况。

视频图像压缩

视频压缩基本都是有损压缩算法。
例如:mpeg4/h264,hevc/h265,vvc/h266,vp8,vp9等视频压缩编码格式。
h264/h265等视频压缩编码会分析图像,将图像分为IPB三种不同的帧,I帧(也叫:关键帧)存放一张完整的静态图像,P帧和B帧则是通过参考前一帧或者参考前后图像的像素的变化量,并根据一定的gop(关键帧间隔)来控制关键帧的数量,以此来提高压缩率。

以1080P的视频为例,h264算法就可以将1080P的视频压缩到2Mpbs/s,比未经压缩的无损视频整整减少了100倍的大小,这显然极大的提升了视频传输效率。让我们就算在以前拨号上网的时代也依然可以流畅观看高清视频。

音频压缩

出现了以aac,MP3为首的音频压缩编码格式等。

wav音频格式是未经压缩的无损pcm采样音频文件格式。

结语

这篇文章是整理CV技术资料中的附属产物。
在整理CV技术相关的技术中,在图像技术的发展历程中很多都绕不开流媒体技术和电视广播无线电技术,并因此才有了本篇文章所涉及到的非常多的概念和知识点。

刚开始没想写那么多,让博主没想到的是,从人类发明彩色电视机到现在不过才70多年的历史,光是整理历史这一块,这一类单一技术的知识量已经可能比九年义务教育学的知识都要多得多得多。尽管很多技术在今天看来可能已经淘汰不用了,但是这些技术在现代技术依然有很多衍生自被”淘汰“的技术,依稀能够从新技术上见到它们的影子。更别提这些被”淘汰“的技术在其他行业领域依然是有一定的应用价值。

整理了一周相关的资料,不知不觉到了很晚,睡意全无,分享一下自己的一点想法,聊以慰藉。
希望此篇能对大家有所助益。

如果对流媒体技术感兴趣,或者想要阅读更多博主关于流媒体技术的实践的专栏,可以继续阅读博主的其他专栏文章。

以上是关于这可能是最全的golang的"=="比较规则了吧的主要内容,如果未能解决你的问题,请参考以下文章

算法基础:最大递减数问题(Golang实现)

Golang 指针

Golang 退出 goroutine的几种方式

这可能是目前世界上最全的流媒体知识科普文章

这可能是目前世界上最全的流媒体知识科普文章

golang channel源码阅读