【Go】1、Go语言基础

前言

本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。


Go语言的特点

Go语言由Google团队设计,以简洁、高效、并发友好为核心目标。

具有以下优点:

  1. 语法简单、 学习曲线 平缓:语法关键字很少,且容易记忆。

  2. 丰富的 标准库:大多数情况下不需要外部引入第三方库,直接使用内置标准库即可。

  3. 完善的工具链:包管理、代码格式化、测试、性能分析、文档生成、依赖管理等等,应有尽有。

  4. 静态链接:部署简单,跨平台性强,安全稳定。

  5. 高性能、高并发:接近c的性能,低内存开销。

下文将介绍Go语言的基本语法,个人感觉更是Go语言现代化(甚至有点超现代化)的体现。


数据类型

Go语言常用的数据类型:

|--------|----------------------|-----------------------------------------------|---------|----------------------------|
| 类型分类 | 类型名称 | 关键字/定义 | 默认值(零值) | 特点 |
| 布尔型 | bool | bool | false | 只能为 truefalse |
| 整数型 | 有符号整数 | int, int8, int16, int32, int64 | 0 | 根据平台不同,int 可能为 32 或 64 位 |
| | 无符号整数 | uint, uint8, uint16, uint32, uint64 | 0 | 无负数范围 |
| 浮点型 | float32, float64 | float32, float64 | 0.0 | float64 精度更高 |
| 字符/字节型 | byte(别名) | byte | 0 | uint8 的别名 |
| | rune(别名) | rune | 0 | int32 的别名 |
| 字符串型 | string | string | "" | 不可变,UTF-8 编码 |
| 错误类型 | error | error | nil | 内置接口类型,表示错误状态 |


一、变量定义

Go语言的变量定义方式有很多种:

  1. var name type :用于显式定义变量。
Go 复制代码
var a, b int = 1, 2
  1. name := val :用于隐式定义变量。
Go 复制代码
f := float32(e)
  1. const name type = val : 用于常量定义
Go 复制代码
const s string = "constant"

二、选择结构

选择结构分为 if ,switch-case。

  1. if
Go 复制代码
if a == 1 {
    fmt.Println("真的")
}else {
    fmt.Println("假的")
}
  1. switch-case
Go 复制代码
a := 2
switch a {
case 1:
    fmt.Println(1)
case 2:
    fmt.Println(2)
default:
    fmt.Println("default")
}

三、循环结构

Go语言形式上只有for循环一种循环方式,但是可以改为类似于while的形式循环。

Go 复制代码
for i := 1; i < 9; i++ {
    fmt.Print(i)
}
k := 1
for k < 10 {
    k++
    fmt.Println(k)
}

四、数组

Go语言的数组和C很类似,定长数组。

Go 复制代码
for i := 1; i < 9; i++ {
    fmt.Print(i)
}
k := 1
for k < 10 {
    k++
    fmt.Println(k)
}

五、切片

Go语言的切片类似于C++的vector、Java中的List,是一种变长数组。

并且支持类似Python中元组的操作语法。

Go 复制代码
s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println(s[2])
fmt.Println(len(s))
s = append(s, "d")
s = append(s, "e", "f")
fmt.Println(s)
c := make([]string, len(s))
copy(c, s)
fmt.Println(c)
fmt.Println(s[2:5])
fmt.Println(s[:4])
fmt.Println(s[2:])
good := []string{"g", "h", "o"}    
fmt.Println(good)

六、Map

和各种语言的Map类似,用于存储键值对。

Go 复制代码
mp := make(map[string]int)
mp["one"] = 1
mp["two"] = 2
r, ok := mp["unknow"]
fmt.Println(r, ok)

七、range

Go语言中的range类似于C++的auto,用于快速遍历。

Go 复制代码
nums := []int{2, 3, 4}
sum := 0
for i, num := range nums {
        sum += num
        if num == 2 {
                fmt.Println("idx:", i, "num:", num)
        }
}
fmt.Println(sum)
m := map[string]string{"a": "A", "b": "B"}
for k, v := range m {
        fmt.Println(k, v)
}
for k := range m {
        fmt.Println(k)
}

八、函数

Go语言的函数,个人认为是Go语言在语法上现代化的标志之一,支持多返回,非常方便。

Go 复制代码
func add(a int, b int) (int, string) {
    return a + b, "ok"
}

九、指针

Go语言的指针类似C的指针,个人非常喜欢指针,一直觉得Java把指针完全去除了也是一个问题。

在语法上,*作为解引用、&作为引用。

Go 复制代码
func add2(a *int) {
    *a += 2
}

十、结构体

Go语言提供结构体用于类型封装,特殊的是,结构体方法在Go语言中需要写在外面。

Go 复制代码
type user struct {
    name     string
    password string
}
func (this user) checkPassword(password string) bool {
    return this.password == password
}

十一、错误处理

Go语言为函数提供了一种新奇的try-catch方法。Go语言中,我们在某种方面来讲是在面向异常编程。我们需要通过 error 类型将函数中的错误返回,然后手动处理。

Go语言提供了一个特殊变量 nil 用于判断是否捕捉到了异常。

Go 复制代码
func checkError(password string) (bool, error) {
    return password == "123", errors.New("not Found")
}
v, err := checkError("456")
if err != nil {
        fmt.Println(v, err)
} else {
        fmt.Print(v)
}

十二、特殊函数

  1. json处理
Go 复制代码
type userInfo struct {
    Name string
    Age  int `json:"age"`
}
func solve14() {
        a := userInfo{Name: "wang", Age: 18}
        buf, err := json.Marshal(a)
        if err != nil {
                panic(err)
        }
        fmt.Println(buf)
        fmt.Println(string(buf))
        var b userInfo
        err = json.Unmarshal(buf, &b)
        if err != nil {
                panic(err)
        }
        fmt.Println(b)
}
  1. 时间处理
Go 复制代码
fmt.Println(time.Now())
fmt.Println(time.Now().Unix())
fmt.Println(time.Now().Format("2006-01-02 15:04:05"))
fmt.Println(time.Date(2022, 3, 27, 1, 25, 36, 0, time.UTC))
  1. 字符串转数字
Go 复制代码
fmt.Println(strconv.ParseInt("111", 10, 64))
fmt.Println(strconv.ParseFloat("111.11", 64)
fmt.Println(strconv.ParseInt("0x1000", 0, 64
fmt.Println(strconv.Atoi("111"))
  1. 获取线程信息
Go 复制代码
fmt.Println(os.Args)
fmt.Println(os.Getenv("PATH"))

下篇将对学习的语法结合视频进行综合实践。

相关推荐
ttwuai9 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
布朗克16813 小时前
Go 入门到精通-31-编码与序列化
开发语言·qt·golang·编码与序列化
microrain16 小时前
从硬编码到热插拔:SagooIoT插件架构如何打破物联网平台的扩展瓶颈
物联网·golang·开源·sagooiot
geovindu17 小时前
go:Backtracking Algorithm
开发语言·后端·算法·golang·回溯算法
qq_4523962317 小时前
第六篇:《并发编程核心:Goroutine 与 Channel》
golang
llwszx18 小时前
【Java/Go后端手撸原生Agent(第五篇):多工具并行调用 + BashTool执行引擎 + Judge证据链升级】
java·后端·golang·状态机·pydantic·agnet·llm-as-judge
FfHUCisI18 小时前
Go语言程序结构 —— 变量、声明与零值机制
golang
超人不会飞_Jay19 小时前
Go课程2
开发语言·后端·golang
晴空了无痕1 天前
从 Go 基础到 K8s:一条可落地的 Go 服务端成长路线
开发语言·后端·golang·kubernetes
qq_452396231 天前
第五篇:《接口与错误处理:Go 的哲学》
开发语言·后端·golang