/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ funcpostorderTraversal(root *TreeNode) []int { res := []int{} var postorder func(root *TreeNode) postorder = func(root *TreeNode) { if root != nil { postorder(root.Left) postorder(root.Right) res = append(res, root.Val) } } postorder(root)
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ funcpostorderTraversal(root *TreeNode) []int { res := make([]int, 0) stack := make([]*TreeNode, 0) cur := root var pre *TreeNode
forlen(stack) > 0 || cur != nil { for cur != nil { stack = append(stack, cur) cur = cur.Left } iflen(stack) > 0 { cur = stack[len(stack)-1] if cur.Right == nil || pre == cur.Right { // 若栈顶节点右子树为空,或者刚刚遍历过右子树 // 遍历栈顶节点并弹出 res = append(res, cur.Val) pre = cur stack = stack[:len(stack)-1] cur = nil } else { // 否则进入右子树 cur = cur.Right } } }
func(path Path)TranslateBy(offset Point, add bool) { var op func(p, q Point)Point if add { op = Point.Add } else { op = Point.Sub } for i := range path { // Call either path[i].Add(offset) or path[i].Sub(offset). path[i] = op(path[i], offset) } }
// WaitForServer attempts to contact the server of a URL. // It tries for one minute using exponential back-off. // It reports an error if all attempts fail. funcWaitForServer(url string)error { const timeout = 1 * time.Minute deadline := time.Now().Add(timeout) for tries := 0; time.Now().Before(deadline); tries++ { _, err := http.Head(url) if err == nil { returnnil// success } log.Printf("server not responding (%s);retrying…", err) time.Sleep(time.Second << uint(tries)) // exponential back-off } return fmt.Errorf("server %s failed to respond after %s", url, timeout) }
for name := range ages { names = append(names, name) } // 显式的对key排序 sort.Strings(names) // 依据顺序的key对map顺序遍历 for _, name := range names { fmt.Printf("%s\t%d\n", name, ages[name]) }
// 坐标点 type Point struct { X, Y int } // 圆 type Circle struct { Center Point // 圆心 Radius int// 半径 } // 轮子 type Wheel struct { Circle Circle Spokes int// 径向辐条的数量 }
但是这会使得访问每个成员变得繁琐:
1 2 3 4 5
var w Wheel w.Circle.Center.X = 1 w.Circle.Center.Y = 1 w.Circle.Radius = 2 w.Spokes = 10
所以可以使用匿名成员:
1 2 3 4 5 6 7 8
type Circle struct { Point // 匿名结构体 Radius int } type Wheel struct { Circle // 匿名结构体 Spokes int }
得意于匿名嵌入的特性,我们可以直接访问叶子属性而不需要给出完整的路径:
1 2 3 4 5
var w Wheel w.X = 1 w.Y = 1 w.Radius = 2 w.Spokes = 10d