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

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
云原生网关 MSE Higress,422元/月
应用实时监控服务-应用监控,每月50GB免费额度
简介: 【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 中的各种数据结构,如数组、切片、映射和结构。我们还展示了多个代码示例、用例和函数。

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

目录
相关文章
|
3月前
|
人工智能 安全 Shell
Go并发编程避坑指南:从数据竞争到同步原语的解决方案
在高并发场景下,如钱包转账,数据一致性至关重要。本文通过实例演示了 Go 中如何利用 `sync.Mutex` 和 `sync.RWMutex` 解决数据竞争问题,帮助开发者掌握并发编程中的关键技能。
Go并发编程避坑指南:从数据竞争到同步原语的解决方案
|
2月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
188 1
|
3月前
|
存储 监控 算法
企业电脑监控系统中基于 Go 语言的跳表结构设备数据索引算法研究
本文介绍基于Go语言的跳表算法在企业电脑监控系统中的应用,通过多层索引结构将数据查询、插入、删除操作优化至O(log n),显著提升海量设备数据管理效率,解决传统链表查询延迟问题,实现高效设备状态定位与异常筛选。
128 3
|
4月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
295 1
|
4月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
391 0
|
4月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
256 0
|
4月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
226 0
|
4月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
325 0
|
10月前
|
存储 缓存 安全
Go 语言中的 Sync.Map 详解:并发安全的 Map 实现
`sync.Map` 是 Go 语言中用于并发安全操作的 Map 实现,适用于读多写少的场景。它通过两个底层 Map(`read` 和 `dirty`)实现读写分离,提供高效的读性能。主要方法包括 `Store`、`Load`、`Delete` 等。在大量写入时性能可能下降,需谨慎选择使用场景。
|
存储 负载均衡 监控
如何利用Go语言的高效性、并发支持、简洁性和跨平台性等优势,通过合理设计架构、实现负载均衡、构建容错机制、建立监控体系、优化数据存储及实施服务治理等步骤,打造稳定可靠的服务架构。
在数字化时代,构建高可靠性服务架构至关重要。本文探讨了如何利用Go语言的高效性、并发支持、简洁性和跨平台性等优势,通过合理设计架构、实现负载均衡、构建容错机制、建立监控体系、优化数据存储及实施服务治理等步骤,打造稳定可靠的服务架构。
290 1