go工程师代码面试题总结(未完待续)

463 阅读1分钟
  1. 以下代码能否正确输出?如果能,请说明

    func Add(a int, b int) int {
    	c := a + b
    	fmt.Println(a, b, c)
    	return c
    }
    
    func TestAdd(t *testing.T) {
    	a := 2
    	b := 4
    	defer Add(a, b)
    	a = 3
    	defer Add(a, b)
    	b = 5
    }
    

    eg:

    === RUN   TestAdd
    3 4 7
    2 4 6
    --- PASS: TestAdd (0.00s)
    PASS
    
    Process finished with exit code 0
    
  2. 一个日志记录服务,每满100条返回一次,或者超出1s返回一次,该服务如何实现,请写出主要代码,要求使用 channel,sync.WaitGroup

    eg:

    func TestPrintLog(t *testing.T) {
    	var ch = make(chan string, 100)
    	var wg sync.WaitGroup
    	wg.Add(2)
    	go send(ch, &wg)
    	go receive(ch, &wg)
    
    	wg.Wait()
    	fmt.Println("over")
    
    	defer close(ch)
    }
    
    func send(ch chan string, wg *sync.WaitGroup) {
    	for i := 0; i < 10000; i++ {
    		ch <- "消息:" + strconv.Itoa(i)
    	}
    	wg.Done()
    }
    
    func receive(ch chan string, wg *sync.WaitGroup) {
    	var loglist [100]string
    	y := 0
    	for {
    		if y >= 10000 {
    			fmt.Println("y >= 10000",y)
    			wg.Done()
    			return
    		}
    		for i := 0; i < 100; i++ {
    			select {
    			case loglist[i] = <-ch:
    				y++
    			case <-time.After(time.Second * 1):
    				return
    			}
    		}
    		fmt.Println(loglist)
    	}
    }