键盘输入
var name string
fmt.Println("name是")
Scan(a ...any) (n int, err error) 不带换行
Scanln(a ...any) (n int, err error) 带换行
fmt.Scanln(&name)
Scanf(format string, a ...any) (n int, err error)
fmt.Scanf("%s",&name)
流程控制
分支
if
不同于java,条件不能是赋值语句;else必须在}后边不能换行
if v < 3 {
fmt.Println(3)
} else if v > 3 {
} else {
fmt.Println(v)
}
swich
- 不需加break;
- case和swich后可以是表达式【函数(有返回值)、常量、变量】;
- case后的表达式可以有多个,隔开(不能重复)
- 穿透:fallthrougn 只能穿透一层
switch key {
case "1", "2":
fmt.Println(12)
fallthrougn
default:
fmt.Println(34)
}
循环
for i := 0; i < 10; i++ {
sum += i
}
for {} //无限循环
//遍历字符串
var s="hbeaaw爱国v我"
for i , v:=range s {
fmt.Printf("%d %c",i,v)
}
没有while,可以用for无限循环替代
指针
&取地址,*取地址中的值
var a int = 1
fmt.Println(&a) //地址
var g *int = &a
*g = 10 //改值
函数
形参类型一样可以只写一个
func add(x, y int) int {
return x + y
}
func main() {
fmt.Println(add(42, 13))
}
可返回多个值
func swap(x, y string) (string, string) {
return y, x
}
func main() {
a, b := swap("hello", "world")
fmt.Println(a, b)
}
返回值是可以被命名
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return
}
defer
defer后面必须是函数调用语句,不能是其他语句
原理:将defer语句后面的函数调用的地址压进一个栈中,在当前的函数执行完毕,CPU即将执行函数外的下一行代码之前,先把栈中的指令地址弹出给CPU执行,直到栈为空,才结束这个函数,继续执行后面的代码
func main() {
defer fmt.Println("world") //该函数执行完后执行该语句
fmt.Println("hello")
}
变量作用域
作用域为已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围。
变量可以在三个地方声明:
- 函数内定义的变量称为局部变量
- 函数外定义的变量称为全局变量
- 函数定义中的变量称为形式参数