Apple 要求开发者使用 launchd 来添加开机启动服务,这个 launchd
会用两个进程来启动服务,分别是daemon一个是agent。前者处理系统开机后并启动服务,后者处理用户登录后并启动服务,他们的配置文件是一个符合
xml
规范的plist文本文档来实现的,该plist位于以下目录,各目录决定了其启动的先后和拥有的权限:
funccalc(index string, a, b int)int { ret := a + b fmt.Println(index, a, b, ret) return ret } funcmain() { a := 1 b := 2 defer calc("1", a, calc("10", a, b)) a = 0 return }
执行代码输出:
1 2
10 1 2 3 1 1 3 4
defer 函数的参数,第三个参数在 defer
时就已经计算完成并确定,第二个参数 a 也是如此,无论之后
a 变量是否修改都不影响。
被 defer
的函数可以读取和修改带名称的返回值
1 2 3 4 5 6 7 8 9 10 11 12
package main
import"fmt"
funcmain() { fmt.Println(c()) }
funcc() (i int) { deferfunc() { i++ }() return1 }
被 defer 的函数是在 return
之后执行的,可以修改带名称的返回值,上面的函数 c 返回的是
2。
construct(arr): // n 是子结点所在那一层的节点个数 n = length(arr) // 开 2 * n 的数组,这样就可以一半用来存储子结点(叶子结点存储的是一个数组成的区间),一半用来存储非叶子结点(非叶子结点存储的是区间汇总信息) segmentTree = newint[2 * n] // 先初始化的是叶子结点,叶子结点的范围是 [n, 2 * n - 1] for i from n to 2 * n - 1: segmentTree[i] = arr[i - n] // 初始化父结点,就是合并区间的操作,通过左右叶子结点得到区间汇总信息 for i from n - 1 to 1: segmentTree[i] = merge(segmentTree[2 * i], segmentTree[2 * i + 1])
minimum(left, right): // left 在线段树中的下标位置 left = left + n // right 在线段树中的下标位置 right = right + n // 初始化最小值 minimum = Integer.MAX_VALUE while left < right: if left is odd: // left is out of range of parent interval, check value of left node first, then shift it right in the same level minimum = min(minimum, segmentTree[left]) left = left + 1 if right is odd: // right is out of range of current interval, shift it left in the same level and then check the value right = right - 1 minimum = min(minimum, segmentTree[right]) // 向根结点遍历 left = left / 2 right = right / 2
for (inti=0; i < n; i++) { minSegmentTree.add(0); }
for (inti= n; i < 2 * n; i++) { minSegmentTree.add(arr[i - n]); }
for (inti= n - 1; i > 0; i--) { minSegmentTree.set(i, Math.min(minSegmentTree.get(2 * i), minSegmentTree.get(2 * i + 1))); } }
publicvoidupdate(int i, int value) { i = i + n; minSegmentTree.set(i, value);
while (i > 1) { i = i / 2; minSegmentTree.set(i, Math.min(minSegmentTree.get(2 * i), minSegmentTree.get(2 * i + 1))); } }
publicintminimum(int left, int right) { left = left + n; right = right + n; intmin= Integer.MAX_VALUE;
// 如果 left == right 说明,最小值已经产生,只可能是下一层的数 // left == right 说明缩减到只有一个数字的区间了。 while (left < right) { if ((left & 1) == 1) { min = Math.min(min, minSegmentTree.get(left)); left = left + 1; }
if ((right & 1) == 1) { right--; min = Math.min(min, minSegmentTree.get(right)); }