Go 类型全解:常量与变量大全!

news2024/11/24 11:37:55

一、类型确定值

类型确定值是与特定数据类型明确绑定的。类型确定值在 Go 中占有很大一部分领域,包括但不限于常量、变量、函数返回值、结构体字段等。下面是对类型确定值的的示例:

类型确定值在变量声明中

当你在变量声明中明确指定了类型,那么这个变量就是类型确定值。

var x int = 10 // x 是类型确定值,类型为 int
var y string = "Hello" // y 是类型确定值,类型为 string

类型确定值在函数返回值中

函数也可以返回类型确定值。

func sum(a int, b int) int { // 返回值类型明确为 int
    return a + b
}

类型确定值在结构体字段中

结构体字段也是类型确定值。

type Person struct {
    Name string // Name 是类型确定值,类型为 string
    Age  int    // Age 是类型确定值,类型为 int
}

类型确定值在数组和切片中

数组和切片的元素也是类型确定值。

var arr [3]int = [3]int{1, 2, 3} // arr 是类型确定值,类型为 [3]int
var s []string = []string{"a", "b", "c"} // s 是类型确定值,类型为 []string

类型确定值在接口和类型断言中

当你通过类型断言将接口值转换为某个具体类型时,结果是类型确定值。

var i interface{} = "this is string"
str, ok := i.(string) // str 是类型确定值,类型为 string

类型确定值在类型别名和自定义类型中

即使你创建了一个类型别名或自定义类型,实际上还是与原始类型绑定的类型确定值。

type Length int
var l Length = 10 // l 是类型确定值,类型为 Length

这些例子展示了类型确定值如何渗透到 Go 语言的各个方面,为开发者提供了严格的类型安全性。在编写代码时,对类型有明确的了解可以帮助你编写更健壮、更安全的程序。


二、类型不确定值

类型不确定值是没有明确类型的值。这些值不是与任何具体的数据类型绑定的,因此在编译时,Go 编译器会根据上下文来推断其类型。在 Go 中,类型不确定值是一个相当有趣和多面性的概念。这些值存在于常量声明、算术运算、以及一些内建函数中。下面是对类型不确定值的的示例:

在算术运算中的类型不确定值

当你使用类型不确定值进行算术运算时,结果也是类型不确定值,除非运算中有一个类型确定值,这种情况下,结果将是类型确定值。

const c = 3  // 类型不确定值
var d int = 2  // 类型确定值

// e 依然是类型不确定值,因为参与运算的两个值都是类型不确定值
const e = c * c 

// f 是类型确定值,因为参与运算的有一个类型确定值
var f = c * d 

在内建函数中的类型不确定值

一些 Go 的内建函数(如 len)返回类型不确定值。

const s = "hello world"
const l = len(s)  // l 是类型不确定值

类型不确定值与默认类型

每个类型不确定值都有一个与之关联的默认类型,通常是基于字面量或者运算表达式。

const g = 42.0  // 默认类型是 float64
const h = 'x'   // 默认类型是 rune

类型不确定值在数组长度声明中

在数组长度声明中也可使用类型不确定值。

const size = 4
var arr [size]int  // 编译器推断 size 为 int

类型不确定值与 iota

iota 也是类型不确定值,经常用于枚举。

const (
    zero = iota  // zero 是 0
    one         // one 是 1
)

三、显式类型转换与类型推断

在 Go 语言中,类型转换和类型推断是两个相当重要的概念。它们共同定义了如何在编译和运行时处理不同类型的值。我们将详细讨论这两个概念,并通过示例来阐明其用法和重要性。

显式类型转换

显式类型转换是通过语法明确地将一个数据类型转换为另一个数据类型的操作。

定义

在 Go 中,显式类型转换的语法是 T(v),其中 T 是目标类型,而 v 是要转换的值。

var x float64 = 42.0
var y int = int(x)  // 显式地将 float64 转换为 int

限制与约束

显式类型转换并不总是有效的。转换的合法性取决于源类型和目标类型。例如,不能直接将一个结构体类型转换为整数或者浮点数。

type myStruct struct {
    field int
}

var a myStruct
// var b int = int(a)  // 这是不合法的

类型推断

类型推断是编译器自动推断变量类型的过程。在 Go 中,这通常发生在使用 := 进行变量初始化时。

定义

当使用 := 操作符声明变量但没有明确指定类型时,Go 编译器会根据右侧表达式的类型来推断变量的类型。

z := 42  // 类型被推断为 int

在复杂表达式中的类型推断

在涉及多种类型的复杂表达式中,Go 会尽量进行类型推断以满足表达式的类型需要。

var m float64 = 3.14
n := int(m) + 42  // int(m) 显式转换,结果类型推断为 int

类型推断与类型不确定值

类型推断也适用于类型不确定值。编译器会根据上下文来推断其最合适的类型。

const p = 5  // 类型不确定值
var q = p    // 类型推断为 int,因为 p 的默认类型是 int

四、常量

在 Go 语言中,常量(Constant)是不可改变的值,这一点与变量有明显区别。一旦一个常量被定义,它的值就不能再被改变。常量可以是类型不确定值或类型确定值。

类型不确定常量

类型不确定常量是没有明确类型的常量。这些常量不是与任何具体的数据类型绑定的,因此在编译时,Go 编译器会根据上下文来推断其类型。

const a = 42  // a 是类型不确定值,因为没有明确指定类型

类型确定常量

类型确定常量是与特定数据类型明确绑定的常量。

const c int = 42  // c 是类型确定值,因为其类型明确为 int

常量声明中的自动补全

在常量声明块中,你可以省略后续常量的类型和值,它们会自动补全。

const (
    x int = 10
    y      // y 也是 int 类型,值为 10
)

使用 iota 在常量声明中

iota 是一个特殊的常量生成器,主要用于创建一组递增的整数常量。

const (
    zero = iota  // zero 的值为 0
    one          // one 的值为 1
    two          // two 的值为 2
)

常量的可见性和可寻址性

常量可以是导出或非导出的,取决于它的名称是否以大写字母开头。常量不是可寻址的。

const ExportedConst = "I am visible" // 可导出的常量
const unExportedConst = "I am not visible" // 不可导出的常量

常量溢出和默认类型

一个类型不确定常量所表示的值可能会溢出其默认类型。在这种情况下,只有当这个常量被用于一个可以容纳该值的上下文时,编译才会成功。

const big = 1 << 100 // 默认类型为 int,但值会溢出
var bigInt = big >> 99 // big 被用于一个 int64 上下文,没有溢出

字符串常量

字符串常量是包含在双引号中的一系列字符。

const hello = "Hello, world!"

布尔常量

布尔常量只有两个可能的值:true 和 false

const flagTrue = true
const flagFalse = false

枚举常量

通过使用 iota,你可以创建一组递增的整数常量,通常用于枚举。

type Weekday int

const (
    Sunday Weekday = iota
    Monday
    Tuesday
    // ...
    Saturday
)

复数常量

Go 支持复数类型,并且你可以创建复数常量。

const complexConst = 1 + 2i

强制类型转换

你可以通过强制类型转换将一个常量转换为另一种类型。

const integer = 42
const floatType = float32(integer)

计算表达式中的常量

常量也可以是计算表达式的结果,但表达式必须只包含常量值。

const calculated = 3 * 2  // 6

常量数组和切片

需要注意的是,在 Go 中,数组大小需要是常量。但切片和映射的大小可以动态改变,因此它们不能是常量。

const arraySize = 5
var arr [arraySize]int  // 合法

五、变量

变量是存储数据值的存储单元,其值可以在运行时改变。在 Go 语言中,变量的使用非常灵活但又具有严格的类型安全性。

变量声明和赋值

基本声明

使用 var 关键字进行变量声明。

var x int

同时声明和赋值

var y int = 42

或者使用短变量声明形式:

z := 42

多变量声明

var a, b, c int

或者

var (
    d int
    e float64
)

类型描述

基本类型

包括 intfloat64boolstring 等。

var integerVar int = 10
var floatVar float64 = 10.99
var boolVar bool = true
var stringVar string = "Hello, Go"

数值类型

Go 支持多种数值类型,包括 int8int16int32int64uint8uint16uint32uint64float32float64 等。

var smallInt int8 = 127
var largeInt int64 = 9223372036854775807
var unsignedInt uint16 = 65535
var floatNum float32 = 3.141592

字符和字符串

Go 有 rune 和 byte 类型来表示 Unicode 字符和 ASCII 字符。

var asciiChar byte = 'A'
var unicodeChar rune = '你'
var str string = "Hello, World!"

布尔类型

布尔类型只有两个值:true 和 false

var isActive bool = true
var isCompleted bool = false

指针

Go 支持指针类型,但不支持指针运算。

var pointer *int
x := 42
pointer = &x

数组和切片

var arrayExample [5]int = [5]int{1, 2, 3, 4, 5}
var sliceExample []int = arrayExample[1:4]

映射(Maps)

var countryCapitalMap map[string]string
countryCapitalMap = make(map[string]string)
countryCapitalMap["France"] = "Paris"

结构体(Structs)

type Employee struct {
    ID     int
    Name   string
    Salary float64
}

var emp Employee

接口(Interfaces)

type Shape interface {
    Area() float64
}

type Circle struct {
    Radius float64
}

func (c Circle) Area() float64 {
    return 3.14159 * c.Radius * c.Radius
}

var s Shape = Circle{5.0}

函数类型

Go 中,函数也是一种类型,可以作为参数传递。

type AddFunc func(a int, b int) int

var add AddFunc = func(a int, b int) int {
    return a + b
}

通道(Channels)

var messageChannel chan string = make(chan string)

复合类型

例如数组、切片、映射、通道、结构体和接口。

数组

var arr [5]int

切片

var slice []int

映射

var mapping map[string]int

通道

var ch chan int

结构体

type Person struct {
    name string
    age int
}

var p Person

接口

type Geometry interface {
    Area() float64
}

var g Geometry

值的可寻址性

Go 语言中有些变量是可寻址的,意味着你可以获取这个变量的内存地址。

var myVar int = 42
var p *int = &myVar

变量作用域

在 Go 中,变量可以有不同的作用域:全局作用域、包内作用域、函数作用域、代码块作用域等。

var globalVar int  // 全局作用域

func myFunction() {
    var functionVar int  // 函数作用域
    {
        var blockVar int  // 代码块作用域
    }
}

七、常量和变量的高级用法

在 Go 编程中,常量和变量不仅仅是数据存储的简单方式。它们有各种高级用法,可以用来优化代码、提高效率或实现复杂的编程模式。

常量的高级用法

枚举和 iota

Go 通过 iota 关键字支持枚举类型的实现。这在一组常量声明中是非常有用的。

const (
    Monday = iota + 1  // Monday = 1
    Tuesday            // Tuesday = 2
    Wednesday          // Wednesday = 3
)

类型别名

使用类型别名,你可以将常量限制为自定义类型。

type Weekday int

const (
    Sunday Weekday = iota
    Monday
    // ...
)

无类型和有类型常量

无类型的常量可以用在多种场合,它们会根据上下文进行类型推断。

const x = 42  // 无类型常量
var i int = x
var f float64 = x

变量的高级用法

变量的作用域

Go 支持块级作用域。通过 var 关键字在不同级别(全局、包级别、函数级别等)声明变量,你可以控制变量的可见性。

var globalVar = 42  // 全局变量

func main() {
    var funcVar = "I'm local"  // 函数级别变量
}

延迟初始化

使用 init() 函数,你可以在程序开始执行前初始化变量。

var complexVar complex128

func init() {
    complexVar = cmplx.Sqrt(-5 + 12i)
}

指针和地址操作符

虽然 Go 语言没有提供指针运算,但它允许你通过地址操作符 & 和解引用操作符 * 来操作指针。

x := 42
p := &x
fmt.Println(*p)  // 输出 42

使用标签(Tags)和结构体

在结构体中,你可以使用标签(tags)来附加元数据,这在序列化和反序列化时非常有用。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1123490.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PLC MODBUS-ASCII协议通信( LRC校验码SCL计算FC)

Modbus-RTU协议在RS485总线上有RTU和ASCII两种传输格式,其中RTU协议应用比较多,ASCII协议很少使用。有些仪表可能会使用到ASCII协议,这篇博客我们简单介绍下MODBUS-ASCII协议,ASCII协议使用的是文本传输,整个数据包是可打印字符。 帧头一般是冒号: 帧尾是换行符\r\n。 有…

【每日一题】老人的数目

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;遍历 其他语言python3 写在最后 Tag 【遍历】【数组】【2023-10-23】 题目来源 2678. 老人的数目 题目解读 找出乘客中年龄严格大于 60 的人数。 解题思路 方法一&#xff1a;遍历 本题比较简单&#xff0c;直接遍…

智慧燃气巡检管理系统

我们知道燃气设施的巡检、巡查是运维工作中一项重要的基础工作&#xff0c;而巡检人员主要靠手动记录&#xff0c;回到公司后还得再进行录入归档、导入照片&#xff0c;然后打印装订等&#xff0c;涉及工作量也是不小的&#xff1b;还有人员更替&#xff0c;易造成人员对燃气设…

【设计模式】概括

设计模式 什么是设计模式 设计模式&#xff0c;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 设计模式分类 创建型模式&#xff0c;共五种&#xff1a;工厂…

Java方法区

方法区 Java方法区&#xff08;Method Area&#xff09;&#xff0c;在Java虚拟机&#xff08;JVM&#xff09;内存结构中是一个非常重要的组成部分。方法区是用来存储类信息、常量、静态变量以及即时编译器编译后的代码等数据的内存区域。 内部结构 类元数据&#xff08;Cl…

Python数据挖掘 | 升级版自动查核酸

&#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于恒川的日常汇报系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏C语言初阶、C…

常见的状态转移矩阵和对应的运动模型

状态转移矩阵的形式取决于我们所建模的系统的动态特性。对于不同的运动模型&#xff0c;状态转移矩阵将会有所不同。以下是一些常见的状态转移矩阵和对应的运动模型&#xff1a; 恒定速度模型&#xff1a; 这是你给出的模型&#xff0c;其中物体假设以恒定速度移动。 恒定加速…

图书推荐管理系统Python+Django网页界面+协同过滤推荐算法

一、介绍 图书管理与推荐系统。使用Python作为主要开发语言。前端采用HTML、CSS、BootStrap等技术搭建界面结构&#xff0c;后端采用Django作为逻辑处理&#xff0c;通过Ajax等技术实现数据交互通信。在图书推荐方面使用经典的协同过滤算法作为推荐算法模块。主要功能有&#…

【python海洋专题二十八】南海四季海流流速图

【python海洋专题二十八】南海四季海流流速图 往期推荐 图片 【python海洋专题一】查看数据nc文件的属性并输出属性到txt文件 【python海洋专题二】读取水深nc文件并水深地形图 【python海洋专题三】图像修饰之画布和坐标轴 【Python海洋专题四】之水深地图图像修饰…

云HIS系统,Cloud HIS system,云HIS医院信息管理系统源码

通过云HIS平台,可以减少医院投资,无需自建机房和系统,快速实现信息化服务。系统升级及日常维护服务有云平台提供,无需配备专业IT维护人员进行系统维护。 一、his系统和云his系统的区别 His系统和云his系统是两种不同的计算平台&#xff0c;它们在技术架构上存在很大的差异。下…

【python海洋专题二十七】南海四季海流图

【python海洋专题二十七】南海四季海流图 往期推荐 **[[ 【python海洋专题一】查看数据nc文件的属性并输出属性到txt文件] 【python海洋专题二】读取水深nc文件并水深地形图 【python海洋专题三】图像修饰之画布和坐标轴 【Python海洋专题四】之水深地图图像修饰 【Pyth…

电动汽车交流充电桩系统的设计方案

摘要&#xff1a;作为新能源汽车的基础动力装置&#xff0c;交流充电桩也是可以促使新能源汽车正常行驶的关键内容。与其他汽车不同的是&#xff0c;新能源汽车并不需要汽油维持其运行&#xff0c;只需要充电就可以保证汽车行驶的需求&#xff0c;可以降低汽油排放对环境的污染…

SpringBoot项目把Mysql从5.7升级到8.0

首先你需要把之前的库导入到mysql库导入到8.0的新库中。&#xff08;导入的时候会报错我是通过navcat备份恢复的&#xff09; 1、项目中需要修改pom文件的依赖 mysql 和 jdbc <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java&…

nginx配置负载均衡--实战项目(适用于轮询、加权轮询、ip_hash)

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

html登录注册标签

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <h1>登录注册</h1> <form action"第一个网页.html" method"post&quo…

LeetCode算法心得——元素和最小的山形三元组 II(预处理和简单动规)

大家好&#xff0c;我是晴天学长&#xff0c;枚举&#xff0b;简单的动态规划思想&#xff0c;和前段时间的周赛题的写法可以说一模一样&#xff0c;像这种类似3元的题&#xff0c;要控制时间复杂度的话&#xff0c;只能枚举一个变量&#xff0c;所以要前缀和或者动规等待。需要…

【Java笔试强训】Day3(OR59 字符串中找出连续最长的数字串、JZ39 数组中出现次数超过一半的数字)

OR59 字符串中找出连续最长的数字串 链接&#xff1a;OR59 字符串中找出连续最长的数字串 题目&#xff1a; 读入一个字符串str&#xff0c;输出字符串str中的连续最长的数字串 题目分析&#xff1a; 代码实现&#xff1a; package Day3;import java.util.Scanner;public…

k8s 使用ingress-nginx访问集群内部应用

k8s搭建和部署应用完成后&#xff0c;可以通过NodePort&#xff0c;Loadbalancer&#xff0c;Ingress方式将应用端口暴露到集群外部&#xff0c;提供外部访问。 缺点&#xff1a; NodePort占用端口&#xff0c;大量暴露端口非常不安全&#xff0c;并且有端口数量限制【不推荐】…

纺织ERP系统哪家的比较好?适用的纺织ERP软件有哪些

服装纺织是比较常见的行业&#xff0c;也是和我们生活关联比较密切的领域。不同的原材料有差异化的采购流程和生产工序&#xff0c;如何实时掌握库存数据和车间产能负荷&#xff0c;合理制定生产排期&#xff0c;关系到企业的生产效率和经营成本。 纺织ERP系统是针对性开发的智…

2023年中国汽车铸造模具竞争现状及行业市场规模前景分析[图]

铸造是将熔融金属填充入铸型内&#xff0c;经冷却凝固而获得所需形状和性能的零部件或毛坯的制作过程&#xff0c;铸造工艺中使用的模具被称为铸造模具&#xff0c;根据铸型的材质分为砂型铸造模具和金属型铸造模具等&#xff1b;金属型铸造模具根据压力不同可分为重力铸造模具…