Go语言基础---数据类型间的故事

Go语言基础—数据类型间的故事

目录

  • 前言
  • 基本数据类型
    • 整形
    • 字节
    • 特殊整形
    • unsafe.Sizeof
    • 数字字面量语法
    • 浮点型
    • 布尔值
    • 字符串
    • byte和rune类型
  • 运算符
    • 算术运算符
    • 关系运算符
    • 逻辑运算符
    • 位运算符
    • 赋值运算符

前言

Go语言是Google开发的一种静态强类型、编译型语言。Go语言语法与C相近,但功能上有:内存安全,GC(垃圾回收),结构形态及CSP-style并发计算。本文档将详细介绍Go语言的基本数据类型和运算符。


基本数据类型

Go语言数据类型架构图

                                Go语言数据类型体系│┌─────────────────┼─────────────────┐│                 │                 │基本数据类型        复合数据类型        其他类型(Basic Types)     (Composite Types)   (Other Types)│                 │                 │┌───────────┼───────────┐     │     ┌───────────┼───────────┐│           │           │     │     │           │           │数值类型      布尔类型    字符串类型 │   指针类型    函数类型   接口类型(Numeric)    (Boolean)   (String)   │  (Pointer)   (Function) (Interface)│          │           │       │     │           │           │┌────┼────┐     │           │       │   *Type      func()      interface{}│    │    │     │           │       │                │整型  浮点型 复数型 │           │       │         ┌─────┼─────┐
(Integer)(Float)(Complex)       │       │         │     │     ││    │    │     │           │       │      内置函数 用户函数 方法│    │    │     │           │       │              │     ││    │    │   bool        string    │              │   method│    │    │                         │              ││    │  ┌─┼─┐                       │         func name()│    │  │   │                       ││  ┌─┼─┐│ │ │               ┌───────┼───────┐│  │   ││ │ │               │       │       ││float32││complex64     集合类型  结构化类型 通道类型│float64││complex128   (Collection)(Structured)(Channel)│      │└─┴─┘               │       │       ││      │                   │       │     chan T│      └─ math.Pi (常量)     │       │    chan<- T│                          │       │    <-chan T│                          │       │
┌──┼──────────────┐           │    ┌──┼──┐
│  │              │           │    │     │
有符号整型      无符号整型        │   结构体  自定义类型
(Signed)      (Unsigned)      │   (Struct)(Custom)
│              │              │    │     │
├─ int8        ├─ uint8(byte) │   struct{} type Name Type
├─ int16       ├─ uint16      │    │
├─ int32(rune) ├─ uint32      │    └─ 字段(Fields)
├─ int64       ├─ uint64      │       ├─ 导出字段(Exported)
└─ int         ├─ uint        │       └─ 未导出字段(Unexported)(平台相关)     └─ uintptr    │(指针大小)      ││┌────────┼────────┐│        │        │数组      切片      映射(Array)   (Slice)   (Map)│        │        │[n]Type    []Type   map[K]V│        │        │├─ 固定长度    ├─ 动态长度  ├─ 键值对├─ 值类型     ├─ 引用类型  ├─ 引用类型└─ 内存连续   ├─ 底层数组  └─ 哈希表├─ 长度(len)├─ 容量(cap)└─ 指针指向数组特殊字符类型:
├─ byte  = uint8  (ASCII字符, 1字节)
└─ rune  = int32  (Unicode字符, 4字节, UTF-8编码)内存大小对照表:
┌─────────────┬─────────────┬─────────────┐
│    类型     │   大小(字节)  │     范围     │
├─────────────┼─────────────┼─────────────┤
│   bool      │      1      │ true/false  │
│   int8      │      1      │ -128~127    │
│   uint8     │      1      │ 0~255       │
│   int16     │      2      │ -32768~32767│
│   uint16    │      2      │ 0~65535     │
│   int32     │      4      │ ±21亿        │
│   uint32    │      4      │ 0~42亿       │
│   int64     │      8      │ ±922万亿     │
│   uint64    │      8      │ 0~1844万亿   │
│   float32   │      4      │ ±3.4e38     │
│   float64   │      8      │ ±1.8e308    │
│   complex64 │      8      │ float32实部虚部│
│  complex128 │     16      │ float64实部虚部│
│   string    │   可变      │ UTF-8字符串  │
│   uintptr   │  平台相关    │ 存储指针     │
└─────────────┴─────────────┴─────────────┘类型零值表:
├─ 数值类型: 0
├─ 布尔类型: false  
├─ 字符串类型: ""
├─ 指针、切片、映射、通道、函数、接口: nil
└─ 数组、结构体: 所有字段为对应类型的零值

整形

整型分为以下两个大类:

  • 有符号整形按长度分为:int8int16int32int64
  • 对应的无符号整型uint8uint16uint32uint64
基本示例
package main
import "fmt"func main() {var num int64num = 123fmt.Printf("num=%v 类型是%T", num, num)
}

输出:

num=123 类型是int64

字节

字节也叫 Byte,是计算机数据的基本存储单位。

单位换算:

  • 8bit(位) = 1Byte(字节)
  • 1024Byte(字节) = 1KB
  • 1024KB = 1MB
  • 1024MB = 1GB
  • 1024GB = 1TB

注意: 在电脑里一个中文字是占三个字节的(UTF-8编码)。

特殊整形

Go语言中有一些具有特定用途的整数类型:

类型描述
uint32位操作系统上就是uint32,64位操作系统上就是uint64
int32位操作系统上就是int32,64位操作系统上就是int64
uintptr无符号整型,用于存放一个指针
注意事项
  • 在使用 intuint 类型时,不能假定它是32位或64位的整型,而是考虑 intuint 可能在不同平台上的差异。
  • 实际项目中整数类型、切片、map 的元素数量等都可以用 int 来表示。
  • 在涉及到二进制传输、为了保持文件的结构不会受到不同编译目标平台字节长度的影响,不要使用 intuint

unsafe.Sizeof

unsafe.Sizeof(n1)unsafe 包的一个函数,可以返回 n1 变量占用的字节数。

package main
import ("fmt""unsafe"
)func main() {var num int64num = 123fmt.Printf("num=%v 类型是%T\n", num, num)fmt.Println(unsafe.Sizeof(num))
}

输出:

num=123 类型是int64
8

数字字面量语法

Go1.13版本之后引入了数字字面量语法,这样便于开发者以二进制、八进制或者十六进制浮点数的格式定义数字。

示例:

  • v := 0b101101 代表二进制的101101,相当于45
  • v := 0o377 代表八进制的377,相当于255
  • v := 0x1p-2 代表十六进制的1除以2²,也就是0.25
  • v := 123_456 等于123456(可以用下划线分割数字)
package main
import "fmt"func main() {// 十进制var a int = 10fmt.Printf("%d\n", a)  // 输出十进制fmt.Printf("%b\n", a)  // 输出二进制// 八进制,以0开头var b int = 077fmt.Printf("%o\n", b)  // 输出八进制// 十六进制,以0x开头var c int = 0xfffmt.Printf("%x\n", c)  // 输出十六进制
}

输出:

10
1010
77
ff

浮点型

Go语言支持两种浮点型数:float32float64

  • float32 的浮点数的最大范围约为 3.4e38,可以使用常量 math.MaxFloat32
  • float64 的浮点数的最大范围约为 1.8e308,可以使用常量 math.MaxFloat64

打印浮点数时,可以使用 fmt 包配合动词 %f

package main
import ("fmt""math"
)func main() {fmt.Printf("%f\n", math.Pi)   // 输出:3.141593fmt.Printf("%.2f\n", math.Pi) // 输出:3.14
}
Go语言中浮点数默认是float64
package main
import "fmt"func main() {a := 1.2fmt.Printf("a=%v\t类型是:%T", a, a)
}

输出:

a=1.2   类型是:float64
Golang中float精度丢失问题

几乎所有的编程语言都有精度丢失这个问题,这是典型的二进制浮点数精度损失问题,在定长条件下,二进制小数和十进制小数互转可能有精度丢失。

package main
import "fmt"func main() {a := 1.2fmt.Println(a * 100)  // 输出:120var d float64 = 1129.6fmt.Println(d * 100)  // 输出:112959.99999999999
}

布尔值

Go语言以 bool 类型进行声明布尔型数据,布尔型数据只有 truefalse 两个值。

注意事项
  • 布尔类型变量的默认值为 false
  • Go语言中不允许将整形强制转换为布尔型
  • 布尔型无法参与数值运算,也无法与其他类型进行转换
package main
import ("fmt""unsafe"
)func main() {var b = truefmt.Println(b, "占用字节:", unsafe.Sizeof(b))
}

字符串

Go语言中的字符串以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、float32、float64等)一样。Go语言中的字符串的内部实现使用UTF-8编码。字符串的值为双引号中的内容,可以在Go语言的源码中直接添加非ASCII码字符。

字符串转义符

Go语言的字符串常见转义符:

转义符含义
\r回车符(返回行首)
\n换行符(直接跳到下一行的同列位置)
\t制表符
\'单引号
\"双引号
\\反斜杠
常用字符串操作
1. 拼接字符串
package main
import "fmt"func main() {var str1 = "你好"var str2 = "golang"// 方法1:使用 + 操作符fmt.Println(str1 + str2)// 方法2:使用 fmt.Sprintfvar str3 = fmt.Sprintf("%v%v", str1, str2)fmt.Println(str3)
}

输出:

你好golang
你好golang
2. 分割字符串
package main
import ("fmt""strings"
)func main() {var str = "golang"var result = strings.Split(str, "lan")fmt.Println(result)  // 输出:[go g]
}
3. 判断字符串首尾字符
package main
import ("fmt""strings"
)func main() {var str1 = "golang"var hasPrefix = strings.HasPrefix(str1, "g")fmt.Println(hasPrefix)  // 输出:truevar str2 = "this is golang"var hasSuffix = strings.HasSuffix(str2, "is")fmt.Println(hasSuffix)  // 输出:false
}
4. 判断字符串出现的位置
package main
import ("fmt""strings"
)func main() {var str1 = "golang"var index = strings.Index(str1, "g")fmt.Println(index)  // 输出:0var str2 = "this is golang"var lastIndex = strings.LastIndex(str2, "is")fmt.Println(lastIndex)  // 输出:5
}
5. Join拼接字符串
package main
import ("fmt""strings"
)func main() {str := "123-456-789"arr := strings.Split(str, "-")    // 分割后得到 ["123", "456", "789"]str2 := strings.Join(arr, "*")   // 拼接后得到 "123*456*789"fmt.Println(str2)                // 输出:123*456*789
}

byte和rune类型

组成每个字符串的元素叫做"字符",可以通过遍历字符串元素获得字符。字符用单引号包裹。

基本概念
  • 字节(byte):是计算机中数据处理的基本单位,习惯上用大写B来表示。1B(byte字节) = 8bit(位)
  • 字符:是指计算机中使用的字母、数字、符号
  • 重要提示:一个汉字占用3个字节,一个字母占用一个字节
package main
import "fmt"func main() {a := 'a'b := '0'// 当我们直接输出byte(字符)的时候输出的是这个字符对应的码值fmt.Println(a)  // 输出:97fmt.Println(b)  // 输出:48// 如果我们要输出这个字符,需要格式化输出fmt.Printf("%c--%c\n", a, b)  // 输出:a--0c := "m"fmt.Println(len(c))  // 输出:1d := "张"fmt.Println(len(d))  // 输出:3
}
Go语言的字符类型

Go语言的字符有以下两种类型:

  1. uint8类型,或者叫 byte 型,代表了ASCII码的一个字符
  2. rune类型,代表一个UTF-8字符

当需要处理中文、日文或者其他复合字符时,则需要用到 rune 类型。rune 类型实际是一个 int32

// 遍历字符串
package main
import "fmt"func main() {s := "hello 张三"// 按字节遍历for i := 0; i < len(s); i++ {fmt.Printf("%v(%c) ", s[i], s[i])}fmt.Println()// 按rune遍历for _, r := range s {fmt.Printf("%v(%c) ", r, r)}fmt.Println()
}
字符串和字符的区别
c3 := "营"  // 字符串类型
c4 := '营'  // rune类型(int32)
fmt.Printf("C3的类型%T--C4的类型%T", c3, c4)  // 输出:C3的类型string--C4的类型int32
修改字符串

要修改字符串,需要先将其转换成 []rune[]byte,完成后再转换为 string。无论哪种转换,都会重新分配内存,并复制字节数组。

func changeString() {s1 := "big"// 强制类型转换byteS1 := []byte(s1)byteS1[0] = 'p'fmt.Println(string(byteS1))  // 输出:pigs2 := "白萝卜"runeS2 := []rune(s2)runeS2[0] = '红'fmt.Println(string(runeS2))  // 输出:红萝卜
}

运算符

算术运算符

运算符描述实例
+相加A + B
-相减A - B
*相乘A * B
/相除B / A
%求余B % A
注意事项

++(自增)和 --(自减)在Go语言中是单独的语句,并不是运算符。

var i int = 1
i++
fmt.Println("i=", i)  // 输出:i= 2

关系运算符

运算符描述实例
==检查两个值是否相等,如果相等返回 True 否则返回 FalseA == B
!=检查两个值是否不相等,如果不相等返回 True 否则返回 FalseA != B
>检查左边值是否大于右边值,如果是返回 True 否则返回 FalseA > B
<检查左边值是否小于右边值,如果是返回 True 否则返回 FalseA < B
>=检查左边值是否大于等于右边值,如果是返回 True 否则返回 FalseA >= B
<=检查左边值是否小于等于右边值,如果是返回 True 否则返回 FalseA <= B

逻辑运算符

运算符描述实例
&&逻辑 AND 运算符。如果两边的操作数都是 True,则条件 True,否则为 FalseA && B
||逻辑 OR 运算符。如果两边的操作数有一个 True,则条件 True,否则为 FalseA || B
!逻辑 NOT 运算符。如果条件为 True,则逻辑 NOT 条件 False,否则为 True!A

位运算符

位运算符对整数在内存中的二进制位进行操作。

运算符描述实例
&按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与A & B
|按位或运算符"|"是双目运算符。其功能是参与运算的两数各对应的二进位相或A | B
^按位异或运算符"^"是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当二进位不同时,结果为1A ^ B
<<左移运算符"<<"是双目运算符。左移n位就是乘以2的n次方A << 2
>>右移运算符">>"是双目运算符。右移n位就是除以2的n次方A >> 2
位运算示例
package main
import "fmt"func main() {/* &  两位均为 1 才为 1|  两位有一个为 1 就为 1^  相异或,两位不一样则为 1<< 左移 n 位就是乘以 2 的 n 次方。"a<<b"是把 a 的各二进位全部左移 b 位,高位丢弃,低位补 0>> 右移 n 位就是除以 2 的 n 次方*/var a int = 5 // 二进制:101var b int = 2 // 二进制:010fmt.Println("a&b =", a&b)   // 000,结果为 0fmt.Println("a|b =", a|b)   // 111,结果为 7fmt.Println("a^b =", a^b)   // 111,结果为 7fmt.Println("5>>2 =", a>>b) // 5 右移 2 位,结果为 1fmt.Println("5<<2 =", a<<b) // 5 左移 2 位,结果为 20(二进制:10100)fmt.Println("5<<1 =", 5<<1) // 5 左移 1 位,结果为 10(二进制:1010)fmt.Println("5>>1 =", 5>>1) // 5 右移 1 位,结果为 2(二进制:10)fmt.Println("7>>2 =", 7>>2) // 7 右移 2 位,结果为 1
}

赋值运算符

运算符描述实例
=简单的赋值运算符,将一个表达式的值赋给一个左值C = A + B 将 A + B 表达式结果赋值给 C
+=相加后再赋值C += A 等于 C = C + A
-=相减后再赋值C -= A 等于 C = C - A
*=相乘后再赋值C *= A 等于 C = C * A
/=相除后再赋值C /= A 等于 C = C / A
%=求余后再赋值C %= A 等于 C = C % A
<<=左移后赋值C <<= 2 等于 C = C << 2
>>=右移后赋值C >>= 2 等于 C = C >> 2
&=按位与后赋值C &= 2 等于 C = C & 2
^=按位异或后赋值C ^= 2 等于 C = C ^ 2
|=按位或后赋值C |= 2 等于 C = C | 2

总结

本文档详细介绍了Go语言的基本数据类型和运算符:

  1. 基本数据类型包括整型、浮点型、布尔型、字符串、字符和字节类型
  2. 运算符包括算术、关系、逻辑、位运算和赋值运算符
  3. 重点概念包括字符串操作、字符编码处理、类型转换等

掌握这些基础知识是学习Go语言的重要基础,为后续学习更高级的Go语言特性打下坚实的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/96140.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/96140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dedecms软件等级★号改成图片图标显示的办法

我们在用到dedecms织梦的软件模型&#xff0c;在调用软件星级的时候&#xff0c;要把默认的星号改为图片&#xff0c;这个要怎么操作呢&#xff1f;1、软件模型管理里面-字段管理-字段配置softrankislink一行改为&#xff1a;<field:softrank itemname软件等级 typeint isnu…

windows下安装claude code+国产大模型glm4.5接入(无需科学上网)

下载安装node.js https://nodejs.org/en/download 安装版.msi 直接下载安装即可 免安装版.zip 1.解压下载的压缩包 2.创建数据缓存存储目录cache和全局安装工具目录global 3.配置环境变量 【我的电脑】右键选中【属性】-> 找到【高级系统设置】-> 右下角【环境变量…

嵌入式 - ARM4

裸机实现LED闪烁一、启动代码1. 异常向量表配置1. .global汇编器指令&#xff0c;全局定义标签_start&#xff0c;作为汇编程序的默认起点2. 配置标签配置标签时可以前置加_ &#xff0c;以便和普通标签或系统标签做区分3. 异常向量表ARM架构规定异常向量表位置固定&#xff0c…

《C++ 108好库》之2 多线程库thread,mutex,condition_variable,this_thread

《C 108好库》之之2 多线程库thread&#xff0c;mutex&#xff0c;condition_variable&#xff0c;this_thread《C 108好库》之2 多线程库thread&#xff0c;mutex&#xff0c;condition_variable&#xff0c;this_threadstd::thread类​​互斥量&#xff08;Mutex&#xff09;…

Android系统框架知识系列(二十):专题延伸:JVM vs ART/Dalvik - Android运行时演进深度解析

​关键词​&#xff1a;运行时优化、AOT编译、JIT编译、内存管理、电池效率、性能分析一、Android运行时演进背景1. 移动环境的特殊挑战Android运行时环境的演进源于移动设备的独特限制&#xff1a;​移动设备约束条件​&#xff1a;​有限的内存资源​&#xff1a;早期设备仅1…

ubuntu 22 安装轻量级桌面Xfce并使用xrdp远程桌面连接

1.安装Xfce:sudo apt install xubuntu-desktop -y2.安装xrdp:sudo apt install xrdp -y3.配置xrdp&#xff0c;nano /etc/xrdp/xrdp.ini:[Globals] ... port3389 ; 远程连接端口&#xff0c;默认是3389&#xff0c;可以改成自己喜欢的端口... ; ; Session types ;; Some sess…

【Flask】测试平台开发,数据看板开发-第二十一篇

概述&#xff1a;在前面我们已经实现了我们的产品创建管理&#xff0c;应用管理管理&#xff0c;需求提测管理但是每周提测了多少需求&#xff0c;创建了哪些产品&#xff0c;我们是不是看着不是很直观&#xff0c;接下来我们就需要开发一个数据看板功能&#xff0c;实现能够看…

我是程序员,不是程序猿:请别把我当猴耍——拒绝被低估,用专业赢得尊重

摘要 本文旨在深度剖析“程序员”与“程序猿”一字之差背后所反映的职业尊严与身份认同问题。我们生活在一个技术驱动的时代&#xff0c;但对技术创造者的认知却常常被“程序猿”、“码农”等标签简单化、甚至矮化。本文将从正名开始&#xff0c;辨析“程序员”的专业内涵&…

C++中vector删除操作的安全隐患与最佳实践

std::vector 是C标准模板库&#xff08;STL&#xff09;中最常用的动态数组容器&#xff0c;提供了高效的随机访问和动态扩容能力。然而&#xff0c;其删除操作如果使用不当&#xff0c;会引入严重的安全隐患&#xff0c;包括未定义行为、内存泄漏和数据竞争等问题。本文将深入…

Unix/Linux 系统中的 `writev` 系统调用

<摘要> 本文对 Unix/Linux 系统中的 writev 系统调用进行了全面深入的解析。内容涵盖了其产生的背景&#xff08;从传统 write 的局限性到分散/聚集 I/O 概念的引入&#xff09;、核心概念&#xff08;如 struct iovec、系统调用流程&#xff09;。重点剖析了其设计意图&…

深入理解 Android targetSdkVersion:从 Google Play 政策到依赖冲突

深入理解 Android targetSdkVersion&#xff1a;从 Google Play 政策到依赖冲突 作为 Android 开发者&#xff0c;你很可能在 Android Studio 中见过这条提示&#xff1a;Google Play requires that apps target API level 33 or higher。它像一个尽职的提醒者&#xff0c;时常…

灰匣(GrayBox)1.0.0 发布【提升系统权限APP】

灰匣是一个提升系统权限的工具&#xff0c;可以配合Root、三方软件&#xff08;Shizuku&#xff09;以及【设备管理员】&#xff08;设备所有者&#xff09;实现一些高级功能及底层接口&#xff0c;可以自动隔离&#xff08;冻结/禁用&#xff09;不必要的应用&#xff0c;如某…

PAT 1104 Sum of Number Segments

这一题的大意就是找一个数组中的所有子数组&#xff0c;它们的累加和为多少&#xff0c; 题目上给出的数据范围是O(n^5)那么只能遍历一次&#xff0c;不能用暴力的方法求出。 看到这一题我有两个思路&#xff1a; 1.试图用双指针和滑动窗口来把O&#xff08;n^2)的时间复杂度降…

[万字长文]AJAX入门-常用请求方法和数据提交、HTTP协议-报文、接口文档、案例实战

本系列可作为前端学习系列的笔记&#xff0c;代码的运行环境是在VS code中&#xff0c;小编会将代码复制下来&#xff0c;大家复制下来就可以练习了&#xff0c;方便大家学习。 HTML、CSS、JavaScript系列文章 已经收录在前端专栏&#xff0c;有需要的宝宝们可以点击前端专栏查…

Codesy中的UDP发送信息

Codesy UDP通讯 概述 CAA Net Base Services UDP通讯的建立 发送UDP 状态控制 效果 概述 Codesys中默认安装的通讯支持很多,不安装其他的软件也可以实现TCP通讯。但是,在使用UDP通讯时,因为我们的PLC有两个网卡,一般我们把第一个网口做编程和HMI用,把的个网口做外部通讯,…

神经网络之深入理解偏置

&#x1f50d; 1. 表达能力&#xff1a;无偏模型不能表示全体函数族 ✔ 有偏线性变换&#xff1a; yWxb&#xff08;仿射变换&#xff09; y Wx b \quad \text{&#xff08;仿射变换&#xff09;} yWxb&#xff08;仿射变换&#xff09; 能表示任意线性函数 平移是仿射空间的…

小白必看:AI智能体零基础搭建全攻略!

写在前面&#xff1a;别怕&#xff0c;真的不需要技术背景&#xff01; 你是不是经常听到"AI智能体"、"大模型"这些高大上的词&#xff0c;总觉得那是技术大牛的专利&#xff1f;别担心&#xff0c;这篇教程就是为你准备的&#xff01;我们将用最通俗的语…

React state在setInterval里未获取最新值的问题

目录 一、问题描述 二、解决方案 方案一&#xff0c;使用函数式更新 方案二&#xff0c;使用 useRef 保存最新值 一、问题描述 在 React 中&#xff0c;当在 setInterval或setTimeout 中使用 setState 时&#xff0c;经常会遇到状态不是最新值的问题。这是因为闭包导致的&a…

x86 架构 Docker 镜像迁移至 ARM 环境的详细指南

目录 一、问题背景与分析 二、解决步骤 &#xff08;一&#xff09;检查 docker-compose 版本 &#xff08;二&#xff09;升级 docker-compose 1. 对于 Linux 系统 2. 对于 Windows 系统 &#xff08;三&#xff09;验证升级 &#xff08;四&#xff09;重新运行 dock…

零代码部署工业数据平台:TRAE + TDengine IDMP 实践

对于编程初学者来说&#xff0c;软件开发流程中的开发环境配置、安装异常或报错往往需要花费大量时间查阅资料和反复试错&#xff0c;才能正常安装和启动某些软件工具。现在&#xff0c;在 TRAE 的帮助下&#xff0c;即使完全没有接触过编程&#xff0c;也能通过自然语言直接表…