`

golang goroutine、channel、select、reflect

阅读更多

对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)

}
```

 

   原文引自 http://threeperson.com/articles/2047

2
3
分享到:
评论

相关推荐

    Golang后端面试_20200327.docx

    * epoll 的实现原理与 select 的区别 Golang * goroutine 底层原理 * channel 的线程安全性 * channel 同步异步的区别 * Golang 中的 map 是否线程安全 * Golang 语言的特点 * 引用类型的用法 * GC 释放内存的原理...

    golang-china读书笔记

    - **基于select的多路复用**: 使用`select`语句来监听多个channel的状态,实现高效的任务调度。 #### 并发模式 - **示例**: 通过聊天服务的实现来说明并发编程的具体应用。 - **基于共享变量的并发**: 讨论了如何...

    Go语言入门经典 源码

    - **select**:在多个channel之间选择,实现非阻塞操作。 5. **包管理与导入** - **包(package)**:Go语言的模块化单位,每个源文件属于一个包。 - **import**:用于导入其他包,如`import "fmt"`,并使用`fmt...

    golang-common-func

    Channel提供了同步原语,如`select`和`sync`包中的互斥锁、条件变量等。 11. **Go的垃圾回收**: Go语言有自动的垃圾回收机制,负责回收不再使用的内存,减轻程序员的负担,但开发者仍需要注意内存泄漏的可能性。 ...

    基于Go语言的学习笔记(附代码)

    3. Select:可以同时监听多个channel,选择最先准备好通信的channel。 八、包 1. 工作空间:Go程序的组织结构,包含src、pkg、bin三个目录。 2. 源文件:每个包有一个主文件,可以包含多个Go源文件。 3. 包结构:每...

    Go语言学习笔记(自己整理的,超级全面)

    `select`关键字用于等待多个`channel`操作,可以实现非阻塞的选择。`defer`则用于延迟调用函数,它会在当前函数返回之前执行。 Go语言的错误处理机制主要依赖`panic`和`recover`。`panic`用于在运行时抛出异常,`...

    Go参考手册.rar

    3. Select:在多个channels之间选择,等待某个channel有数据可读或可写。 四、包和导入 Go语言采用模块化设计,代码组织以包为单位,每个包有自己的命名空间。通过`import`关键字引入其他包,可以使用`_`进行匿名...

    Go-学习GO语言的入门教程

    Goroutine之间的通信通过通道(Channel)进行,这是一种强大的并发原语。 2. 通道:通道在Go中扮演着线程间同步的角色,可以用来传递数据,实现数据共享。通道可以是双向或单向的,有阻塞和非阻塞两种操作模式。 3...

    go语言中文教程及手册.pdf

    4. **控制流**:包括条件语句(if-else)、循环(for、while)、switch以及函数式编程中的Go程(goroutine)和通道(channel)。 二、语法特性 1. **包管理**:Go语言采用模块化设计,通过`import`导入所需包,`...

    Go语言四十二章经

    2. **通道(channel)**:Go语言的通道用于goroutine间的通信。 3. **并发控制**:使用`sync`包中的`WaitGroup`、`Once`等结构控制并发。 ### 面向对象编程 1. **类型(Type)**:Go语言支持结构体和接口,提供了面向...

    关于go语言的入门材料

    - **通道(Channel)**:用于goroutine之间的通信,可实现数据同步。 - **select**:在多个通道操作之间进行选择,非阻塞式并发控制。 7. **包与导入** Go语言的代码组织以包为单位,每个文件都属于一个包,使用...

    Go语言程序设计1

    此外,还有`chan`用于通道通信,`select`用于等待通道操作,`go`启动goroutine,`defer`延迟执行。 7. **类型系统**:Go语言有多种内置类型,如布尔型`bool`、整型`int`、浮点型`float32`、`float64`、复数类型`...

    go_practice_gacha

    - **select**:用于等待多个channel操作,类似于多路复用器,可以实现goroutine间的协调。 3. **包和模块管理**: - **包(package)**:Go语言的组织单位,通过`import`引入其他包。 - **标准库**:Go语言提供...

    Go-by-building-small

    - **select**:用于在多个channel之间进行非阻塞的选择操作。 5. **Go的包管理** - **标准库**:Go的标准库非常丰富,包含了大量实用的模块。 - **导入包**:使用`import`关键字导入包,支持别名导入和匿名导入...

    go-basics:基本Go代码

    - **通道(Channel)**:用于goroutine间的通信,实现数据同步。例如:`ch := make(chan int)` 和 `ch 。 - **选择(select)**:类似于switch语句,但用于等待多个通道操作。例如: ``` select { case msg := ...

    The way to go

    3.2.1. Golang LiteIDE ..........................................................................................32 3.2.2. GoClipse........................................................................

    [Go语言入门(含源码)] The Way to Go (with source code)

    3.2.1. Golang LiteIDE ..........................................................................................32 3.2.2. GoClipse........................................................................

Global site tag (gtag.js) - Google Analytics