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
}
復制代碼
#函數語法要點回顧
- 返回值類型寫在最后面
- 可返回多個值
- 函數作為參數
- 沒有默認參數,可選參數