golang 面试题尝试解答
发布时间:2020-12-16 19:14:56 所属栏目:大数据 来源:网络整理
导读:题目链接 交替打印数字和字母 package main import ( "fmt" ) func main() { var iout,cout,done = make ( chan bool ), make ( chan bool , 1 ), make ( chan bool ,1 ) go func () { iarr := [] string { "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" ,
题目链接 交替打印数字和字母package main
import (
"fmt"
)
func main() {
var iout,cout,done = make(chan bool),make(chan bool, 1),make(chan bool,1)
go func() {
iarr := []string{"1","2","3","4","5","6","7","8","9","10"}
for i := 0; i < len(iarr); i += 2 {
// 确认已经输出字符串
<-cout
fmt.Print(iarr[i])
fmt.Print(iarr[i+1])
// 通知已经输出数字
iout <- true
}
}()
go func() {
carr := []string{"A","B","C","D","E","F","G","H","I","J"}
for i := 0; i < len(carr); i += 2 {
// 确认已经输出数字
<-iout
fmt.Print(carr[i])
fmt.Print(carr[i+1])
fmt.Println("=========================")
// 通知已经输出字符串
cout <- true // 这里不能使用阻塞channel,可以使用带缓存的channel避免阻塞,从而避免死锁
}
// 通知已经完成
done <- true
}()
// 先输出数字,则mock通知已经输出字符串
cout <- true
// 阻塞等待输出字符串
<-done
}
权重抽奖package main
import (
"math/rand"
"time"
"fmt"
)
var order_users map[string]int64 = map[string]int64{
"a": 10,"b": 6,"c": 3,"d": 12,"f": 19,}
func main() {
rand.NewSource(time.Now().Unix())
var maxx int64 = 0
var ans string = ""
for ans == "" {
for k,v := range order_users {
if e := int64(rand.Intn(20)); e < v {
if e > maxx {
maxx = e
ans = k
}
}
}
}
fmt.Println(ans)
}
题目链接 package main
import "fmt"
func print(start int,chs []chan int,finish chan int) {
now := start
res := make([]int, 0)
length := len(chs) - 1
for i := 0; i < 10; i++ {
<-chs[now] // 等待now可写
res = append(res,now)
now = now + 1
if now > length {
now = now - length
}
chs[now] <- 1 // 通知now+1可写
}
fmt.Println(start,res)
finish <- 1
}
func main() {
chs := make([]chan int, 5)
for i := 0; i < len(chs); i++ {
chs[i] = make(chan int, 4)
chs[i] <- 1
}
finish := make(chan int, 4)
for i := 1; i < 5; i++ {
go print(i,chs,finish)
}
num := 0
for num != 4 {
select {
case <-finish:
num ++
}
}
} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |