跳至主要內容

基本语法

LincZero大约 4 分钟

基本语法

基本语法

  1. 分号可选,按行编译(本质上是行尾非括号时自动加分号,这点和 JavaScript 无分号风格的处理原理是不一样的)
  2. 定义的变量或import的包如果没有使用到,编译不过。这点与其他语言不同
  3. (废话)
    • 严格大小写
    • 入口main函数
    • 大括号成对出现

注释

  • 行注释://,VSC快捷键:Ctrl+/
  • 块注释:/**/,VSC快捷键:Shift+Alt+A

代码风格

Go禅:想要开发者有统一的代码风格,一个问题尽量只有一个解决方案是最好的

个人吐槽:……,感觉有的地方该有多个解决方案的变成一个了,有的应该只有一个但又给了多个,还是有点神经

可以借助bin里格式化工具来格式化:gofmt -w test.go (不-w的话只会显示格式化后的效果而不会覆盖)

VSC插件:go nightly插件, 想不对齐都难, 强制自动对齐

  • 缩进:Tab、Shift+Tab

  • 空格:运算符两边加空格

  • 括号:成对编程、第一个括号要紧跟在行尾。

    • 其实这还有一个深层原因:是自动加分号的问题,如果第一个括号在下一行,则该行的行尾会被自动加上分号
  • 注释:推荐行注释

  • 行长约定:80(最烦这个了),多行打印:

    fmt.Println("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
               "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
               "cccccccccccccccccccccccccccccccccccccccccccccccccc",
               "dddddddddddddddddddddddddddddddddddddddddddddddddd")
    

命名(标识符 (biao zhi fu))

标识符

什么是标识符?只要是起名字的地址,那个名字就是标识符 (变量名、函数名、类名、包名、XX名等)

  1. 组成

    • 数字、字母、下划线 三种组成
    • 需注意不能以数字开头、严格大小写
  2. 规范

    • 见名知意
    • Go的"字母"包括汉字和特殊字符,但不建议使用
    • 长度无限制,但不建议太长
  3. 特殊值

    • 不包含空格、不能用保留关键字

    • 可以 var int int = 10,但尽量不要用 (int, float32, float64等居然不算保留关键字)

    • 下划线 _ 是特殊标识符,也叫 空标识符。对应的值会被忽略

      • 例如:可用于忽略某个返回值,仅用于占位符使用

      • 例如:做忽略 (可以代替注释,不过感觉奇奇怪怪的)

        import(
        	"fmt"
            _"strconv"	// 没有用到的库,可以注释掉,也可以加`_`来忽略
        )
        
  4. 不同的标识符对象

    • 变量名/函数名/常量名 命名规范:(与其他语言不同)

      • 小驼峰:只能本包使用
      • 大驼峰:可以给其他包使用
      • (这样的话话说Go的类名怎么搞?) (命名方法决定访问权限这点,有点类似python命名中的 _ 开头) (C++成员函数中的 m_ 开头或 _ 结尾不算这一类,这种只是约定而不是真的权限控制)
    • 文件名:源文件.go为扩展名

    • 文件夹名:package和目录名最好保持一致,如果是入口包则为main

保留关键字 补充

关键字 (25个),别名 保留字、保留关键字

break, case, chan, const, continue,
default, defer, else, fallthrough, for, func,
go, goto, if, import, interface, map, package,
range, return, select, struct, switch, type, var

预定义标识符 (36个),包括 基础数据类型和系统内嵌函数

bool, byte, string,
uint, uint8, uint16, uint32, uint64, int, int8, int16, int32, int64,
true, false, float32, float64, complex, conmplex64, complex126,
uintprt, nil

append, cap, close, copy, imag, iota, len, 
make, new, panic, print, println, real, recover

别名 (变量、函数、包)

类似 C++ 的 typeof或using,但Go的别名会认为是两种不同的类型 (虽然可以互相强转)

// 语法
type 新名 旧名

// 例如 - 变量别名
type myInt int
var i1 myInt = 6
var i2 int = myInt			// 【报错】编译时,Go 会认为这两种不是同一种数据
var i2 int = int(myInt)		// 正确写法

// 例如 - 函数别名
type myFunc func(int)

// 例如 - 包别名
package main
import (
    test "gocode/testproject01/unit5/demo09/crm/calutils"	// 该函数 package aaa,即原名aaa
)
func main() {
    //aaa.Add()		// 报错:若不使用别名是这样用。但定义别名后该用法会报错,相当于原名别抹除了
    test.Add()		// 定义别名后的正确使用方法
}