go语法笔记整合
switch写法以及fallthrough
- 如果没有fallthrough则执行完当前语句块之后,后面不会执行。
// 第一种写法 switch后面接变量
switch a{
case 0:
fmt.Println("0")
fallthrough
case 5:
fmt.Println(5)
default:
fmt.Println(123)
}
// 第二种写法 switch后面不接变量 但是case后面接条件表达式
switch {
case input == n:
fmt.Println("you are right")
flag = true
case input>n:
fmt.Println("more than n")
case input<n:
fmt.Println("less than n")
}
}
值传递和引用传递
- map、slice、chan、指针、interface、function 是默认引用传递
函数&返回值
-
函数不能比较
-
返回值可以命名
func calc(a, b int) (sum int, avg int) {
sum = a + b
avg = (a +b)/2
return
}
- 返回值不用的时候可以用”_“来忽略
func calc(a, b int) (sum int, avg int) {
sum = a + b
avg = (a +b)/2
return}
func main() {
sum, _ := calc(100, 200)
}
- 可变参数
// 0个或者多个
- func add(arg…int) int {
}
// 1个或者多个
func add(a int, arg…int) int {
}
// 2个或者多个
func add(a int, b int, arg…int) int {
}
- defer语句
- 当函数返回时,执行defer语句。因此,可以用来做资源清理
- 多个defer语句,按先进后出的方式执行
- defer语句中的变量,在defer声明时就决定了。
- defer后面跟一条语句,或者一个函数。
func testDefer() {
var i int = 0
defer fmt.Println(i)
defer fmt.Println("second")
i = 10
fmt.Println(i)
}
输出:
10
second
0
- 格式化打印数据类型:%T
select 和 case的随机选择
package main
import (
"fmt"
"runtime"
"sync"
"time"
)
func A() int {
fmt.Println("调用A函数")
time.Sleep(100 * time.Millisecond)
return 1
}
func B() int {
fmt.Println("调用B函数")
time.Sleep(1000 * time.Millisecond)
return 2
}
func main() {
ch := make(chan int)
go func() {
select {
case ch <- A():
case ch <- B():
default:
ch <- 3
}
}()
fmt.Println(<-ch)
}
输出:
调用A函数
调用B函数
然后随机输出1或者2
解释:
select会吧每个case都计算一次,但是在最终赋值执行的时候,只会随机执行一个case。
New 和 Make
- new按照指定类型长度分配零值内存,返回指针,并不关心内部构造和初始化方式。
- Make会转换为目标类型专用的创建函数,引用类型必须使用Make创建。