Go使用用两种方式打印自然数

诺唯 · · 1956 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

这道题可以作为笔试题,现在给定下面一个条件
go func() {
     for i := 1; i < 10; i++ {
         println(2*i - 1)
     }
}()
go func() {
     for i := 1; i < 10; i++ {
         println(2 * i)
     }
}()

让你使用多种方式将奇偶合并,并打印自然数,这道题目很简单,思考几秒钟,看看你的实现。。。。。。好了我的实现比较low,没办法,golang 的代码怎么写都那个怂样。。。

1.第一种方式


package main

import (
	"fmt"
	"time"
)

var count = 15

func ping(c chan<- int) {
	for i := 1; i < count; i++ {
		c <- 2*i - 1
	}
}
func pong(c chan<- int) {
	for i := 1; i < count; i++ {
		c <- 2 * i
	}
}

func print(ch <-chan int) {
	for {
		msg := <-ch
		fmt.Println(msg)
		time.Sleep(time.Millisecond * 50)
	}
}

func main() {
	ch := make(chan int)
	go ping(ch)
	go pong(ch)
	go print(ch)

	var input string
	fmt.Scanln(&input)
}

上面的代码,如果将

go print(ch) 改成下面这样 channel不使用传参的形式而是直接使用全局的变量可以吗?
for {
       msg := <-ch
       fmt.Println(msg)
       time.Sleep(time.Millisecond * 50)
}
如果不行的话那是为什么?

2.第二种方式

package main

import (
	"fmt"
	"runtime"
	// "time"
)

var count = 15

func main() {
	runtime.GOMAXPROCS(1)

	go func() {
		for i := 1; i < count; i++ {
			fmt.Println(2 * i)
			runtime.Gosched()
		}
	}()

	go func() {
		for i := 1; i < count; i++ {
			fmt.Println(2*i - 1)
			runtime.Gosched()
		}
	}()

	var input string
	fmt.Scanln(&input)
}

第二种方式,在main函数中启用两个Goroutinue 思考一下,交换了他们的代码位置可不可以,为什么那?比如这样:

go func() {
       for i := 1; i < count; i++ {
           fmt.Println(2*i - 1)
           runtime.Gosched()
       }
}()
go func() {
       for i := 1; i < count; i++ {
           fmt.Println(2 * i)
           runtime.Gosched()
       }
}()


这两种方式其实都是我强行举的一个栗子,可能不太现实,但是如果了解golang内部结构的话,以上问题都不攻自破,接下来细节我会在日后的文章中将上面代码作为例子来讲解channel数据结构。


有疑问加站长微信联系(非本文作者)

本文来自:知乎专栏

感谢作者:诺唯

查看原文:Go使用用两种方式打印自然数

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1956 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传