Go语言01

发布于 16 天前  21 次阅读


Go

Go语言是模块化的,引入箱子->使用工具

Go特色:(相较python而言)

  • packge main:主程序入口,必须要有 mian() 函数
  • import 分组用括号分组导入,导入路径:从标准库或从模块路径导入
  • 结构体 type 定义(相当于class):
    • 必须声明字段类型
    • 结构体标签 json:"host"是元数据,用于序列化
    • 大写字母开头用于公开访问,小写字母开头是私有
    • var zabbixData ZabbixRawData
      • // 声明一个 ZabbixRawData 类型的变量
  • 方法定义(相当于def):
    • func ()
    • (p *ZabbixProcessor)相当于 Python 的 self
    • ([]byte, error)返回结果+错误
    • 错误是显式返回值,不是异常
  • json
    • 解析 json :json.Unmarshal(rawJson, &zabbixData)
      • 将JSON字符串解析并填充到 zabbixData 结构体变量中
      • rawJson是一个字节切片 byte slice (存储原始的Json数据)
      • &是 取地址运算符,&zabbixData获取变量 zabbixData的内存地址
        • 为什么要加&:
          不加&:Go的函数参数的传递是“值传递”,函数内部修改的是副本,外部的zabbixData不变
          加&:直接传递zabbixData的地址,函数内部通过低智直接修改原始的zabbixData的变量
    • 生成 json :json.Marshal(result)
    • 对比python:解析 json.load() 序列化 json.dumps()
关于参数传递三种语言的对比:
C语言(最原始最危险):必须显式使用 &和 *
    // 函数声明
    void modify_c(int *ptr) {
        *ptr = 100;  // 通过指针直接修改内存
    }
     int *ptr = (int*)0x1000;  // 任意地址
    *ptr = 123;  // 可能崩溃或破坏系统
​
​
Go语言(安全版的C指针):语法类似C,不支持指针算术,运行时检查
    package main
    import "fmt"
​
    func modify_go(ptr *int) {
        *ptr = 100  // 通过指针修改
    }
​
​
python(完全不同的哲学):对象引用,不可变对象函数内修改创建新对象,可变对象函数内可修改原对象
    def change_number(n):
        n = 100  # 创建新的整数对象
        print(f"函数内: {n}")  # 100
​
    x = 10
    print(f"调用前: {x}")  # 10
    change_number(x)
    print(f"调用后: {x}")  # 10,没变!

python 不可变对象:数字、字符串、元组

python 可变对象:列表、字典、集合

Go中的工具包:

fmt:-- 打印
  • fmt.Println 自动换行打印
  • fmt.Printf 格式化打印 (需要把变量的值嵌入到一句话里打印出来时用)
time:-- 时间
  • Timestamp: time.Now().UnixMilli() // 毫秒时间戳
encoding/json
  • json.Unmarshal([]byte(jsonStr), &myData) 把JSON字符串翻译成结构体
  • json.Marshal(myData) 把结构体翻译成JSON字符串
strings -- 字符串
  • import "strings"
    ip := "10.10.10.32;10.10.10.33"
    // 判断是否包含
    strings.Contains(ip, "10.10.10.32") // true
    // 分割
    ips := strings.Split(ip, ";") // 变成数组 ["10.10.10.32", "10.10.10.33"]
    // 替换
    newIp := strings.Replace(ip, ";", ",", -1)
net/http -- 网络
  • 发 HTTP 请求。相当于 Python 的 requests 库或 Linux 的 curl 命令。
  • import "net/http"
    // 发送一个 GET 请求
    resp, err := http.Get("http://cmdb.api.com/get_host?ip=10.0.0.1")
    if err != nil {
       // 处理错误
    }
    // 别忘了关闭连接
    defer resp.Body.Close()
log -- 日志
  • log 是给程序看的(记录日志)。它会自动在前面加上日期和时间,方便排查问题。
  • import "log"

    log.Println("系统启动成功")
    // 输出:2024/10/29 10:00:00 系统启动成功
    log.Fatal("发生严重错误,程序退出") // 打印日志并强制退出程序
A life of freedom is all my ambition
最后更新于 2026-03-13