包管理[1]

  1. 创建一个stack包
package stack

import "strconv"

type Stack struct {
	index int
	data  [10]int
}

func (s *Stack) Push(k int) {

	if s.index + 1 > 9 {
		return
	}

	s.data[s.index] = k
	s.index ++
}

func (s *Stack) Pop() (ret int) {

	s.index --

	if s.index < 0 {
		s.index = 0
		return
	}
	ret = s.data[s.index]
	return
}

func (s Stack) String() string {
	var str string

	for i := 0; i < s.index; i++ {
		str = str + "[" + strconv.Itoa(s.data[i]) + "]"
	}

	return str
}
  1. 为这个包编写一个单元测试,至少测试 Push 后 Pop 的工作情况。
package stack

import "testing"

func TestPushPop(t *testing.T) {
	c := new(Stack)

	c.Push(5)
	c.Push(2)
	c.Push(1)
	//测试其push和pop的正确性
	if c.Pop() != 1 && c.Pop() != 2 {
		t.Log("Pop does't give 1! and 2")
		t.Fail()
	}
}
  1. 使用 stack 包创建逆波兰计算器(代码未通过,待测试)。
package main

import (
	"bufio"
	"fmt"
	"os"
	"stack"
	"strconv"
)

var reader = bufio.NewReader(os.Stdin)

var st = new(stack.Stack)

func main() {

	for {
		s, err := reader.ReadString('\n')
		var token string

		if err != nil {
			return
		}

		for _, data := range s {
			switch {
			case data >= '0' && data <= '9':
				token = token + string(data)
			case data == ' ':
				r, _ := strconv.Atoi(token)
				st.Push(r)
				token = ""
			case data == '+':
				fmt.Printf("%d\n", st.Pop()+st.Pop())
			case data == '*':
				fmt.Printf("%d\n", st.Pop()*st.Pop())
			case data == '-':
				p := st.Pop()
				q := st.Pop()
				fmt.Printf("%d\n", q-p)
			case data == 'q':
				return
			default:
				fmt.Print("exit")
			}
		}
	}

}

书本链接learning go

下一章是进阶知识ヽ( ̄▽ ̄)و


  1. 题图出处 ↩︎