零值在go语言和初始化数据

本文涉及的产品
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
应用实时监控服务-应用监控,每月50GB免费额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 【7月更文挑战第10天】本文介绍在Go语言中如何初始化数据,未初始化的变量会有对应的零值:bool为`false`,int为`0`,byte和string为空,pointer、function、interface及channel为`nil`,slice和map也为`nil`。。本文档作为指南,帮助理解Go的数据结构和正确使用它们。

简介

本文介绍在go中初始化数据的方法,并且包括数据类型转换示例:转字符串、strconv包用于数字和布尔值转换,以及interface转换。

文章通过数组、切片、映射和结构体的创建展示了数据初始化和零值的使用。此外,还提供了检查映射中键是否存在及结构体创建的方法

image.png

1 初始化 数据

在 Go 中,任何类型在未初始化时都对应一个零值:

bool 布尔类型是 false ,

    var boo1 bool
    fmt.Println(boo1)   // false

int 整型是 0

    var in2 int
    fmt.Println(in2) // 0

byte 是0,

    var bt2 byte
    fmt.Println(bt2) // 0

string 字符串是 ""

    var st2 string
    fmt.Println(st2)  // ""

pointer指针 初始化零值 是 nil,

    var p1 *int
    fmt.Println(p1)  // nil

function 函数 初始化零值是 nil,

    var func1 func()
    fmt.Println(func1) // nil

interface 接口 初始化零值是 nil,

    var inter1 interface{}
    fnt.Println(inter1)  // nil

slice 切片 初始化零值是 nil,

切片列表 值如果 没有初始化 将填充为对于的 初始化值

    var slice1 [3]int
    fmt.Println(slice1) // [0,0,0]

    var mslice2 make([]int, 5)
    fmt.Println(mslice2) //[0 0 0 0 0]

    var slice1 [3]byte
    fmt.Println(slice1) // [0,0,0]

channel 通道初始化零是nil,

    idleConnsClosed := make(chan int, 1)
    var c1 = make(chan int, 1) 

    fmt.Printf("c1 : %v (%T)\n", c1, c1)  //0xc0000b8000 (chan int)
    fmt.Println(&c1 )   //0xc0000b2018

map 初始化的零值是 nil

    var arr map[string]int
    fmt.Printf("array: %v (%T)\n", arr, arr)   //array: map[] (map[string]int)
    fmt.Println(arr)   //map[]

本质上 0 引用 nil

2 数据类型转换

几个例子

  • 转字符串

     ins := fmt.Sprintf("%v", ms)     
     // j sj star to int
     intsj, _ := strconv.ParseInt(sj, 10, 64)
    
  • strconv 字符数字转换 int或float: strconv

     s := "1.1314";fmt.Printf("%T  \\n", s);z1, _:= strconv.ParseFloat(s, 64);fmt.Println(float64(z) + z1)  //1.1314
     i, _ := strconv.ParseInt("-42", 10, 64) //-42
     u, _ := strconv.ParseUint("42", 10, 64) //42
     b, _ := strconv.ParseBool("true") //true
     ia,_ := strconv.Atoi("-11")  //-11
    
  • interface 转其他类型

     import (
    "encoding/json"
    "strconv"
  )

Strval 获取变量字符串, 浮点型 3.0 将转换为字符串 3,非数值 或 字符类型的 变量 将被转换为 JSON格式 字符串

  func InterToString(value interface{}) string {
    var key string
    if value == nil {
        return key
    }
    switch value.(type) {
    case float64:
        ft := value.(float64)
        key = strconv.FormatFloat(ft, 'f', -1, 64)
    case float32:
        ft := value.(float32)
        key = strconv.FormatFloat(float64(ft), 'f', -1, 64)
    case int:
        it := value.(int)
        key = strconv.Itoa(it)
    case int8:
        it := value.(int8)
        key = strconv.Itoa(int(it))
    case uint8:
        it := value.(uint8)
        key = strconv.Itoa(int(it))
    case int16:
        it := value.(uint16)
        key = strconv.Itoa(int(it))
    case int32:
        it := value.(int32)
        key = strconv.Itoa(int(it))
    case int64:
        it := value.(int64)
        key = strconv.FormatInt(it, 10)
    case uint64:
        it := value.(uint64)
        key = strconv.FormatUint(it, 10)
    case string:
        key = value.(string)
    case []byte:
        key = string(value.([]byte))
    default:
        Nv, _ := json.Marshal(value)
        key = string(Nv)
    }
    return key
}

3 示例:数据的初始化和零值使用方法

我们通过数组的定义和初始化来理解goalng中变量定义方式。

如下一个数组的3种方式

  • 先定义后赋值

var studentsAge [10]int
studentsAge = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

  • 在定义时同时赋值
    var studentsAge = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

  • 简短形式
    studentsAge := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

另外还可以使用golang内置函数创建变量

比如Go 提供了一个make函数,您可以使用该函数通过指定切片的长度来创建切片。
创建后,Go 将用其类型的零值填充切片:

sliceOfInt := make([]int, 5) // [0 0 0 0 0]
sliceOfBool := make([]bool, 3) // [false false false]

每个切片都有长度和容量。切片的长度是切片中的元素数,而容量是基础数组中的元素数,从切片中的第一个元素开始计数。

该函数允许我们创建具有指定容量的切片。如下创建一个长度为5,容量为10的切片。

sliceOfStrings := make([]string, 5, 10)

或者用于创建字典映射。

var studentsAge map[string]int
studentsAge = make(map[string]int)

检查某个键是否存在

element, ok := studentsAge["solomon"]
fmt.Println(element, ok) // false

  • 结构体的创建 类似变量

    type Rectangle struct {}
    
    var myRectangle Rectangle
    

创建一个空的实例

  myRectangle := Rectangle{}

也可以使用内置的关键字函数

  myRectangle := new(Rectangle)

查看数据

 fmt.Println(myRectangle, *myRectangle) // &{0 0} {0 0}

4 小结

在本文中,我们了解了 Go 中的各种数据结构,如数组、切片、映射和结构。我们还展示了多个代码示例、用例和函数。

我希望这是一本有用的指南,可以解决通常很复杂的话题。以本文为参考指南,您可以自信地为您的用例使用正确的数据结构,并创建快速、高性能的应用程序。

目录
相关文章
|
5天前
|
存储 JSON 监控
Viper,一个Go语言配置管理神器!
Viper 是一个功能强大的 Go 语言配置管理库,支持从多种来源读取配置,包括文件、环境变量、远程配置中心等。本文详细介绍了 Viper 的核心特性和使用方法,包括从本地 YAML 文件和 Consul 远程配置中心读取配置的示例。Viper 的多来源配置、动态配置和轻松集成特性使其成为管理复杂应用配置的理想选择。
23 2
|
3天前
|
Go 索引
go语言中的循环语句
【11月更文挑战第4天】
12 2
|
3天前
|
Go C++
go语言中的条件语句
【11月更文挑战第4天】
14 2
|
6天前
|
监控 Go API
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
|
3天前
|
Go
go语言中的 跳转语句
【11月更文挑战第4天】
10 4
|
3天前
|
JSON 安全 Go
Go语言中使用JWT鉴权、Token刷新完整示例,拿去直接用!
本文介绍了如何在 Go 语言中使用 Gin 框架实现 JWT 用户认证和安全保护。JWT(JSON Web Token)是一种轻量、高效的认证与授权解决方案,特别适合微服务架构。文章详细讲解了 JWT 的基本概念、结构以及如何在 Gin 中生成、解析和刷新 JWT。通过示例代码,展示了如何在实际项目中应用 JWT,确保用户身份验证和数据安全。完整代码可在 GitHub 仓库中查看。
14 1
|
5天前
|
Go 调度 开发者
探索Go语言中的并发模式:goroutine与channel
在本文中,我们将深入探讨Go语言中的核心并发特性——goroutine和channel。不同于传统的并发模型,Go语言的并发机制以其简洁性和高效性著称。本文将通过实际代码示例,展示如何利用goroutine实现轻量级的并发执行,以及如何通过channel安全地在goroutine之间传递数据。摘要部分将概述这些概念,并提示读者本文将提供哪些具体的技术洞见。
|
16天前
|
Go 数据安全/隐私保护 开发者
Go语言开发
【10月更文挑战第26天】Go语言开发
32 3
|
17天前
|
Java 程序员 Go
Go语言的开发
【10月更文挑战第25天】Go语言的开发
26 3
|
3月前
|
JSON 中间件 Go
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
本文详细介绍了如何在Go项目中集成并配置Zap日志库。首先通过`go get -u go.uber.org/zap`命令安装Zap,接着展示了`Logger`与`Sugared Logger`两种日志记录器的基本用法。随后深入探讨了Zap的高级配置,包括如何将日志输出至文件、调整时间格式、记录调用者信息以及日志分割等。最后,文章演示了如何在gin框架中集成Zap,通过自定义中间件实现了日志记录和异常恢复功能。通过这些步骤,读者可以掌握Zap在实际项目中的应用与定制方法
130 1
go语言后端开发学习(四) —— 在go项目中使用Zap日志库