对golang goroutine、channel、select、reflect 温习一下,写了几个小例子
* 利用非 buff channel 和 goroutine 实现双goroutine 交易执行例子
``` type Ball struct { hits int } func player(name string, table chan *Ball) { for { ball := <-table ball.hits++ fmt.Println(name, ball.hits) time.Sleep(1 * time.Nanosecond) table <- ball } } func TestChannel(t *testing.T) { table := make(chan *Ball) go player("ping", table) go player("pong", table) table <- new(Ball) // game on; toss the ball time.Sleep(10 * time.Nanosecond) <-table // game over; grab the ball } ```
* 利用非buff channel单端读写阻塞特性灵活控制代码执行流程
``` func TestGoroutine(t *testing.T) { var ch = make(chan int) go func() { counter := <-ch for { counter++ fmt.Println("counter", counter) time.Sleep(1 * time.Nanosecond) } }() ch <- 0 start := time.Now().Nanosecond() time.Sleep(10 * time.Nanosecond) end := time.Now().Nanosecond() fmt.Println("cost-time", end - start) } ```
* 下面是一个select检测多个channel的实例
``` func TestSelect(t *testing.T) { a, b := make(chan string), make(chan string) go func() { a <- "a" }() go func() { b <- "b" }() b = nil for i := 2; i > 0; i-- { select { case s := <-b: fmt.Println("got", s) case s := <-a: fmt.Println("got", s) } } fmt.Println("finished") } ```
* 下面是一个通过反射构建struct,并通过json.Unmarshal 初始化struct的例子
``` type data struct { Title string Firstname, Lastname string Rank int } func TestAnonymousStruct(t *testing.T) { dValue := reflect.ValueOf(new(data)) dKind := dValue.Kind() if dKind == reflect.Ptr || dKind == reflect.Ptr { dValue = dValue.Elem() } fmt.Println("dValue", dValue) d1 := dValue.Interface() byteArray := bytes.NewBufferString(`{"Title":"title","Firstname":"firstName","Lastname":"lastname","Rank":1}`).Bytes() err := json.Unmarshal(byteArray, &d1) if nil != err { fmt.Println("d1 fill fail ") } fmt.Println(d1) } ```
相关推荐
* epoll 的实现原理与 select 的区别 Golang * goroutine 底层原理 * channel 的线程安全性 * channel 同步异步的区别 * Golang 中的 map 是否线程安全 * Golang 语言的特点 * 引用类型的用法 * GC 释放内存的原理...
- **基于select的多路复用**: 使用`select`语句来监听多个channel的状态,实现高效的任务调度。 #### 并发模式 - **示例**: 通过聊天服务的实现来说明并发编程的具体应用。 - **基于共享变量的并发**: 讨论了如何...
- **select**:在多个channel之间选择,实现非阻塞操作。 5. **包管理与导入** - **包(package)**:Go语言的模块化单位,每个源文件属于一个包。 - **import**:用于导入其他包,如`import "fmt"`,并使用`fmt...
Channel提供了同步原语,如`select`和`sync`包中的互斥锁、条件变量等。 11. **Go的垃圾回收**: Go语言有自动的垃圾回收机制,负责回收不再使用的内存,减轻程序员的负担,但开发者仍需要注意内存泄漏的可能性。 ...
3. Select:可以同时监听多个channel,选择最先准备好通信的channel。 八、包 1. 工作空间:Go程序的组织结构,包含src、pkg、bin三个目录。 2. 源文件:每个包有一个主文件,可以包含多个Go源文件。 3. 包结构:每...
`select`关键字用于等待多个`channel`操作,可以实现非阻塞的选择。`defer`则用于延迟调用函数,它会在当前函数返回之前执行。 Go语言的错误处理机制主要依赖`panic`和`recover`。`panic`用于在运行时抛出异常,`...
3. Select:在多个channels之间选择,等待某个channel有数据可读或可写。 四、包和导入 Go语言采用模块化设计,代码组织以包为单位,每个包有自己的命名空间。通过`import`关键字引入其他包,可以使用`_`进行匿名...
Goroutine之间的通信通过通道(Channel)进行,这是一种强大的并发原语。 2. 通道:通道在Go中扮演着线程间同步的角色,可以用来传递数据,实现数据共享。通道可以是双向或单向的,有阻塞和非阻塞两种操作模式。 3...
4. **控制流**:包括条件语句(if-else)、循环(for、while)、switch以及函数式编程中的Go程(goroutine)和通道(channel)。 二、语法特性 1. **包管理**:Go语言采用模块化设计,通过`import`导入所需包,`...
2. **通道(channel)**:Go语言的通道用于goroutine间的通信。 3. **并发控制**:使用`sync`包中的`WaitGroup`、`Once`等结构控制并发。 ### 面向对象编程 1. **类型(Type)**:Go语言支持结构体和接口,提供了面向...
- **通道(Channel)**:用于goroutine之间的通信,可实现数据同步。 - **select**:在多个通道操作之间进行选择,非阻塞式并发控制。 7. **包与导入** Go语言的代码组织以包为单位,每个文件都属于一个包,使用...
此外,还有`chan`用于通道通信,`select`用于等待通道操作,`go`启动goroutine,`defer`延迟执行。 7. **类型系统**:Go语言有多种内置类型,如布尔型`bool`、整型`int`、浮点型`float32`、`float64`、复数类型`...
- **select**:用于等待多个channel操作,类似于多路复用器,可以实现goroutine间的协调。 3. **包和模块管理**: - **包(package)**:Go语言的组织单位,通过`import`引入其他包。 - **标准库**:Go语言提供...
- **select**:用于在多个channel之间进行非阻塞的选择操作。 5. **Go的包管理** - **标准库**:Go的标准库非常丰富,包含了大量实用的模块。 - **导入包**:使用`import`关键字导入包,支持别名导入和匿名导入...
- **通道(Channel)**:用于goroutine间的通信,实现数据同步。例如:`ch := make(chan int)` 和 `ch 。 - **选择(select)**:类似于switch语句,但用于等待多个通道操作。例如: ``` select { case msg := ...
3.2.1. Golang LiteIDE ..........................................................................................32 3.2.2. GoClipse........................................................................
3.2.1. Golang LiteIDE ..........................................................................................32 3.2.2. GoClipse........................................................................