Day02:Go语言基础语法速过02 | 青训营

简介: Day02:Go语言基础语法速过02 | 青训营

nil

在Go语言中,nil 是一个特殊的值,用于表示一个无效或不存在的指针、接口、映射、切片、函数、通道或数组。可以将 nil 视为一个空值或空引用。

在声明一个指针变量时,如果不给它指定一个具体的内存地址,它将被默认赋值为 nil,表示指针不指向任何有效的内存地址。

如果一个接口变量未被初始化,它将被赋值为 nil,表示接口不持有任何具体的值。

切片、映射和函数类型:在未进行初始化操作时,它们的零值都是 nil

错误处理

错误处理是一种重要的编程技术,用于处理程序运行中可能出现的错误情况。Go语言提供了一种简单而有效的错误处理机制,使用内置的错误类型 error 和关键字 defer, panicrecover

错误类型 errorerror 是 Go 语言内置的接口类型,用于表示错误状态。标准库中的许多函数和方法都会返回一个包含错误信息的 error 值。我们可以使用条件判断来检查函数调用返回的错误,并采取相应的处理措施。

result, err := SomeFunction()
if err != nil {
    // 处理错误
} else {
    // 使用返回值
}

defer 关键字:defer 关键字用于延迟执行函数调用,无论函数是否正常返回或发生异常,都会在函数退出之前执行。defer 通常用于释放资源、关闭文件句柄等操作。在一个函数中可以设置多个 defer 语句,它们按照后进先出的顺序执行。

func SomeFunction() error {
    file, err := OpenFile("file.txt")
    if err != nil {
        return err
    }
    defer file.Close() // 在函数退出前关闭文件
    // 其他操作...
    return nil
}

panicrecoverpanic 用于在程序发生严重错误时引发异常,而 recover 用于捕获并处理这些异常。一般情况下,应该避免使用 panicrecover,而是使用错误类型进行正常的错误处理。

func SomeFunction() {
    defer func() {
        if r := recover(); r != nil {
            // 处理异常
        }
    }()
    // 其他操作...
    if somethingWrong {
        panic("出现严重错误!")
    }
}

字符串操作

Go语言提供了一些内置函数和标准库方法来处理和操作字符串。

字符串长度:可以使用内置函数 len() 来获取字符串的长度。

str := "Hello, World!"
length := len(str)
fmt.Println(length) // 输出 13

字符串拼接:可以使用 + 运算符或 strings.Join() 函数来拼接字符串。

str1 := "Hello"
str2 := "World"
// 使用 + 运算符拼接字符串
result := str1 + ", " + str2
fmt.Println(result) // 输出 "Hello, World"
// 使用 strings.Join() 函数拼接字符串
strs := []string{str1, str2}
result = strings.Join(strs, ", ")
fmt.Println(result) // 输出 "Hello, World"

字符串分割:可以使用 strings.Split() 函数将一个字符串分割成子串。

str := "one,two,three,four"
parts := strings.Split(str, ",")
fmt.Println(parts) // 输出 ["one", "two", "three", "four"]

可以使用 strings.Contains() 函数判断一个字符串是否包含另一个子串。

str := "Hello, World!"
contains := strings.Contains(str, "World")
fmt.Println(contains) // 输出 true

可以使用 strings.Replace() 函数将一个字符串中的指定子串替换为另一个字符串。

str := "Hello, World!"
newStr := strings.Replace(str, "World", "Golang", -1)
fmt.Println(newStr) // 输出 "Hello, Golang!"

字符串格式化

字符串格式化是一种常见的操作,可以使用 fmt.Sprintf() 函数或者 fmt.Printf() 函数来进行字符串格式化输出。

使用占位符进行基本的格式化:

name := "Alice"
age := 25
fmt.Printf("Name: %s, Age: %d\n", name, age)

控制浮点数的精度和宽度:

pi := 3.14159265359
fmt.Printf("Value of pi: %.2f\n", pi)

格式化日期和时间:

import "time"
now := time.Now()
fmt.Printf("Current time: %s\n", now.Format("2006-01-02 15:04:05"))

使用 %v 占位符进行自动类型推断:

num := 42
str := "Hello"
fmt.Printf("Number: %v, String: %v\n", num, str)

时间操作

在Go语言中,时间处理是非常常见的操作。Go语言提供了time包来处理时间和日期。

获取当前时间:

import "time"
currentTime := time.Now()
fmt.Println(currentTime)

格式化时间为字符串:

import "time"
currentTime := time.Now()
formattedTime := currentTime.Format("2006-01-02 15:04:05")
fmt.Println(formattedTime)

解析字符串为时间:

import "time"
str := "2023-07-26 06:12:59"
parsedTime, _ := time.Parse("2006-01-02 15:04:05", str)
fmt.Println(parsedTime)

时间加减运算:

import "time"
currentTime := time.Now()
newTime := currentTime.Add(24 * time.Hour) // 加一天
fmt.Println(newTime)

获取特定时间单位的值:

import (
  "fmt"
  "time"
)
func main() {
  currentTime := time.Now()
  year := currentTime.Year()
  month := currentTime.Month()
  day := currentTime.Day()
  hour := currentTime.Hour()
  minute := currentTime.Minute()
  second := currentTime.Second()
  fmt.Println(year, month, day, hour, minute, second) // 输出结果作为注释:2023 July 26 6 18 45
}

计算时间差:

1

import "time"
startTime := time.Now()
time.Sleep(2 * time.Second) // 假设经过了2秒
endTime := time.Now()
duration := endTime.Sub(startTime)
fmt.Println(duration)//2.0035266s

2.sub()

package main
import (
  "fmt"
  "time"
)
func main() {
  startTime := time.Now()
  time.Sleep(2 * time.Second) // 假设经过了2秒
  endTime := time.Now()
  duration := endTime.Sub(startTime)
  fmt.Println(duration)
}

数字解析

strconv.ParseInt() 函数用于将字符串解析为整数。它的语法如下:

func ParseInt(s string, base int, bitSize int) (i int64, err error)
  • s:需要解析的字符串。
  • base:进制,取值范围为 0 到 36。当 base 为 0 时,会根据字符串的前缀来确定进制(0x 表示十六进制,0 表示八进制,无前缀表示十进制)。
  • bitSize:结果类型的位数,取值为 0、8、16、32 或 64。通常使用 0,表示根据字符串内容自动选择合适的位数。

函数返回两个值:

  • i:解析后的整数值。
  • err:可能出现的错误。

实例

package main
import (
  "fmt"
  "strconv"
)
func main() {
  str := "12345"
  if intValue, err := strconv.ParseInt(str, 10, 64); err == nil {
    fmt.Println("解析后的整数:", intValue)
  } else {
    fmt.Println("解析整数错误:", err)
  }
}

strconv.Atoi() 函数用于将字符串解析为整数。它的语法如下:

func Atoi(s string) (int, error)

参数说明:

  • s:需要解析的字符串。

函数返回两个值:

  • int:解析后的整数值。
  • error:可能出现的错误。
package main
import (
  "fmt"
  "strconv"
)
func main() {
  str := "12345"
  if intValue, err := strconv.Atoi(str); err == nil {
    fmt.Println("解析后的整数:", intValue)
  } else {
    fmt.Println("解析整数错误:", err)
  }
}

进程消息

os.Args()

os.Args 是一个字符串切片,用于获取命令行参数。它包含了程序名称和在程序名称之后传递的所有参数。

示例代码如下所示:

package main
import (
  "fmt"
  "os"
)
func main() {
  // 获取命令行参数
  args := os.Args
  // 打印程序名称
  fmt.Println("程序名称:", args[0])
  // 打印其他参数
  if len(args) > 1 {
    fmt.Println("其他参数:")
    for i := 1; i < len(args); i++ {
      fmt.Println(args[i])
    }
  }
}

假设将上述代码保存为 args_example.go,然后在命令行中执行以下命令:

go run args_example.go param1 param2 param3

输出结果将会是:

程序名称: args_example.go
其他参数:
param1
param2
param3

可以看到,os.Args[0] 存储了程序名称,而其他的参数则依次存储在 os.Args 的后续位置。

通过 os.Getenv() 函数可以获取环境变量的值。

示例:

package main
import (
  "fmt"
  "os"
)
func main() {
  // 获取环境变量的值
  value := os.Getenv("PATH")
  // 打印环境变量的值
  fmt.Println("PATH 环境变量的值:", value)
}

上述代码演示了如何获取名为 "PATH" 的环境变量的值。os.Getenv() 函数接收一个字符串参数,表示要获取的环境变量的名称。如果环境变量存在,则返回其值;如果环境变量不存在,则返回空字符串。

os.Setenv()

在 Go 语言中,通过 os.Setenv() 函数可以设置环境变量的值。

示例代码如下所示:

package main
import (
  "fmt"
  "os"
)
func main() {
  // 设置环境变量的值
  err := os.Setenv("MY_VARIABLE", "my_value")
  if err != nil {
    fmt.Println("设置环境变量失败:", err)
    return
  }
  // 获取环境变量的值
  value := os.Getenv("MY_VARIABLE")
  // 打印环境变量的值
  fmt.Println("MY_VARIABLE 环境变量的值:", value)
}

上述代码演示了如何设置名为 "MY_VARIABLE" 的环境变量的值为 "my_value",然后获取该环境变量的值并进行打印。

os.Setenv() 函数接收两个参数,第一个参数是要设置的环境变量的名称,第二个参数是要设置的环境变量的值。如果设置环境变量成功,则返回 nil,否则返回相应的错误。

请注意,在程序结束后,设置的环境变量将不再存在。

exec.Command()

exec.Command() 是 Go 语言中的一个函数,用于创建并返回一个 *Cmd 对象,该对象代表要执行的外部命令。

函数签名如下所示:

func Command(name string, arg ...string) *Cmd

name 参数表示要执行的命令的名称,而 arg 参数是可选的命令参数列表。

示例代码如下所示:

package main
import (
  "fmt"
  "log"
  "os/exec"
)
func main() {
  // 创建并配置一个命令对象
  cmd := exec.Command("echo", "Hello, World!")
  // 执行命令并获取输出
  output, err := cmd.Output()
  if err != nil {
    log.Fatal(err)
  }
  // 打印输出结果
  fmt.Println(string(output))
}

上述代码演示了如何使用 exec.Command() 创建一个执行 echo "Hello, World!" 命令的命令对象,并将其输出打印到控制台。

在创建命令对象后,可以通过设置 Cmd 结构体的其他属性,如 StdinStdoutStderr 来配置命令的输入、输出和错误处理方式。


相关文章
|
1月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
144 1
|
3月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
355 0
|
3月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
229 0
|
3月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
208 0
|
3月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
300 0
|
3月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
280 1
|
9月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
9月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
3月前
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。
|
3月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。