二、Go语法基础(基本语法)

Golang中文学习文档地址

1、Hello Word

go 复制代码
package main

import "fmt"

func main() {
    fmt.Println("hello world")
}
  • package关键字:声明Go文件属于哪个包

    package main:Go程序的入口,Go运行时会从main包的main()函数开始执行。

  • import关键字:导入需要调用的包

    以上案例中,需要调用fmt包下的Println()函数。

  • func关键字:声明一个函数

    func main():Go程序的主入口函数,Go运行时从main()函数开始执行。

2、包

  • 简介

    Go中,所有程序文件都是通过包联系在一起的,包是Go导入其他Go程序文件的基本单元,而不是Go文件。包可以简单理解为是一个文件夹,包内共享所有变量,常量,以及所有定义的类型。包的命名风格建议都是小写字母,并且要尽量简短

    包是Go导入其他Go程序文件的基本单元:

    例如有一个num包,底下有两个Go文件num1.go和num2.go,当main中要使用num1.go的函数时,需要import num包,此时也会讲num2.go导入,而无法只导入num1.go。

  • Go的可见性

    在Java中,使用public、private、protected关键字表明变量、常量、方法等的可见性,但在Go中,使用声明的名称首字母大小表明可见性,且只有包外可见和包内可见两种可见性,

    • 首字母大写:公有类型/变量/常量,即包外可见。

    • 首字母小写:私有类型/变量/常量,即包内可见。

go 复制代码
package  visibility

const PubParam = "my_public_param"
const priParam = "my_private_param"
  • 包的导入

    • 导入包,可以使用这个包内公有的类型、变量、常量。

      • 导入一个包

        go 复制代码
        import "visibility"
      • 导入多个包

        go 复制代码
        import (
           "visibility1"
           "visibility2"
        )
      • 导入的包取别名

        go 复制代码
        import (
            v1 "visibility1"
            v2 "visibility2"
        )
      • 匿名导入包,别名为_时为匿名导入,匿名导入的包无法使用其中声明的函数,匿名导入的目的只有一个,就是加载其中的init函数。

        go 复制代码
        import (
            v1 "visibility1"
            _ "visibility2"
        )
        • init函数

          在Go中,init函数是一种特殊的函数,在包被导入时执行初始化,当一个包内有多个go文件,Go会依次执行每个go文件的init函数(如果有声明init函数的话)。

          go 复制代码
          func init() {
              fmt.Println("init")
          }
    • 特殊的导入方式:允许直接使用导入包中的函数和变量,而无需使用包名前缀。

      go 复制代码
      //问题:因使用导入的包的函数或变量无需使用包前缀,所以在当前如果有相同名称的函数或变量,
      //     则会冲突,编译不通过。
      package main
      import (
          . "visibility"
      )

      注意:Go中,包无法循环依赖,无论直接还是间接。

  • 内部包

    在Go语言中,内部包(internal packages) 是一种特殊的包管理机制,用于限制包的可见性。通过内部包,开发者可以定义一些仅供特定模块或项目内部使用的包,从而避免这些包被外部项目直接引用。这种机制有助于维护代码的封装性和模块化。

    当如果有一个包只需要在特定模块内使用,则在该模块文件夹下创建internal目录(包),则该包下的所有Go文件,只能在该模块下使用,不能被模块外的其他Go文件所导入。

3、注释

Go中支持单行注释和多行注释。

go 复制代码
// 定义一个包名
package main

import "fmt"

/**
* 程序的入口
*/
func main() {
	fmt.Println("hello world")
}

4、标识符

  • 作用:用于包、函数、变量、常量等的命名。

  • 标识符命名规则

    • 只能由字母、数字、下划线组成。
    • 只能以字母和下划线开头。
    • 严格区分大小写
    • 不能与任何已存在的标识符重复,即包内唯一的存在。
    • 不能与 Go 任何内置的关键字冲突。
  • Go内置的关键字

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

5、运算符

  • 运算符优先级
操作 优先级
* / % << >> & &^ 5
+ - 4
== != < <= > >= 3
&& 2
|| 1
  • 复用运算符(^

    • 两个数字使用^时(a ^ v),属于异或运算(两个输入值不同,输出真,两个输入值相同,输出假)。
    • 一个数字使用^时(^a),取反运算符。
  • 增强赋值运算符

    go 复制代码
    a += 1
    a /= 2
    a &^= 2
  • 自增/自减

    • Go不支持前自增/前自减,只支持后自增/后自减
    go 复制代码
    a++ // 正确
    ++a // 错误
    a-- // 正确
    • Go自增/自减不具有返回值。
    go 复制代码
    a = b++ //该语法错误

6、字面量

  • 字面量,按照计算机科学的术语来讲是用于表达源代码中一个固定值的符号,也叫字面值。也就是字面意义上的值。
  • 字面量的分类
    • 整型字面量

      go 复制代码
      2
      3
      1
    • 浮点字面量

      go 复制代码
      3.4
      4.321
    • 复数字面量

      go 复制代码
      4i
      313i
    • 字符字面量

      go 复制代码
      'a'
      '你'
    • 转义字面量

      go 复制代码
      \a   U+0007 响铃符号
      \b   U+0008 回退符号
      \f   U+000C 换页符号
      \n   U+000A 换行符号
      \r   U+000D 回车符号
      \t   U+0009 横向制表符号
      \v   U+000B 纵向制表符号
      \\   U+005C 反斜杠转义
      \'   U+0027 单引号转义 (该转义仅在字符内有效)
      \"   U+0022 双引号转义 (该转义仅在字符串内有效)
    • 字符串字面量

      go 复制代码
      "hello go"

7、函数

  • 函数声明的关键字:func

    go 复制代码
    func main(){
        fmt.Println("hello word")
    }
  • Go函数的两个特点

    • 参数类型后置
    go 复制代码
    func hello(name string){
       fmt.Println(name)
    }
    • 允许多个返回值
    go 复制代码
    func index()(a ,b int){
         a= 1
         b= 2
         return a,b
     }

8、风格

  • 关于编码风格这一块 Go 是强制所有人统一同一种风格,Go 官方提供了一个格式化工具gofmt,通过命令行就可以使用,该格式化工具没有任何的格式化参数可以传递,仅有的两个参数也只是输出格式化过程,所以完全不支持自定义。

  • Go中一些规则

    • 函数花括号换行

      在Go中,所有的左花括号都不允许换行。

      go 复制代码
      //编译不通过
      func hello()
      {
          fmt.Println("hello go")
      }
    • 代码缩进

    • 代码间隔

    • 花括号省略

    • 三元表达式

      Go中没有三元表达式。

相关推荐
struggle20251 天前
AxonHub 开源程序是一个现代 AI 网关系统,提供统一的 OpenAI、Anthropic 和 AI SDK 兼容 API
css·人工智能·typescript·go·shell·powershell
Mgx1 天前
高性能 Go 语言带 TTL 的内存缓存实现:精确过期、自动刷新、并发安全
go
考虑考虑1 天前
go格式化时间
后端·go
光头闪亮亮2 天前
ZBar 条码/二维码识别工具介绍及golang通过cmd调用ZBar从图片中批量识别二维码
go
东风t西瓜2 天前
golang项目开发环境配置
go
zhuyasen3 天前
在某些 Windows 版本,Go 1.25.x 编译出来的 exe 运行报错:此应用无法在你的电脑上运行
windows·go·编译器
用户89535603282203 天前
深入浅出 Go slices 包:类型安全、内存安全与高性能实践
go
王中阳Go3 天前
Python 的 PyPy 能追上 Go 的性能吗?
后端·python·go
gopyer4 天前
180课时吃透Go语言游戏后端开发11:Go语言中的并发编程
golang·go·游戏开发·并发编程