二、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中没有三元表达式。

相关推荐
mtngt1113 小时前
AI DDD重构实践
go
Grassto2 天前
12 go.sum 是如何保证依赖安全的?校验机制源码解析
安全·golang·go·哈希算法·go module
Grassto4 天前
11 Go Module 缓存机制详解
开发语言·缓存·golang·go·go module
程序设计实验室5 天前
2025年的最后一天,分享我使用go语言开发的电子书转换工具网站
go
我的golang之路果然有问题5 天前
使用 Hugo + GitHub Pages + PaperMod 主题 + Obsidian 搭建开发博客
golang·go·github·博客·个人开发·个人博客·hugo
啊汉6 天前
古文观芷App搜索方案深度解析:打造极致性能的古文搜索引擎
go·软件随想
asaotomo7 天前
一款 AI 驱动的新一代安全运维代理 —— DeepSentry(深哨)
运维·人工智能·安全·ai·go
码界奇点8 天前
基于Gin与GORM的若依后台管理系统设计与实现
论文阅读·go·毕业设计·gin·源代码管理
迷迭香与樱花8 天前
Gin 框架
go·gin
只是懒得想了8 天前
用Go通道实现并发安全队列:从基础到最佳实践
开发语言·数据库·golang·go·并发安全