首页 > 其他分享 >第 5 章 - Go 语言 数据类型

第 5 章 - Go 语言 数据类型

时间:2024-11-11 12:18:37浏览次数:6  
标签:Name fmt 数据类型 类型 func Go string 语言

在 Go 语言中,数据类型是用来声明变量和函数的特定类型的数据。Go 是一种静态类型的语言,这意味着所有变量的类型在编译时都必须已知。Go 语言支持多种数据类型,可以大致分为基本数据类型和复合数据类型。

基本数据类型

  1. 布尔型 (bool)

    • 只有两个值:truefalse
  2. 整型 (int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, uintptr)

    • 用于存储整数。不同类型的整型变量有不同的取值范围,比如 int8 表示有符号的 8 位整数,取值范围从 -128 到 127。
  3. 浮点型 (float32, float64)

    • 用于表示实数,float32 提供单精度浮点数,而 float64 提供双精度浮点数。
  4. 复数型 (complex64, complex128)

    • 用于表示复数,complex64 包含两个 float32 数字(实部和虚部),而 complex128 包含两个 float64 数字。
  5. 字符串 (string)

    • 字符串是一组不可变的字符序列。字符串是用双引号 "" 包围的。
  6. 字节切片 ([]byte)

    • 虽然不是基本类型,但是经常用来处理二进制数据或字符串的变体形式。

复合数据类型

  1. 数组 (array)

    • 固定长度的一系列相同类型元素的集合。
  2. 切片 (slice)

    • 类似于数组,但是长度可变。切片是一个引用类型,它指向一个底层数组的一部分。
  3. 映射 (map)

    • 无序的键值对集合。映射是一个引用类型。
  4. 结构体 (struct)

    • 用户自定义的复合类型,可以包含多个字段,每个字段有自己的名字和类型。
  5. 指针 (pointer)

    • 存储变量内存地址的变量。
  6. 接口 (interface)

    • 定义了一组方法的集合,任何实现了这些方法的类型都可以被视为该接口的实例。
  7. 通道 (channel)

    • 用于 Goroutine 之间的通信和同步。

类型转换

在 Go 中,不同类型的值不能自动转换,需要显式地进行类型转换。例如,如果要将 int 类型的变量转换为 float64 类型,可以使用如下语法:

var intValue int = 10
var floatValue float64 = float64(intValue)

需要注意的是,不同类型之间的转换可能会导致信息丢失或数据溢出。例如,将一个较大的浮点数转换为整数时,小数部分会被舍弃;将一个超出目标类型取值范围的数字转换到较小的整型时,会导致溢出。

此外,Go 还提供了一些内置的类型断言和类型转换机制,特别是对于接口类型,可以通过类型断言来获取接口变量的实际类型值。

类型断言

类型断言主要用于接口类型。当一个接口变量可能持有多种类型的值时,你可以使用类型断言来检查并获取这个值的具体类型。类型断言的基本形式是 x.(T),其中 x 是一个接口类型的变量,T 是你想要断言的具体类型。如果 x 实际上不是 T 类型,那么在运行时会引发一个 panic。

为了避免这种情况,可以使用带有第二个返回值的形式来安全地进行类型断言,这样即使断言失败也不会引发 panic:

var i interface{} = "hello"
s, ok := i.(string) // s 将接收字符串值,ok 将是 true
if ok {
    fmt.Println("i is a string:", s)
} else {
    fmt.Println("i is not a string")
}

类型别名

类型别名允许你给现有的类型创建一个新的名字。这在你希望代码更具描述性或需要简化复杂的类型名称时非常有用。类型别名使用 type 关键字定义:

type Kilogram int

var weight Kilogram = 75
fmt.Println(weight) // 输出: 75

这里 Kilogramint 的别名,因此 weight 实际上是一个整数。

使用示例

结构体

结构体是 Go 中非常常用的数据类型,用于组合多个字段来表示复杂的数据结构。下面是一个简单的例子,展示了一个表示人的结构体:

type Person struct {
    Name string
    Age  int
}

func main() {
    p := Person{Name: "Alice", Age: 30}
    fmt.Printf("Name: %s, Age: %d\n", p.Name, p.Age)
}
映射

映射是一种存储键值对的数据结构,其中键必须是唯一的。映射是通过 make 函数创建的:

func main() {
    m := make(map[string]int)
    m["apple"] = 5
    m["banana"] = 10

    for key, value := range m {
        fmt.Printf("%s -> %d\n", key, value)
    }
}
切片

切片是动态大小的数组,提供了方便的方法来操作一组同类型的元素。切片可以通过 make 或者直接从数组创建:

func main() {
    var numbers []int = []int{1, 2, 3, 4, 5}
    fmt.Println(numbers)

    moreNumbers := make([]int, 3)
    copy(moreNumbers, numbers[:3])
    fmt.Println(moreNumbers)
}

总结

Go 语言中的数据类型设计得既强大又灵活,能够满足大多数编程需求。了解如何有效地使用这些类型,可以帮助你编写出更清晰、更高效的代码。

接下来我将继续补充一些关于 Go 语言数据类型和相关概念的高级内容,包括方法和接口的使用、类型嵌入、以及一些常见的编程模式。

方法和接口

方法

在 Go 语言中,方法是与特定类型关联的函数。方法可以定义在任何类型上,包括基本类型、复合类型、自定义类型等。方法的定义格式如下:

func (r ReceiverType) MethodName(parameters) returnType {
    // 方法体
}

例如,我们可以为 Person 结构体定义一个 SayHello 方法:

type Person struct {
    Name string
    Age  int
}

func (p Person) SayHello() {
    fmt.Printf("Hello, my name is %s and I am %d years old.\n", p.Name, p.Age)
}

func main() {
    p := Person{Name: "Alice", Age: 30}
    p.SayHello()
}
接口

接口是定义了一组方法签名的类型。任何实现了这些方法的类型都可以被视为该接口的实现。接口的主要用途是实现多态性和抽象。

type Speaker interface {
    Speak() string
}

type Dog struct {
    Name string
}

func (d Dog) Speak() string {
    return d.Name + " says Woof!"
}

type Cat struct {
    Name string
}

func (c Cat) Speak() string {
    return c.Name + " says Meow!"
}

func main() {
    var speaker Speaker

    speaker = Dog{Name: "Fido"}
    fmt.Println(speaker.Speak()) // 输出: Fido says Woof!

    speaker = Cat{Name: "Whiskers"}
    fmt.Println(speaker.Speak()) // 输出: Whiskers says Meow!
}

类型嵌入

类型嵌入(也称为匿名字段)允许你在结构体中嵌入另一个结构体或类型,从而继承其字段和方法。这在实现复杂的数据结构和行为组合时非常有用。

type Animal struct {
    Name string
}

func (a Animal) Speak() string {
    return a.Name + " makes a sound."
}

type Dog struct {
    Animal // 嵌入 Animal 结构体
    Breed  string
}

func (d Dog) Bark() string {
    return d.Name + " barks."
}

func main() {
    dog := Dog{
        Animal: Animal{Name: "Fido"},
        Breed:  "Labrador",
    }

    fmt.Println(dog.Speak()) // 输出: Fido makes a sound.
    fmt.Println(dog.Bark())  // 输出: Fido barks.
}

常见编程模式

链式调用

链式调用是一种通过连续调用对象的方法来简化代码的模式。这通常通过在方法中返回 *T(即对象的指针)来实现。

type User struct {
    Name  string
    Email string
}

func NewUser(name, email string) *User {
    return &User{Name: name, Email: email}
}

func (u *User) SetName(name string) *User {
    u.Name = name
    return u
}

func (u *User) SetEmail(email string) *User {
    u.Email = email
    return u
}

func main() {
    user := NewUser("Alice", "[email protected]").
        SetName("Alicia").
        SetEmail("[email protected]")

    fmt.Printf("User: %+v\n", user)
}
错误处理

Go 语言推荐使用多返回值来处理错误。通常,一个函数会返回结果和一个 error 类型的值。调用者应该检查 error 并根据情况进行处理。

func divide(a, b float64) (float64, error) {
    if b == 0 {
        return 0, errors.New("division by zero")
    }
    return a / b, nil
}

func main() {
    result, err := divide(10, 0)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Result:", result)
    }
}

总结

通过这些高级特性和编程模式,你可以更灵活地使用 Go 语言的数据类型和功能,编写出更加健壮和可维护的代码。

标签:Name,fmt,数据类型,类型,func,Go,string,语言
From: https://blog.csdn.net/hummhumm/article/details/143678460

相关文章

  • mongoDB安装
    1、执行安装包文件进行安装,选择自定义路径,安装在根目录,如果不是根目录配置服务时容易出错,导致服务起不来2、我的安装在了C盘MongoDB,安装完之后,在根目录创建data文件夹,在data文件夹里创建db、log文件夹3、以管理员身份运行CMD,输入:cdC:\MongoDB\bin4、mongod--dbpathC:\da......
  • 新人报到附加一个小作业(C语言实现的三子棋)
    1.一个简单的自我介绍我是来自宁夏大学软件工程的一名学生,因为从小喜欢玩游戏,长大对于计算机领域也产生了非常浓厚的兴趣,于是在高考结束后的志愿填报中毫不犹豫的全部选择了计算机专业,希望在接下来的学习中不断进步,在IT行业中发挥自己的光和热。我的学习计划:在大一,学习C/C++......
  • 支持多语言、多商店的商城,.Net7 + EF7领域驱动设计架构
    推荐一个跨平台、模块化、可扩展且超快速的开源一体化电子商务平台。01项目简介Smartstore支持桌面和移动平台、多语言、多商店、多货币的商城,并支持SEO优化,支持无限数量的产品和类别、报表、ESD、折扣、优惠券等等。还有一套全面的CRM和CMS、销售、营销、付款和物流处理......
  • 代码语言模型是如何训练的:Qwen2.5-Coder 技术报告学习
    Qwen2.5-Coder是通义千问最新的代码语言模型,基于Qwen2.5的架构继续pretrain了5.5T的token。通过细致的数据清洗、可扩展的合成数据生成和平衡的数据混合,Qwen2.5-Coder在展示令人印象深刻的代码生成能力的同时,还保留了通用的多功能性。本文根据官方的技术报告(Qwen2.5-Coder......
  • Qwen1.5大语言模型微调实践
    在人工智能领域,大语言模型(LargeLanguageModel,LLM)的兴起和广泛应用,为自然语言处理(NLP)带来了前所未有的变革。Qwen1.5大语言模型作为其中的佼佼者,不仅拥有强大的语言生成和理解能力,而且能够通过微调(fine-tuning)来适应各种特定场景和任务。本文将带领大家深入实战,探索如何对Q......
  • R语言:rcs代码
    ##CVAI与T2DM风险之间的rcs模型。##模型调整了年龄、性别、受教育程度、居住地和婚姻状况、吸烟状况、饮酒状况、睡眠时间、收缩压和舒张压。install.packages(c('segmented','rms'))library(segmented)library(splines)library(Hmisc)library(rms)library(ggplot2)......
  • 【编程语言】理解C/C++当中的指针
    指针是C/C++语言中一个非常强大且重要的概念,也是编写高效程序的基础之一。对于没有编程背景的初学者来说,理解指针可能有些难度,但通过本篇文章的介绍,相信你会对指针有一个清晰的认识。本文将从指针的基本概念、作用、代码示例、注意事项等方面,带你一步步了解指针的世界。什......
  • 关于我,穿越异世界,凭c语言搅动风云vlog----利用数组进行大数相关计算
    关于我,穿越异世界,凭c语言搅动风云vlog----利用数组进行大数相关计算一.有关大数你应该要知道的那些事1.大数的概念我们一般将计算机基本数据类型无法存储的数称之为大数,本文涉及的大数均为整数,不包含小数。而且下文代码实现中的数组大小可根据需要修改。2.问题引入在c......
  • 毕业设计:python考研院校推荐系统 混合推荐 协同过滤推荐算法 爬虫 可视化 Django框架(
    毕业设计:python考研院校推荐系统混合推荐协同过滤推荐算法爬虫可视化Django框架(源码+文档)✅1、项目介绍技术栈:Python语言MySQL数据库Django框架协同过滤推荐算法requests网络爬虫pyecharts数据可视化html页面、爬取院校信息:https://yz.chsi.com.cn/sch/(研招网......
  • 重温c语言之,7天开整,就是随便的写写,第九天
    这次照着网站上的内容,写了一个简单的小游戏,3字棋,其实也可以n字棋附上代码,这里是:game.h1#pragmaonce2#include<stdio.h>3#include<stdlib.h>4#include<time.h>56//游戏代码的声明(函数声明,符号定义)78#defineRow39#defineCol31011//初始化棋......