if

if的条件里可以赋值
if条件里赋值的变量作用域就在这个if语句里(外面无法访问)

func bounded(v int) int {
// if的条件里不需要括号
    if v > 100{
        return 100;
    } else if v < 0 {
        return 0;
    } else {
        return v;
    }
}

//Go语言是可以返回两个值的
func main () {
    const filename = "abc.txt"
    //contents为文件内容 err为错误信息 具体返回内容看ReadFile方法内部
    contents,err := ioutli.ReadFile(filename)
    //判断报错是否为空
    if err != nil {
        fmt.Println(err)
    } else {
        //打印文件用Printf
        //contents为byte数组
        fmt.Printf("%s\n",contents)
    }
}
//如果文件存在输出结果为文件中的内容,如果文件不存在输出结果为文件不存在

//上面内容可以简写为以下语句 但是contents和err只存在if语句内,无法在外面使用

func main () {
    const filename = "abc.txt"
    if contents,err := ioutli.ReadFile(filename); err != nil{
        fmt.Println(err)
    } else {
        fmt.Printf("%s\n",contents)
    }
}

switch

switch会默认break,除非使用fallthrough
switch后面可以没有表达式

func eval(a,b int, op string) int {
    var result int
    switch op{
    case "+":
        result = a+b
    case "-":
        result = a+b
    case "*":
        result = a*b
    case "/":
        result = a/b
    default:
    //下面语句相当于报错
        panic("unsupported operator:" + op)
    }
    return result
}

func grade(score int)string {
    g := ""
    switch {
    case score<0 || score>100:
        panic(fmt.Sprintf(
                "Wrong score: %d", score))
    case score<60:
        g = "F"
    case score<80:
        g = "C"
    case score<90:
        g = "B"
    case score<=100:
        g = "A"     
    }
    return g
}

fmt.Println(
    grade(0),
    grade(60),
    grade(82),
    grade(99),
    //抛去最后的grade(101)结果为F C B A
    //存在最后一个grade(101)直接报错 panic: Wrong score: 101
    //grade(101)
    )