Golang Go语言中关于数据传递的问题,希望各位大佬帮忙解惑
Golang Go语言中关于数据传递的问题,希望各位大佬帮忙解惑
疑惑阐述
在提出疑惑之前,先阐述一下需求,
目前在将一个摄像头的 SDK ( C++库)适配自己的一个视频流解码服务,这个摄像头的 SDK 是这样的工作原理:
在初始化 Env->调用实时预览接口->注册回调函数的方式来将摄像头的视频码流数据传送给 SDK 使用者。
此处一个 Env 代表一个摄像头设备。
我在使用 CGO 中可以将 Go 函数 export 给 C 代码来调用的 feature 的过程中,在注册回调函数这个阶段里调用我在 Go 中 export 的 Go 函数(函数名为 publishPackage ),将获取到的视频码流数据包装之后放入一个全局的 channel 里(这里的做法似乎不太合适,但由于经验有限,目前只能想到这样的方法),那么在并发的情况下,单独一个全局的 Channel 肯定是满足不了并发的场景的,于是愚钝的我使用了一个全局的 sync.Map 来存放不同 Env 的 Channel,Key 为 Env 的唯一 ID,在 publishPackage 这个函数中,通过 sync.Map.Load 方法拿到当前 Env 所属的 Channel 并将包装好的视频流数据写进 Channel 中。
我又另外提供了一个 RegistryReceiver 的函数,参数为一个 Channel,这个函数中会启动一个 Goroutine 通过 select 来检测当前 Env 所属的 Channel 中是否有视频码流数据,如果有则将视频码流数据写入参数传进来的 Channel 中,提供视频流解码服务来拿到视频码流数据,拿到数据之后再进行接下来的解码操作。
在以上的流程中,目前遇到的问题是在拿到 N 个 Package 之后程序将会无法响应掉,查不出来是哪里的问题(由于只是一个没有认真学习过 Golang 的彩笔)希望各位大佬可以帮忙分析一下。万分感谢!
PS:各位大佬如果看了代码之后请轻喷,代码风格有点一言难尽。
更多关于Golang Go语言中关于数据传递的问题,希望各位大佬帮忙解惑的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于Golang Go语言中关于数据传递的问题,希望各位大佬帮忙解惑的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go语言中,数据传递主要通过值传递和引用传递两种方式实现,具体选择哪种方式取决于传递的数据类型。
-
值传递:对于基本数据类型(如int、float、bool等)以及结构体(struct)等复合类型,Go默认使用值传递。这意味着在函数调用时,会将实参的值复制一份传递给形参,函数内部对形参的修改不会影响到实参。这种方式保证了数据的局部性和安全性。
-
引用传递:虽然Go语言没有直接的指针运算和复杂的引用机制,但可以通过传递指针(*Type)来实现引用传递。当传递指针时,传递的是变量地址的副本,函数内部通过指针可以访问和修改原始数据。这种方式适用于需要修改原始数据或传递大型数据结构以节省内存拷贝开销的场景。
在实际编程中,应根据具体需求选择合适的数据传递方式。对于不需要修改的数据或基本数据类型,值传递是更好的选择;而对于需要修改的数据或大型数据结构,引用传递则更为高效。
此外,Go语言的切片(slice)和映射(map)等复合类型在传递时也具有特殊的行为,它们本质上是引用类型,但传递时需要注意其底层数组或哈希表的共享和修改问题,以避免潜在的并发问题或数据不一致。
希望以上解答能帮你解惑,如有其他问题,欢迎继续交流。