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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 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 来配置命令的输入、输出和错误处理方式。


相关文章
|
13天前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
13天前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
90 71
|
12天前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
97 67
|
13天前
|
存储 Go
go语言中映射
go语言中映射
31 11
|
4天前
|
Go 数据安全/隐私保护 UED
优化Go语言中的网络连接:设置代理超时参数
优化Go语言中的网络连接:设置代理超时参数
|
13天前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
25 7
|
15天前
|
Go 索引
go语言for遍历数组或切片
go语言for遍历数组或切片
86 62
|
17天前
|
并行计算 安全 Go
Go语言中的并发编程:掌握goroutines和channels####
本文深入探讨了Go语言中并发编程的核心概念——goroutine和channel。不同于传统的线程模型,Go通过轻量级的goroutine和通信机制channel,实现了高效的并发处理。我们将从基础概念开始,逐步深入到实际应用案例,揭示如何在Go语言中优雅地实现并发控制和数据同步。 ####
|
15天前
|
Go
go语言for遍历映射(map)
go语言for遍历映射(map)
28 12
|
14天前
|
Go 索引
go语言使用索引遍历
go语言使用索引遍历
25 9