语言基础

70 阅读2分钟

键盘输入

    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")
}

变量作用域

作用域为已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围。

变量可以在三个地方声明:

  • 函数内定义的变量称为局部变量
  • 函数外定义的变量称为全局变量
  • 函数定义中的变量称为形式参数