golang 面试题尝试解答

题目链接

交替打印数字和字母

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 ++
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值