-
Go语言通过反射修正获得多态值
所属栏目:[语言] 日期:2023-07-04 热度:8218
Go语言中类似 x、x.f[1] 和 *p 形式的表达式都可以表示变量,但是其它如 x + 1 和 f(2) 则不是变量。一个变量就是一个可寻址的内存空间,里面存储了一个值,并且存储的值可以通过内存地址来更新。
对于 reflect.V[详细] -
Go语言IsNil()和IsValid()——判定反射值的空和有效性
所属栏目:[语言] 日期:2023-07-04 热度:3045
反射值对象(reflect.Value)提供一系列方法进行零值和空判定,如下表所示。
反射值对象的零值和有效性判断方法
方 法 说 明
IsNil() bool 返回值是否为 nil。如果值类型不是通道(channel)、函数、接口[详细] -
Go语言利用反射来获取构造体成员的值
所属栏目:[语言] 日期:2023-07-04 热度:3357
反射值对象(reflect.Value)提供对结构体访问的方法,通过这些方法可以完成对结构体任意值的访问,如下表所示。
反射值对象的成员访问方法
方 法 备 注
Field(i int) Value 根据索引,返回索引对应的结[详细] -
Go语言reflect.ValueOf()和reflect.Value(通过反射获取值资讯)
所属栏目:[语言] 日期:2023-07-04 热度:9730
当我们将一个接口值传递给一个 reflect.ValueOf 函数调用时,此调用返回的是代表着此接口值的动态值的一个 reflect.Value 值。我们必须通过间接的途径获得一个代表一个接口值的 reflect.Value 值。
reflect.Value[详细] -
Go语言结构体标记(Struct Tag)
所属栏目:[语言] 日期:2023-07-04 热度:1187
通过 reflect.Type 获取结构体成员信息 reflect.StructField 结构中的 Tag 被称为结构体标签(Struct Tag)。结构体标签是对结构体字段的额外信息标签。
JSON、BSON 等格式进行序列化及对象关系映射(Object Rela[详细] -
Go语言反射.Elem():用反射获得 String的指向
所属栏目:[语言] 日期:2023-07-03 热度:1608
Go语言程序中对指针获取反射对象时,可以通过 reflect.Elem() 方法获取这个指针指向的元素类型。这个获取过程被称为取元素,等效于对指针类型变量做了一个*操作,代码如下:
package main
import (
"fmt"
[详细] -
Go语言reflect.TypeOf()和reflect.Type(通过反射获得类型信息)
所属栏目:[语言] 日期:2023-07-03 热度:296
在 Go语言中通过调用 reflect.TypeOf 函数,我们可以从一个任何非接口类型的值创建一个 reflect.Type 值。reflect.Type 值表示着此非接口值的类型。通过此值,我们可以得到很多此非接口类型的信息。当然,我们也可以[详细]
-
Go语言反射规则分析
所属栏目:[语言] 日期:2023-07-03 热度:1485
反射是众多编程语言中的一个非常实用的功能,它是一种能够自描述、自控制的应用,Go语言也对反射提供了友好的支持。
Go语言中使用反射可以在编译时不知道类型的情况下更新变量,在运行时查看值、调用方法以及直接[详细] -
Go语言反射(reflection)概要
所属栏目:[语言] 日期:2023-07-03 热度:602
反射(reflection)是在 Java 出现后迅速流行起来的一种概念,通过反射可以获取丰富的类型信息,并可以利用这些类型信息做非常灵活的工作。
大多数现代的高级语言都以各种形式支持反射功能,反射是把双刃剑,功能[详细] -
Go语音聊天服务器
所属栏目:[语言] 日期:2023-07-03 热度:3891
服务端程序中包含 4 个 goroutine,分别是一个主 goroutine 和广播(broadcaster)goroutine,每一个连接里面又包含一个连接处理(handleConn)goroutine 和一个客户写入(clientwriter)goroutine。
广播器(bro[详细] -
Go语言CSP:通信顺序进程概述
所属栏目:[语言] 日期:2023-07-03 热度:8823
Go实现了两种并发形式,第一种是大家普遍认知的多线程共享内存,其实就是 Java 或 C++ 等语言中的多线程开发;另外一种是Go语言特有的,也是Go语言推荐的 CSP(communicating sequential processes)并发模型。
C[详细] -
Go语言死锁、活锁和饥饿简述
所属栏目:[语言] 日期:2023-07-03 热度:6162
死锁是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进[详细]
-
Go语言等待组 (同步.等待组)
所属栏目:[语言] 日期:2023-07-03 热度:3644
Go语言中除了可以使用通道(channel)和互斥锁进行两个并发程序间的同步外,还可以使用等待组进行多个任务的同步,等待组可以保证在并发环境中完成指定数量的任务
在 sync.WaitGroup(等待组)类型中,每个 sync.[详细] -
Go语言互斥锁(sync.Mutex)与读写互斥锁(sync.RWMutex)
所属栏目:[语言] 日期:2023-07-03 热度:234
Go语言包中的 sync 包提供了两种锁类型:sync.Mutex 和 sync.RWMutex。
Mutex 是最简单的一种锁类型,同时也比较暴力,当一个 goroutine 获得了 Mutex 后,其他 goroutine 就只能乖乖等到这个 goroutine 释放该 M[详细] -
Go语言的多核并行性研究
所属栏目:[语言] 日期:2023-07-03 热度:3016
Go语言具有支持高并发的特性,可以很方便地实现多线程运算,充分利用多核心 cpu 的性能。
众所周知服务器的处理器大都是单核频率较低而核心数较多,对于支持高并发的程序语言,可以充分利用服务器的多核优势,从而[详细] -
可缓存的 Go语言通路
所属栏目:[语言] 日期:2023-07-01 热度:6201
Go语言中有缓冲的通道(buffered channel)是一种在被接收前能存储一个或者多个值的通道。这种类型的通道并不强制要求 goroutine 之间必须同时完成发送和接收。通道会阻塞发送和接收动作的条件也会不同。只有在通道中[详细]
-
Go语言无缓冲区的传输通道
所属栏目:[语言] 日期:2023-07-01 热度:4958
Go语言中无缓冲的通道(unbuffered channel)是指在接收前没有能力保存任何值的通道。这种类型的通道要求发送 goroutine 和接收 goroutine 同时准备好,才能完成发送和接收操作。
如果两个 goroutine 没有同时准备[详细] -
Go语言单向通道在单向通道中的一种实现方式
所属栏目:[语言] 日期:2023-07-01 热度:7220
Go语言的类型系统提供了单方向的 channel 类型,顾名思义,单向 channel 就是只能用于写入或者只能用于读取数据。当然 channel 本身必然是同时支持读写的,否则根本没法用。
假如一个 channel 真的只能读取数据,[详细] -
Go语言通道(chan)——goroutine之间通讯渠道
所属栏目:[语言] 日期:2023-07-01 热度:7724
如果说 goroutine 是 Go语言程序的并发体的话,那么 channels 就是它们之间的通信机制。一个 channels 是一个通信机制,它可以让一个 goroutine 通过它给另一个 goroutine 发送值信息。每个 channel 都有一个特殊的类[详细]
-
goroutine与coroutine的区别
所属栏目:[语言] 日期:2023-07-01 热度:2784
C#、Lua、Python 语言都支持 coroutine 特性。coroutine 与 goroutine 在名字上类似,都可以将函数或者语句在独立的环境中运行,但是它们之间有两点不同:
goroutine 可能发生并行执行;
但 coroutine 始终顺序执行[详细] -
并发和并行的不同
所属栏目:[语言] 日期:2023-07-01 热度:7760
在讲解并发概念时,总会涉及另外一个概念并行。下面让我们来了解并发和并行之间的区别。
并发(concurrency):把任务在不同的时间点交给处理器进行处理。在同一时间点,任务并不会同时运行。
并行(parallelism[详细] -
Go语言 GoMAXPROCS(对并发运行的性能进行调整)
所属栏目:[语言] 日期:2023-07-01 热度:8187
在 Go语言程序运行时(runtime)实现了一个小型的任务调度器。这套调度器的工作原理类似于操作系统调度线程,Go 程序调度器可以高效地将 CPU 资源分配给每一个任务。传统逻辑中,开发者需要维护线程池中线程与 CPU 核[详细]
-
Go语言竞争状态概述
所属栏目:[语言] 日期:2023-07-01 热度:9450
有并发,就有资源竞争,如果两个或者多个 goroutine 在没有相互同步的情况下,访问某个共享的资源,比如同时对该资源进行读写时,就会处于相互竞争的状态,这就是并发中的资源竞争。
并发本身并不复杂,但是因为有[详细] -
可实现并发通信的 Go语言
所属栏目:[语言] 日期:2023-07-01 热度:7228
通过上一节《Go语言goroutine》的学习,关键字 go 的引入使得在Go语言中并发编程变得简单而优雅,但我们同时也应该意识到并发编程的原生复杂性,并时刻对并发中容易出现的问题保持警惕。
事实上,不管是什么平台,[详细] -
轻量级线程的 Go语言
所属栏目:[语言] 日期:2023-07-01 热度:8922
在编写 Socket 网络程序时,需要提前准备一个线程池为每一个 Socket 的收发包分配一个线程。开发人员需要在线程数量和 CPU 数量间建立一个对应关系,以保证每个任务能及时地被分配到 CPU 上进行处理,同时避免多个任[详细]