Go基础语法(参考Go语言圣经) | 青训营

70 阅读4分钟

输出及编译运行

  1. 编译:
    go build hello. go ./hello
    输出 hello world
    build生成名为hello的可执行二进制,hello world 件之后可随时运行
  2. 运行:
    go run hello.go
    输出 hello world
    run编译一个或多个以go结尾的源文件, 链接库文件, 并运行最终生成的可执行文件
  3. Go语言圣经
  • Go语言的代码通过包package组织, 相当于库;每个源文件以一条package声明语句开始, 表明文件属于哪个包,紧跟着一系列导入的包, 之后是程序语句;
  • Go语言不需要在句末添加分号,编译器会自动将特定符号后的换行符转化为分号;
  • 特定符号包括标识符(变量、函数、方法的名字)、数据类型常量关键字(break, contimue等)、分隔符(++、--、)、]、});
  • 函数的左括号必须和函数声明在同一行, 不能独占一行。

程序结构

  1. 命名:
    驼峰式命品(名字的开头字母的大小决定了名字在包外的可见性)
    如Println函数是导出的, 可在fmt包外访问
  2. 声明:
    var const type func
    变量 常量 类型 函数实体
    • 变量
      var 变量名字 类型 = 表达式
      如初始化被省略,则使用默认值,数值类型为 0, 布尔类型为false, 字符串为空,接口或引用为nil
      名字 := 表达式
      变量类型由表达式自动推导
      简洁、灵活, 广泛用于大部分局部变量的声明和初始化
      := 是变量声明语句, = *是变量赋值操作
      例如 i, j = j, i是交换i和j的值
      赋值语句中必须至少声明一个新的变量
      in, err = os. Open(infile) out, err = os. Create(outfile) √
      f, err = os. Open(infile) f, err = os. Create(outfile) ×
    • 常量
      常量const没有确定的类型, 要根据上下文自动确定类型
      所有常量的计算都可以在编译期完成, 减少运行时的工作
      如果批量声明常量, 除第一个外其它可没有初始化表达式可省略, 同上一式一样
      const{a = 1 b c = 2 d } 1, 1, 2, 2
      • iota常量生成器
        生成一组以相似规则初始化的变量, 但不用每行都写一遍
        第一街, iota为 0, 而后每行加1
      • 无类型常量
        可以提供更高的运算精度. 且直接用于表达式而不需显示转换
    • 类型
      一个类型声明语句创建了一个新的类型名称, 和现有类型具有相同的底层结构
      type 类型名字 底层类型
      类型声明一般出现在包一级(首字母大小决定包外可否使用)
  3. 包和文件:
    每个源文件的包声明前紧跟着的注释是包注释, 说明包的功能概要
    如果导入一个包而不使用将会出现编译错误, 必须删除或注释无用的包
    更好的解决方案: golang.org/x/tools/cmd/goimports 导入工具,根据需要自动添加或删除包
    包的初始化工作是自下而上进行的, main包最后被初始化, 可确保main执行之前, 所有包已被初始化
    (一些复杂的初始化工作使用特殊的init函数, 在程序开始时自动被调用)
  4. 作用域:
    作用域:一个源代码的文本区域(编译属性)
    生命周期:程序运行时变量存在的有效时间段(运行时概念)
    log.Fatalf("os. Getwd failed: %v", err) 日志输出错误信息

基础数据类型

  • 整形
    有符号: int8 int16 int32 int64
    无符号: uint8 uint16 uint32 uint64 uintptr
    运算符: 在Go中, % 运算的两个数符号总是一致的;/的行为依赖于操作数是否全为整数, 5.0/4.0 = 1.25, 5/4 = 1
    类型转换: T(x) 将x类型转换为T类型 int(apple)→ var apple int32 = 1
  • 浮点型
    float32 float64
  • 复数
    complex32 complex64
  • 布尔型
  • 字符串
    性能优化:
    +拼接性能最差, strings.Buffer, bytes.Bufer相近, string更快
    (每次+都会重新分配内存 , string和byte底层都是bye数组,string直接转化为字符串返回,byte转化为字符串时重新申请了一块空间)
    s: ="hello world" s[0:5] “"hello" s[:5] "hello" s[7:] "world" s[:] "hello world"
  • 常量

格式化输出:
% v 原样输出
% #v 名字: 值
% T 打印类型
% p 打印地址
% d 10 进制
% b 2进制
% o 8 进制
% x 16 进制
% t bool
% f 浮点
% c char

复合数据类型

1.jpg

2.jpg

3.jpg

4.jpg