我的编程空间,编程开发者的网络收藏夹
学习永远不晚

深入解析Golang中JSON的编码与解码

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

深入解析Golang中JSON的编码与解码

随着互联网的快速发展和数据交换的广泛应用,各种数据格式的处理成为软件开发中的关键问题。JSON 作为一种通用的数据交换格式,在各种应用场景中都得到了广泛应用,包括 Web 服务、移动应用程序和大规模数据处理等。Golang 作为一种开发高性能、并发安全的语言,具备出色的处理 JSON 的能力。本文将介绍 Golang 中 JSON 编码与解码的相关知识,帮助大家了解其基本原理和高效应用。

1. JSON 简介

JSON 是一种基于文本的轻量级数据交换格式,它以易于人类阅读和编写的方式表示结构化数据。JSON 采用键值对的形式组织数据,支持多种数据类型,包括字符串、数字、布尔值、数组和对象等。以下是一个简单的 JSON 示例:

 {
   "name": "Alice",
   "age": 25,
   "isStudent": true,
   "hobbies": ["reading", "coding", "music"]
 }

在上述示例中,name 是一个字符串类型的键,对应的值是 "Alice";age 是一个数字类型的键,对应的值是 25;isStudent 是一个布尔类型的键,对应的值是 true;hobbies 是一个数组类型的键,对应的值是一个包含三个字符串元素的数组。

2. Golang 中的 JSON 编码

Golang 标准库中的 encoding/json 包提供了丰富的功能,用于将 Go 数据结构编码为 JSON 格式。下面是一些常见的 JSON 编码用法示例:

2.1 结构体的 JSON 编码

在 Golang 中,可以通过给结构体字段添加 json 标签来指定 JSON 编码时的字段名和其他选项。例如,考虑以下 Person 结构体:

 type Person struct {
     Name string `json:"name"`
     Age  int    `json:"age"`
 }

要将该结构体编码为 JSON,可以使用 json.Marshal() 函数:

 p := Person{Name: "Alice", Age: 25}
 data, err := json.Marshal(p)
 if err != nil {
     log.Fatal(err)
 }
 fmt.Println(string(data))

运行上述代码,输出结果将是:

{"name":"Alice","age":25}

在这个例子中,json.Marshal() 函数将 Person 结构体编码为 JSON 格式,并将结果存储在 data 变量中。最后,我们使用 fmt.Println() 函数将编码后的 JSON 字符串打印出来。

2.2 切片和映射的 JSON 编码

除了结构体,Golang 中的切片和映射也可以方便地进行 JSON 编码。例如,考虑以下切片和映射的示例:

 names := []string{"Alice", "Bob", "Charlie"}
 data, err := json.Marshal(names)
 if err != nil {
     log.Fatal(err)
 }
 fmt.Println(string(data))
 ​
 scores := map[string]int{
     "Alice":   100,
     "Bob":     85,
     "Charlie": 92,
 }
 data, err = json.Marshal(scores)
 if err != nil {
     log.Fatal(err)
 }
 fmt.Println(string(data))

运行上述代码,输出结果将是:

 ["Alice","Bob","Charlie"]
 {"Alice":100,"Bob":85,"Charlie":92}

在这个例子中,我们首先将切片 names 和映射 scores 分别进行 JSON 编码,并将结果打印出来。切片和映射会被编码为对应的 JSON 数组和对象。

3. Golang 中的 JSON 解码

除了 JSON 编码,Golang 中的 encoding/json 包还提供了 JSON 解码的功能,可以将 JSON 数据解码为 Go 数据结构。下面是一些常见的 JSON 解码用法示例:

3.1 JSON 解码为结构体

要将 JSON 解码为结构体,需要先定义对应的结构体类型,并使用 json.Unmarshal() 函数进行解码。例如,考虑以下 JSON 数据:

 {
   "name": "Alice",
   "age": 25
 }

我们可以定义一个 Person 结构体来表示这个数据:

 type Person struct {
     Name string `json:"name"`
     Age  int    `json:"age"`
 }

然后,可以使用 json.Unmarshal() 函数将 JSON 解码为该结构体:

 jsonStr := `{"name":"Alice","age":25}`
 var p Person
 err := json.Unmarshal([]byte(jsonStr), &p)
 if err != nil {
     log.Fatal(err)
 }
 fmt.Println(p.Name, p.Age)

运行上述代码,输出结果将是:

Alice 25

在这个例子中,我们首先将 JSON 数据保存在 jsonStr 变量中。然后,使用 json.Unmarshal() 函数将 JSON 解码为 Person 结构体,并将结果存储在变量 p 中。最后,我们打印出 p 的字段值。

3.2 JSON 解码为切片和映射

除了解码为结构体,JSON 数据还可以解码为切片和映射。解码为切片和映射的过程与解码为结构体类似。以下是示例代码:

 jsonStr := `["Alice","Bob","Charlie"]`
 var names []string
 err := json.Unmarshal([]byte(jsonStr), &names)
 if err != nil {
     log.Fatal(err)
 }
 fmt.Println(names)
 ​
 jsonStr = `{"Alice":100,"Bob":85,"Charlie":92}`
 var scores map[string]int
 err = json.Unmarshal([]byte(jsonStr), &scores)
 if err != nil {
     log.Fatal(err)
 }
 fmt.Println(scores)

运行上述代码,输出结果将是:

 [Alice Bob Charlie]
 map[Alice:100 Bob:85 Charlie:92]

在这个例子中,我们首先将 JSON 数据保存在 jsonStr 变量中。然后,使用 json.Unmarshal() 函数将 JSON 解码为相应的切片和映射,并将结果存储在对应的变量中。最后,我们打印出这些变量的值。

4. 自定义编码与解码

Golang 的 encoding/json 包提供了一种自定义编码与解码的方式,可以灵活地控制 JSON 数据的序列化和反序列化过程。通过实现 json.Marshaler 和 json.Unmarshaler 接口,可以定制字段的编码和解码行为。

例如,假设我们有一个时间类型的字段,我们希望在 JSON 中以特定的日期格式进行编码和解码。我们可以定义一个自定义类型,并实现 json.Marshaler 和 json.Unmarshaler 接口。

 type CustomTime time.Time
 ​
 func (ct CustomTime) MarshalJSON() ([]byte, error) {
     formatted := time.Time(ct).Format("2006-01-02")
     return []byte(`"` + formatted + `"`), nil
 }
 ​
 func (ct *CustomTime) UnmarshalJSON(data []byte) error {
     // 假设日期格式为 "2006-01-02"
     parsed, err := time.Parse(`"2006-01-02"`, string(data))
     if err != nil {
         return err
     }
     *ct = CustomTime(parsed)
     return nil
 }

在上述代码中,我们定义了一个 CustomTime 类型,并为它实现了 MarshalJSON() 和 UnmarshalJSON() 方法。MarshalJSON() 方法将时间格式化为指定的日期格式,并进行编码。UnmarshalJSON() 方法根据特定的日期格式解码 JSON 数据并转换为时间类型。

通过自定义编码和解码逻辑,我们可以根据实际需求灵活处理特定类型的字段。

5. JSON 标签选项

除了指定字段名,json 标签还提供了其他选项,以进一步控制编码和解码的行为。以下是一些常用的 JSON 标签选项:

  • omitempty:如果字段的值为空值(如零值、空字符串、空切片等),则在编码时忽略该字段。
  • string:将字段编码为JSON字符串类型,而不是其原始类型。
  • omitempty 和 string 可以组合使用,例如 json:"myField,omitempty,string"。

示例:

 type Person struct {
     Name      string    `json:"name"`
     Age       int       `json:"age,omitempty"`
     BirthDate CustomTime `json:"birth_date,string"`
 }

在上述示例中,我们定义了一个 Person 结构体,其中 Name 字段的编码和解码使用默认选项,Age 字段使用 omitempty 选项,BirthDate 字段使用 string 选项。

这些选项可以帮助我们更精确地控制 JSON 数据的编码和解码过程。

6. 处理嵌套结构体

在处理复杂的数据结构时,结构体可能会嵌套其他结构体。Golang 的 JSON 编码与解码能够自动处理嵌套结构体,无需额外的配置。

例如,假设我们有以下是关于处理嵌套结构体的示例代码:

 type Address struct {
     Street  string `json:"street"`
     City    string `json:"city"`
     Country string `json:"country"`
 }
 ​
 type Person struct {
     Name    string  `json:"name"`
     Age     int     `json:"age"`
     Address Address `json:"address"`
 }
 ​
 p := Person{
     Name: "Alice",
     Age:  25,
     Address: Address{
         Street:  "123 Main St",
         City:    "New York",
         Country: "USA",
     },
 }
 ​
 data, err := json.Marshal(p)
 if err != nil {
     log.Fatal(err)
 }
 fmt.Println(string(data))

在上述代码中,我们定义了两个结构体:Address 和 Person。Person 结构体中嵌套了 Address 结构体作为其中一个字段。

我们创建了一个 Person 的实例 p,并将其编码为 JSON 格式。json.Marshal() 函数会自动递归地将嵌套结构体编码为嵌套的 JSON 对象。

输出结果将是:

 {"name":"Alice","age":25,"address":{"street":"123 Main St","city":"New York","country":"USA"}}

通过 Golang 的 JSON 编码与解码功能,我们可以轻松处理具有嵌套结构的复杂数据。

7. 处理非导出字段

在 Golang 中,非导出(未以大写字母开头)的结构体字段默认在 JSON 编码和解码过程中会被忽略。这意味着这些字段不会被编码到 JSON 中,也不会从 JSON 中解码。

如果需要处理非导出字段,可以在字段的定义中使用 json:"-" 标签,表示忽略该字段。或者,可以通过定义自定义的 MarshalJSON 和 UnmarshalJSON 方法来处理非导出字段的编码和解码逻辑。

 type Person struct {
     name string `json:"-"`
     Age  int    `json:"age"`
 }

在上述示例中,name 字段被标记为忽略,不会参与 JSON 编码与解码。Age 字段会被正常编码和解码。

8. 处理空值

在 JSON 编码与解码过程中,空值的处理是一个重要的考虑因素。空值包括nil指针、空切片、空映射等。Golang 的 encoding/json 包提供了对空值的处理选项。

在编码时,如果字段的值是空值,可以使用 omitempty 选项指示在编码时忽略该字段。这对于减少 JSON 数据中的冗余信息很有用。

在解码时,如果 JSON 数据中的字段的值是 null,可以使用指针类型或 interface{} 类型来接收解码后的值。这样可以区分出空值和非空值。

示例:

 type Person struct {
     Name  string  `json:"name,omitempty"`
     Age   int     `json:"age,omitempty"`
     Extra *string `json:"extra,omitempty"`
 }
 ​
 jsonStr := `{"name":"Alice","age":null,"extra":"additional info"}`
 var p Person
 err := json.Unmarshal([]byte(jsonStr), &p)
 if err != nil {
     log.Fatal(err)
 }
 ​
 fmt.Println(p.Name)   // 输出: "Alice"
 fmt.Println(p.Age)    // 输出: 0
 fmt.Println(p.Extra)  // 输出: nil

在上述示例中,Person 结构体中的 Name 字段使用了 omitempty 选项,因此在编码时如果字段的值为空字符串,则会被忽略。Age 字段在 JSON 数据中的值为 null,解码后会被设置为类型的零值。Extra 字段在 JSON 数据中的值为 "additional info",解码后被设置为 nil。

9. 处理循环引用

循环引用是指一个数据结构中的对象相互引用,形成了闭环。在进行 JSON 编码与解码时,处理循环引用是一个挑战。

Golang 的 encoding/json 包默认不支持循环引用的编码与解码,因为会导致无限递归。如果存在循环引用的数据结构,需要额外的处理来避免循环引用。

一种处理循环引用的方法是使用指针类型来打破循环。通过将结构体字段定义为指针类型,可以在 JSON 编码与解码过程中避免循环引用。

示例:

 type Person struct {
     Name    string   `json:"name"`
     Friends []*Person `json:"friends"`
 }
 ​
 alice := &Person{Name: "Alice"}
 bob := &Person{Name: "Bob"}
 charlie := &Person{Name: "Charlie"}
 ​
 alice.Friends = []*Person{bob, charlie}
 bob.Friends = []*Person{alice}
 charlie.Friends = []*Person{alice, bob}
 ​
 data, err := json.Marshal(alice)
 if err != nil {
     log.Fatal(err)
 }
 ​
 fmt.Println(string(data))

在上述示例中,Person 结构体中的 Friends 字段被定义为 []*Person 在进行 JSON 编码时,Golang 的 encoding/json 包会处理循环引用,并将循环引用中的对象替换为null。

在解码 JSON 数据时,Golang 的 encoding/json 包默认情况下无法处理循环引用。如果 JSON 数据中存在循环引用,解码过程将会进入无限递归,并最终导致堆栈溢出。为了解决这个问题,我们可以使用 json.RawMessage 类型或自定义解码函数来处理循环引用。

使用 json.RawMessage 类型,可以在结构体中存储原始的 JSON 数据,然后在后续的处理中进行解析。

示例:

 type Person struct {
     Name    string          `json:"name"`
     Friends []json.RawMessage `json:"friends"`
 }
 ​
 jsonStr := `{"name":"Alice","friends":[
     {"name":"Bob","friends":null},
     {"name":"Charlie","friends":null}
 ]}`
 var p Person
 err := json.Unmarshal([]byte(jsonStr), &p)
 if err != nil {
     log.Fatal(err)
 }
 ​
 fmt.Println(p.Name)     // 输出: "Alice"
 fmt.Println(p.Friends)  // 输出: [{"name":"Bob","friends":null},{"name":"Charlie","friends":null}]

在上述示例中,Person 结构体中的 Friends 字段使用了 json.RawMessage 类型,它会将原始的 JSON 数据存储为字节切片。这样,我们可以在后续的处理中解析这些原始数据。

自定义解码函数是另一种处理循环引用的方法。通过自定义解码函数,我们可以控制解码过程,处理循环引用并构建正确的对象关系。

示例:

 type Person struct {
     Name    string   `json:"name"`
     Friends []*Person `json:"friends"`
 }
 ​
 func (p *Person) UnmarshalJSON(data []byte) error {
     type Alias Person
     aux := &struct {
         *Alias
         Friends []*Person `json:"friends"`
     }{
         Alias: (*Alias)(p),
     }
     if err := json.Unmarshal(data, &aux); err != nil {
         return err
     }
     p.Friends = aux.Friends
     return nil
 }
 ​
 jsonStr := `{"name":"Alice","friends":[
     {"name":"Bob","friends":null},
     {"name":"Charlie","friends":null}
 ]}`
 var p Person
 err := json.Unmarshal([]byte(jsonStr), &p)
 if err != nil {
     log.Fatal(err)
 }
 ​
 fmt.Println(p.Name)            // 输出: "Alice"
 fmt.Println(p.Friends[0].Name) // 输出: "Bob"
 fmt.Println(p.Friends[1].Name) // 输出: "Charlie"

在上述示例中,我们为 Person 结构体定义了自定义的解码函数 UnmarshalJSON。在解码过程中,我们使用一个辅助结构体 aux 来接收解码的 JSON 数据,并将其转换为 Person 结构体。然后,将辅助结构体中的 Friends 字段赋值给原始结构体的 Friends 字段。

通过使用 json.RawMessage 类型或自定义解码函数,我们可以处理包含循环引用的 JSON 数据,并成功地解码成正确的对象结构。

10. 处理不确定结构的 JSON 数据

有时,我们可能需要处理具有不确定结构的 JSON 数据。这种情况下,Golang 的 encoding/json 包提供了 json.RawMessage 类型和 interface{} 类型来处理这种不确定性。

json.RawMessage 类型可以用于存储原始的 JSON 数据,并在后续的处理中解析。它可以接收任何合法的 JSON 数据,并保留其原始形式。

示例:

 type Data struct {
     Name    string          `json:"name"`
     Payload json.RawMessage `json:"payload"`
 }
 ​
 jsonStr := `{"name":"Event","payload":{"type":"message","content":"Hello, world!"}}`
 var d Data
 err := json.Unmarshal([]byte(jsonStr), &d)
 if err != nil {
     log.Fatal(err)
 }
 ​
 fmt.Println(d.Name)                   // 输出: "Event"
 fmt.Println(string(d.Payload))        // 输出: {"type":"message","content":"Hello, world!"}

在上述示例中,Data 结构体中的 Payload 字段使用了 json.RawMessage 类型,它会将原始的 JSON 数据存储为字节切片。我们可以使用 string() 函数将其转换为字符串进行打印或进一步解析。

另一种处理不确定结构的方法是使用 interface{} 类型。interface{} 类型可以接收任何类型的值,包括基本类型、结构体、切片等。通过使用 interface{} 类型,我们可以处理具有不确定结构的 JSON 数据,但在后续的处理中需要进行类型断言。

示例:

 type Data struct {
     Name    string      `json:"name"`
     Payload interface{} `json:"payload"`
 }
 ​
 jsonStr := `{"name":"Event","payload":{"type":"message","content":"Hello, world!"}}`
 var d Data
 err := json.Unmarshal([]byte(jsonStr), &d)
 if err != nil {
     log.Fatal(err)
 }
 ​
 fmt.Println(d.Name)                                // 输出: "Event"
 payload, ok := d.Payload.(map[string]interface{})
 if ok {
     fmt.Println(payload["type"].(string))          // 输出: "message"
     fmt.Println(payload["content"].(string))       // 输出: "Hello, world!"
 }

在上述示例中,Data 结构体中的Payload字段使用了 interface{} 类型,它可以接收任何类型的值。在后续的处理中,我们使用类型断言将其转换为具体的类型,并进行进一步的操作。

通过使用 json.RawMessage 类型和 interface{} 类型,我们可以灵活地处理不确定结构的 JSON 数据,并根据实际情况进行解析和操作。

11. 总结

本文深入介绍了 Golang 中的 JSON 编码与解码技术。我们了解了 JSON 的基本原理和 Golang 中处理 JSON 的方法。通过示例代码,我们展示了如何使用 encoding/json 包进行编码和解码操作,并通过合理应用这些技术,我们可以高效处理大规模的结构化数据,提高软件的性能和效率。

以上就是深入解析Golang中JSON的编码与解码的详细内容,更多关于Golang JSON编码与解码的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

深入解析Golang中JSON的编码与解码

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

深入解析Golang中JSON的编码与解码

随着互联网的快速发展和数据交换的广泛应用,各种数据格式的处理成为软件开发中的关键问题,本文将介绍 Golang 中 JSON 编码与解码的相关知识,帮助大家了解其基本原理和高效应用,需要的可以收藏一下
2023-05-19

Golang中的数据编码:深入理解Gob

答案: gob 是 go 语言中用于数据编码的数据包,可将数据序列化和反序列化。描述:使用 gob 编码数据,使用 encoder.encode 函数。使用 gob 解码数据,使用 decoder.decode 函数。实战案例:持久化结构体
Golang中的数据编码:深入理解Gob
2024-04-08

深入了解Golang编译过程与字节码的关联

探索Golang的编译过程与字节码关系Golang,是一个开源的静态类型编程语言,由Google开发。它以其高效的并发特性和简洁的语法而闻名,被广泛应用于各种领域的软件开发中。在Golang中,源代码编译后会生成与机器无关的中间代码,也就
深入了解Golang编译过程与字节码的关联
2024-02-26

怎么理解PHP中JSON的编码与转码

这篇文章主要介绍“怎么理解PHP中JSON的编码与转码”,在日常操作中,相信很多人在怎么理解PHP中JSON的编码与转码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解PHP中JSON的编码与转码”的疑
2023-06-25

Java HashTable与Collections.synchronizedMap源码深入解析

HashTable是jdk 1.0中引入的产物,基本上现在很少使用了,但是会在面试中经常被问到。本文就来带大家一起深入了解一下Hashtable,需要的可以参考一下
2022-11-13

Python中json格式数据的编码与解码方法详解

本文实例讲述了Python中json格式数据的编码与解码方法。分享给大家供大家参考,具体如下: python从2.6版本开始内置了json数据格式的处理方法。 1、json格式数据编码 在python中,json数据格式编码使用json.d
2022-06-04

深入解析Python编程中JSON模块的使用

JSON编码支持的基本数据类型为 None , bool , int , float 和 str , 以及包含这些类型数据的lists,tuples和dictionaries。 对于dictionaries,keys需要是字符串类型(字典中
2022-06-04

深入源码解析Python中的对象与类型

对象 对象, 在C语言是如何实现的 Python中对象分为两类: 定长(int等), 非定长(list/dict等) 所有对象都有一些相同的东西, 源码中定义为PyObject和PyVarObject, 两个定义都有一个共同的头部定义PyO
2022-06-04

Golang与GC的区别:深入解析

Golang与GC的区别:深入解析在编程领域,Golang(也称为Go语言)是一种由谷歌开发的开源编程语言,它被设计用于构建高效、可靠的软件系统。与之相关的一个重要概念就是GC(垃圾回收器),它是一种自动内存管理技术,可以自动释放不再使用
Golang与GC的区别:深入解析
2024-02-29

Golang HTTP编程的源码解析详解

这篇文章主要为大家详细介绍了Golang中的HTTP编程以及源码解析,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的可以了解一下
2023-02-21

深入理解Python对Json的解析

Json简介JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。
2022-06-04

深入解析golang编译器的编译过程:从源码到可执行文件

从源码到可执行文件:解析golang编译器的编译过程概述:Golang是一种快速、简单和可靠的编程语言,而其编译器是将Golang代码转换为可执行文件的关键工具。在这篇文章中,我们将深入探究Golang编译器的编译过程,从源码到最终生成的可
深入解析golang编译器的编译过程:从源码到可执行文件
2023-12-29

Go语言学习之JSON编码解析与使用

这篇文章主要为大家详细介绍了Go语言中JSON编码的解析与使用已经JSON与Map、结构体的互相转化,文中的示例代码讲解详细,需要的可以参考一下
2023-02-14

Golang中Slice的分析与使用源码解析

这篇文章主要介绍了Golang中Slice的分析与使用(含源码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-03-09

深入解析Golang的并发编程模型

Golang作为一种开发高效、简洁的编程语言,具有非常强大的并发编程能力,为开发者提供了丰富的工具和机制来处理并发问题。本文将深入解析Golang的并发编程模型,包括Goroutine、Channel、互斥锁等机制,并通过具体的代码示例展示
深入解析Golang的并发编程模型
2024-03-01

深入解析Golang中线程与协程的异同

Golang是一门由谷歌开发的编程语言,其并发模型主要基于“协程”(goroutine)和“通道”(channel)。在Go语言中,协程是由Go语句(go)启动的轻量级线程,它们在单独的栈上运行,并且由Go运行时(goroutine)进行调
深入解析Golang中线程与协程的异同
2024-02-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录