for循环
-
if条件里不需要括号
-
err != nil 判断是否为空
func main(){const filename = "abc.txt"contents , err := ioutil.ReadFile(filename); err != nil{fmt.Println(err)} else{fmt.Printf("%s\n",contents)}
}
复制代码
- if的条件里可以进行赋值
- if的条件里赋值的变量作用域就在这个if语句里
if contents,err := ioutil.ReadFile(filename); err == nil{fmt.Println(string(contents))
}else{fmt.Println("cannit print file contents:",err)
}
复制代码
switch
- switch会自动break,除非使用fallthrough
- switch 后可以没有表达式
func grade(score int) string{g := ""switch {case score < 0 || score >100panic(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;
}
复制代码
循环
- for的条件里不需要括号
- for的条件里可以省略初始条件,结束条件,递增表达式
- 没有while
func conbertToBin(n int) string{
result := ""
for ; n > 0; n /= 2{
lsb := n % 2
result = strconv.Itoa(lsb) + result
}return result
}func main(){fmt.Println(//101convertToBin(5),//1101convertToBin(13),convertToBin(5555547),convertToBin(0),)
}
复制代码
func printFile (filename string){file, err := os.Open(filename)if err != nil{}
}scanner := bufio.NewScanner(file)for scanner.Scan(){fmt.Println(scanner.Text())}
}复制代码
- for可以什么条件也不加,此时的for循环为死循环
func forever(){for{fmt.Println("abc")}
}
复制代码
函数
- 函数可返回多个值
func div(a,b int)(int,int){return a/b,a % b
}
复制代码
- 函数返回多个值时可以起名字
- 仅用于非常简单的函数
- 对于调用者而言没有区别
func div(a,b int)(q,r int){q = a / br = a % breturn
}
复制代码
func apply(op func(int ,int) int,a,b int) int {p := reflect.VlueOf(op).Pointer(p).Name()fmt.Printf("Calling function %s with args " +"(%d,%d)",opName,a,b)return op(a,b)
}
复制代码
- 可变参数列表
func sum(numbers ...int) int{sum := 0for i := range values{sum += values[i]}return sum
}
复制代码
#函数语法要点回顾
- 返回值类型写在最后面
- 可返回多个值
- 函数作为参数
- 没有默认参数,可选参数