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

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
注册配置 MSE Nacos/ZooKeeper,118元/月
应用实时监控服务ARMS - 应用监控,每月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 中的各种数据结构,如数组、切片、映射和结构。我们还展示了多个代码示例、用例和函数。

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

目录
相关文章
|
1天前
|
安全 Java Go
探索Go语言在高并发环境中的优势
在当今的技术环境中,高并发处理能力成为评估编程语言性能的关键因素之一。Go语言(Golang),作为Google开发的一种编程语言,以其独特的并发处理模型和高效的性能赢得了广泛关注。本文将深入探讨Go语言在高并发环境中的优势,尤其是其goroutine和channel机制如何简化并发编程,提升系统的响应速度和稳定性。通过具体的案例分析和性能对比,本文揭示了Go语言在实际应用中的高效性,并为开发者在选择合适技术栈时提供参考。
|
4天前
|
运维 Kubernetes Go
"解锁K8s二开新姿势!client-go:你不可不知的Go语言神器,让Kubernetes集群管理如虎添翼,秒变运维大神!"
【8月更文挑战第14天】随着云原生技术的发展,Kubernetes (K8s) 成为容器编排的首选。client-go作为K8s的官方Go语言客户端库,通过封装RESTful API,使开发者能便捷地管理集群资源,如Pods和服务。本文介绍client-go基本概念、使用方法及自定义操作。涵盖ClientSet、DynamicClient等客户端实现,以及lister、informer等组件,通过示例展示如何列出集群中的所有Pods。client-go的强大功能助力高效开发和运维。
21 1
|
5天前
|
SQL 关系型数据库 MySQL
Go语言中使用 sqlx 来操作 MySQL
Go语言因其高效的性能和简洁的语法而受到开发者们的欢迎。在开发过程中,数据库操作不可或缺。虽然Go的标准库提供了`database/sql`包支持数据库操作,但使用起来稍显复杂。为此,`sqlx`应运而生,作为`database/sql`的扩展库,它简化了许多常见的数据库任务。本文介绍如何使用`sqlx`包操作MySQL数据库,包括安装所需的包、连接数据库、创建表、插入/查询/更新/删除数据等操作,并展示了如何利用命名参数来进一步简化代码。通过`sqlx`,开发者可以更加高效且简洁地完成数据库交互任务。
12 1
|
5天前
|
算法 NoSQL 中间件
go语言后端开发学习(六) ——基于雪花算法生成用户ID
本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。
go语言后端开发学习(六) ——基于雪花算法生成用户ID
|
2天前
|
NoSQL Go Redis
Go语言中如何扫描Redis中大量的key
在Redis中,遍历大量键时直接使用`KEYS`命令会导致性能瓶颈,因为它会一次性返回所有匹配的键,可能阻塞Redis并影响服务稳定性。为解决此问题,Redis提供了`SCAN`命令来分批迭代键,避免一次性加载过多数据。本文通过两个Go语言示例演示如何使用`SCAN`命令:第一个示例展示了基本的手动迭代方式;第二个示例则利用`Iterator`简化迭代过程。这两种方法均有效地避免了`KEYS`命令的性能问题,并提高了遍历Redis键的效率。
9 0
|
3天前
|
监控 Serverless Go
Golang 开发函数计算问题之Go 语言中切片扩容时需要拷贝原数组中的数据如何解决
Golang 开发函数计算问题之Go 语言中切片扩容时需要拷贝原数组中的数据如何解决
|
4天前
|
关系型数据库 MySQL 数据库连接
Go语言中使用sqlx来操作事务
在应用中,数据库事务保证操作的ACID特性至关重要。`github.com/jmoiron/sqlx`简化了数据库操作。首先安装SQLX和MySQL驱动:`go get github.com/jmoiron/sqlx`和`go get github.com/go-sql-driver/mysql`。导入所需的包后,创建数据库连接并使用`Beginx()`方法开始事务。通过`tx.Commit()`提交或`tx.Rollback()`回滚事务以确保数据一致性和完整性。
8 0
|
8天前
|
JSON 中间件 Go
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
本文详细介绍了如何在Go项目中集成并配置Zap日志库。首先通过`go get -u go.uber.org/zap`命令安装Zap,接着展示了`Logger`与`Sugared Logger`两种日志记录器的基本用法。随后深入探讨了Zap的高级配置,包括如何将日志输出至文件、调整时间格式、记录调用者信息以及日志分割等。最后,文章演示了如何在gin框架中集成Zap,通过自定义中间件实现了日志记录和异常恢复功能。通过这些步骤,读者可以掌握Zap在实际项目中的应用与定制方法
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
|
10天前
|
XML JSON Go
微服务架构下的配置管理:Go 语言与 yaml 的完美结合
微服务架构下的配置管理:Go 语言与 yaml 的完美结合
|
6天前
|
JSON 缓存 监控
go语言后端开发学习(五)——如何在项目中使用Viper来配置环境
Viper 是一个强大的 Go 语言配置管理库,适用于各类应用,包括 Twelve-Factor Apps。相比仅支持 `.ini` 格式的 `go-ini`,Viper 支持更多配置格式如 JSON、TOML、YAML
go语言后端开发学习(五)——如何在项目中使用Viper来配置环境