Golang语法一览(上)

安装 Go 的方法可以自行查阅相关资料,通过命令 go version 查看 go 版本。

如果使用的是 VS Code,推荐安装插件:Go

然后设置goMod状态:

ini 复制代码
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

如果不设置,将无法正常安装插件,插件很好用,可看函数定义、可格式化代码。

零、依赖管理

在 go 中使用 gomod 文件进行依赖管理,类似于 node 中的 package.json 文件。

  1. 初始化gomod文件
bash 复制代码
go mod init github.com/knight174/hello
  1. 安装依赖
go 复制代码
go mod tidy
  1. 创建第一个go程序
go 复制代码
// main.go
package main

func main () {
	println("Hello, World!")
}
  1. 编译
go 复制代码
go build main.go
# go build .

生成一个二进制文件:

  1. 运行
bash 复制代码
./main

一、变量、常量

go 复制代码
package main

import "fmt" // 引入包

func main() {
  // This is a comment.
  println("Hello, World!")
  
  var zero int
  fmt.Println(zero) // 默认值 0
  
  var a int = 1       // 声明并赋值一个变量
  var b, c int = 2, 3 // 声明并赋值多个变量
  fmt.Println(a, b, c)

  // 用括号来组合声明多个变量
  var (
    a1     int = 1
    b1, c1 int = 2, 3
  )
  fmt.Println(a1, b1, c1)

  // 使用:=来声明并赋值变量(只能在函数内部使用)
  d := 4
  e, f := 5, 6
  fmt.Println(d, e, f)
  
  // 声明并赋值变量
  const G = 7
  fmt.Println(d, e, f)

  // 声明枚举常量并初始化
  const (
    A0 = iota // 0
    A1        // 1
    A2        // 2
  )
  fmt.Println(A0, A1, A2)
  
  const (
    B0 = iota + 1 // 1
    B1            // 2
    B2            // 3
  )
  fmt.Println(B0, B1, B2)

  const (
    C0 = iota // 1
    _         // 2
    C2        // 3
    C3        // 4
  )
  fmt.Println(C0, C2, C3)
}
  • 使用 import 引入包

  • 不写类型会自动推断(与TS类似)

  • iota表示枚举,从0开始,只能用于const常量

  • 使用:=声明赋值的变量只能用在函数内部,用varconst声明的变量可以放在函数外部去声明

    go 复制代码
    package main
    
    import 'fmt'
    
    var a = 1 // ✅
    const E = 4 // ✅
    
    d := 3 // ❌
    
    func main() {
      var b = 1 // ✅
      c := 2 // ✅
      const F = 5 // ✅
      fmt.Println(b, c, F)
    }

二、函数

go 复制代码
package main

import "fmt"

// 函数
func add(a int, b int) int {
	return a + b
}

func main() {
  fmt.Println(add(1, 2))

  // 匿名函数
  var add2 = func(a int, b int) int {
    return a + b
  }
  fmt.Println(add2(1, 2))

  add3 := func(a int, b int) int {
    return a + b
  }
  fmt.Println(add3(1, 2))

  // 立即执行函数
  result := func(a int, b int) int {
    return a + b
  }(1, 2)
  fmt.Println(result)

  // 返回两个值
  swap := func(a, b string) (string, string) {
    return b, a
  }
  a, b := swap("hello", "world")
  fmt.Println(a, b)

  // 可变参数函数
  sum := func(nums ...int) int {
    total := 0
    for _, num := range nums {
      total += num
    }
    return total
  }
  fmt.Println(sum(1, 2, 3, 4, 5))

  nums := []int{1, 2, 3, 4, 5}
  fmt.Println(sum(nums...))
}
  • func 开头定义的函数只能放在函数外面
  • 函数可以返回多个值

三、if、switch

if 语句

go 复制代码
// if 语句
num := 9
if num < 0 {
  println(num, "is negative")
} else if num < 10 {
  println(num, "has 1 digit")
} else {
  println(num, "has multiple digits")
}

// 上面代码等价于下面,if 中可以同时使用两个表达式
if num2 := 9; num2 < 0 {
  println(num2, "is negative")
} else if num2 < 10 {
  println(num2, "has 1 digit")
} else {
  println(num2, "has multiple digits")
}
  • if 或 else if 可以接多个表达式
  • 条件语句上不用写括号

switch 语句

go 复制代码
// switch 语句
switch num {
case 1:
	println("one")
case 2:
	println("two")
case 3:
	println("three")
default:
	println("more")
}

// 多个条件用逗号隔开
switch time.Now().Weekday() {
case time.Saturday, time.Sunday:
	println("it's the weekend")
default:
	println("it's a weekday")
}

// fallthrough 语句,漏斗
switch num {
case 1:
	println("one")
	fallthrough
case 2:
	println("two")
	fallthrough
case 3:
	println("three")
default:
	println("more")
}
  • 断点时不用写break
  • case语句中,多个条件用逗号分隔
  • 使用 fallthrough 继续执行下一个条件

四、for

go 复制代码
for j := 1; j <= 10; j++ {
  println(j)
}

i := 1
for i <= 10 {
  println(i)
  i++
}

// while 循环,k大于3时退出循环
k := 1
for {
  if k > 3 {
    break
  }
  fmt.Println("loop", k)
  k++
}

// 无限循环
// for {
//   println("loop")
// }
  • for + 0 个表达式,相当于 JS 的 while(true)
  • for + 1 个表达式,相当于 JS 的 while(condition)
  • for + 2 个表达式,相当于 JS 的 for 循环

总结

以上是 Go 语言的基础语法,包括变量、函数、分支语句、循环语句,它们是大多数编程语言的基本构成。下篇将介绍 Go 语言中的数据类型,它与 JS 这种动态弱类型语言还是有所不同的,但又与 TS 有相似之处。

相关推荐
万少7 小时前
Vibe Coding不停歇,移动端 TRAE SOLO 让你用手机也能编程啦
前端·javascript·后端
Rust研习社7 小时前
为什么 Rust 没有空指针?
开发语言·后端·rust
皮皮林5517 小时前
全网最全的 Jenkins + Maven + Git 自动化部署指南!
后端
舒一笑8 小时前
用几十行代码搞定 Chat 接口透明转发:跨环境轻量级网关实战
后端·程序员·架构
铁皮饭盒9 小时前
成为AI全栈 - 第3课:路由 RESTful Elysia 状态码 设计规范
前端·后端·全栈
我叫黑大帅9 小时前
如何通过 Python 实现招聘平台自动投递
后端·python·面试
狼爷9 小时前
短视频播放量(Views)计数系统实现方案:高并发、不丢数的工业级实践
后端·架构
苍何10 小时前
我用 Tabbit 浏览器搭了一套内容创作全自动流水线,太香了!
后端
苍何11 小时前
全网首测,TRAE SOLO 的 AI 麦克风!
后端
IT_陈寒11 小时前
Redis这个内存杀手,差点让我们运维半夜追杀我
前端·人工智能·后端