Go基础编程 - 04 - 基本类型、常量和变量


目录

    • 1. 基本类型
    • 2. 常量
      • iota
    • 3. 变量
      • 3.1 变量声明
      • 3.2 自定义类型、类型别名
      • 3.3 类型推导
      • 3.4 类型断言
      • 3.5 类型转换

Go 基础编程 - 03 - init、main、_


1. 基本类型

  • 支持八进制、十六进制,以及科学记数法

  • 零值:只做了声明,但未做初始化的变量被给予的缺省值。每个类型的零值都会依据该类型的特性而被设定。

  • 单引号(‘’):定义一个字符;返回rune类型,也就是码点字面量(Unicode code point)。

  • 双引号(“”):定义字符串

  • 反引号(``):通常使用于字符串换行、正则表达式

  • byteuint8的别名,代表ASCII码的一个字符;runeint32别名,代表一个UTF-8字符

类型长度(字节)零值说明
布尔值bool1falsetrue|false
整型int, uint4或80与操作系统位数相同(32或64位)
int8(byte), uint810取值:-128 ~ 127, 0 ~ 255;byte是uint8 的别名
int16, uint1620取值:$-32768 ~ 32767, 0 ~ 65535
int32, uint32(rune)30取值:$-2^{31}$ ~ $2^{31}-1$, 0 ~ $2^{32}-1$;rune是int32 的别名
int64, uint6440
浮点float3240.0
float6480.0
复数complex648
complex12816
字符串string""UTF-8 字符串
结构体struct值类型
引用类型slicenil切片:[n]Type
mapnil字典:[Type]Type{}
channil管道
接口interface(any)nilinterface{}
函数funcnil

2. 常量

常量是恒定不变的,常量定义时必须赋值;常量只会在编译期间存在,不存储内存中,不可被寻址。

iota

  • iota是Go语言的常量计数器,只能在常量的表达式中使用。
  • iotaconst关键字出现时将被重置为0。
  • const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引)。
  • 使用iota能简化定义,在定义枚举时很有用。
package mainimport "fmt"// 常量是恒定不变的,常量定义时必须赋值。
const Pi = 3.14
// 多个常量一起声明
const (str = "string"i = 100
)
// const 同时声明多个变量,如果省略了值,则上一行的值(或表达式)相同
const ( n1 = 100    // 100n2          // 100n3          // 100
)// 常量声明使用iota,每新增一行计数一次
const ( m1 = iota   // 0, 索引由0开始m2          // 1_           // 2 即使忽略,iota同样计数n4 = 200    // 200 插队声明, iota同样计数n5          // 200 使用省略值规则   m3 = iota   // 5  重新使用iota规则m4          // 6 
)// 多个iota定义在一行(缺省值和iota结合)
const (a, b = iota + 1, iota + 2 //1,2   iota = 0c, d                      //2,3   iota = 1,iota + 1 = 2, iota + 2 = 3e, f                      //3,4   iota = 2,iota + 1 = 3, iota + 2 = 4
)func main() {fmt.Println(n1, n2, n3, n4, n5) // 100 100 100 200 200fmt.Println(m1, m2, m3, m4)     // 0 1 5 6fmt.Println(a, b, c, d, e, f)   // 1 2 2 3 3 4
}

3. 变量

3.1 变量声明

  • Go语言的变量声明后必须使用

  • 变量声明时会自动被初始化成其类型的默认值

    // 声明格式:var name Typevar i int64var (x int64y float64)// 初始化var i1 int64 = 1    var name, age = "小猫", 1// 短变量声明s := "Short var"// 变量重声明// 1. 不支持单个变量重声明;// 2. 当有新的变量和已被声明的变量同时声明时,允许使用:=重声明已有变量,// 3. 重声明时,变量类型不可改变i, j := 10, 100  // 存在新的变量j// 4. 变量重声明是在某一个代码块内,并不包含它的任何子代码块。if true {i := "Set string type"  // 子代码块中i为新的字符串变量(重名变量)}// 匿名变量(_),用于忽略多个返回值中的某些值x, _ := "X", 100println(x)

3.2 自定义类型、类型别名

自定义类型:通过Type关键字定义,是定义一个全新的类型。
类型别名:使用“=”定义,type TypeAlias = Type,TypeAlias只是Type的别名,本质上属于同一个类型。

  • 潜在类型:某个类型其本质上是哪种类型。
  • 内置基本类型:uint8 别名 byteint32 别名 runeinterface{} 别名 any

type AString = string       
var s AString = "Alisa" 
fmt.Printf("%T \n", s)      // stringtype BString string         
bs := BString("New Type")
fmt.Printf("%T \n", bs)     // main.BString// 1. 潜在类型相同的不同类型之间可以进行类型转换。
s = AString(bs)
// 2. 对于集合类的类型[]string与[]BString的潜在类型不同,分别为[]string和[]BString。
s1 := []string{"a", "a", "a", "a"}
s2 := []BString{"b", "b", "b", "b"}
fmt.Printf("%T %T \n", s1, s2) // []string  []main.BString
// 3. 即时两个不同类型的潜在类型相同,他们的值也不能进行判等或比较,他们的变量之间也不能赋值。
s = bs                      // 报错: cannot use bs (variable of type BString) as type string in assignment

3.3 类型推导

也叫隐式类型转换。有时候我们会将变量的类型省略,这个时候编译器会根据等号右边的值来推导变量的类型完成初始化。

var a := 1.2    // float64
b := 1 + a      // float64  可兼容类型允许隐式转换,编译器可以将 1 隐式转换为 float64 类型c := 1          // 编译器不允许对标识符引用的值进行强制转换
d := a + c      // invalid operation: c + a (mismatched types int and float64)。

3.4 类型断言

类型断言是一个使用在接口值上的操作,用于检查接口类型变量所持有的值是否实现了期望的接口或具体的类型。

语法:value, ok := x.(T)value := x.(T) (此表达式若断言失败则会产生panic)

x:表示一个接口类型
T:表示一个具体的类型(或接口)
value:表示返回的 x 的值
ok:bool值,表示 x 的值类型是否为 T

var x interface{}x = 10
fmt.Printf("%T \n", x.(interface{}))        // intv, ok := x.(int)        // v = 10, ok = true
v2, _ := x.(string)     // v2 = ""v3 := x.(int)           // v3 = 10
v4 := x.(string)        // 产生 panic: interface conversion: interface {} is int, not string// 如果 x 是 nil 接口值时,无论 T 是什么类型,断言都会失败,v 的值为 T 的缺省值。
x = nil
v, ok = x.(int)
fmt.Printf("v = %v, ok = %v \n", v, ok)     // v = 0, ok = false// 配合 switch
switch x.(type) {case int:fmt.Println("The type of x is int.")case string:fmt.Println("The type of x is string.")default:fmt.Println("unknown type.")
}

3.5 类型转换

类型转换包含:类型断言、强制转换、显示转换、隐式转换(类型推导)。


// 隐式转换
const a = 123
var i = 0
var i1 int64 = 1.0      // 可兼容类型允许隐式转换
var i2 int64 = 1.1      // 不兼容,产生错误
i3 = a * i1             // float64// 显示转换/强制转换
var n int64 = 100
f := float64(n)                 // int to float64
ns := strconv.Itoa(n)           // int to string
si, _ := strconv.Atoi("123")    // string to int// 指针类型强制转换 unsafe
var p int = 30
var prs *int = &p
var p2 *int64 = (*int64)(unsafe.Pointer(prs))
fmt.Printf("p addr = %d \n prs = %d \n p2 = %d, p2 addr = %d \n", &p, prs, *p2, p2)

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

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

相关文章

进阶之格式化qDebug()输出

创作灵感 刚刚在看qt帮助手册时&#xff0c;无意间在<QtGlobal>中看见了这个函数void qSetMessagePattern(const QString &pattern)&#xff0c;该函数的精华在于&#xff0c;你可以直接重定义qDebug()的输出结果格式。以往打印调试内容&#xff0c;调试内容所在的行…

大数据和数据分析来优化推荐算法

当涉及到使用大数据和数据分析来优化推荐算法时&#xff0c;通常我们会结合编程语言和特定的数据分析工具来实现。以下是一个简化的流程&#xff0c;以及在该流程中可能涉及的代码和工具内容的详细介绍。 1. 数据收集与预处理 工具&#xff1a;Python, pandas, NumPy 代码示例…

00-macOS和Linux安装和管理多个Python版本

在 Mac 上安装多个 Python 版本可通过几种不同方法实现。 1 Homebrew 1.1 安装 Homebrew 若安装过&#xff0c;跳过该步。 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 1.2 安装 Python 如安装 Python …

统计每天某个时间范围内得 数据状态

来统计在特定条件下的记录数。具体来说&#xff0c;并且这些记录必须满足以下时间条件和存在条件&#xff1a; 时间条件&#xff1a;当前时间的小时和分钟部分在0600&#xff08;早上6点&#xff09;和0800&#xff08;早上8点&#xff09;之间。这是通过SUBSTRB和TO_CHAR函数实…

计算机毕业设计 | SSM 校园线上订餐系统 外卖购物网站(附源码)

1&#xff0c; 概述 1.1 项目背景 传统的外卖方式就是打电话预定&#xff0c;然而&#xff0c;在这种方式中&#xff0c;顾客往往通过餐厅散发的传单来获取餐厅的相关信息&#xff0c;通过电话来传达自己的订单信息&#xff0c;餐厅方面通过电话接受订单后&#xff0c;一般通…

Time-LLM :超越了现有时间序列预测模型的学习器

AI预测相关目录 AI预测流程&#xff0c;包括ETL、算法策略、算法模型、模型评估、可视化等相关内容 最好有基础的python算法预测经验 EEMD策略及踩坑VMD-CNN-LSTM时序预测对双向LSTM等模型添加自注意力机制K折叠交叉验证optuna超参数优化框架多任务学习-模型融合策略Transform…

纷享销客集成平台(IPaaS)解决方案

针对传统对接方式中的痛点&#xff0c;集成平台提炼了一套成熟的解决方案和配套工具。 痛点&#xff11;&#xff1a;编码工作量大。 每个功能点&#xff0c;和众多的容错分支&#xff0c;都需要逐行编码实现。日志打少了影响问题排查&#xff0c;打多了浪费大量存储。 集成…

Django里的ModelForm组件

ModelForm组件 自动生成HTML标签 自动读取关联数据表单验证 错误提示数据库进行&#xff1a;新建&#xff0c;修改 步骤如下&#xff1a; 创建类 # 在 views.py 文件里# 创建一个类 class AssetModelForm(forms.ModelForm):class Meta:model models.AssetSet #fields [n…

k8s 对外服务之 Ingress(HTTPS/HTTP 代理访问 以及Nginx 进行 BasicAuth )

目录 一 Ingress HTTP 代理访问虚拟主机 &#xff08;一&#xff09;原理 &#xff08;二&#xff09;实验 1&#xff0c;准备 2&#xff0c;创建虚拟主机1资源 3&#xff0c;创建虚拟主机2资源 4&#xff0c;创建ingress资源 5&#xff0c;查看相关参数 6&#xff0…

Python变量符号:深入探索与实用指南

Python变量符号&#xff1a;深入探索与实用指南 在Python编程的世界中&#xff0c;变量符号扮演着至关重要的角色。它们不仅是存储数据的容器&#xff0c;更是构建复杂逻辑和算法的基础。然而&#xff0c;对于初学者来说&#xff0c;Python的变量符号可能会带来一些困惑和挑战…

【文末附gpt升级秘笈】埃隆·马斯克芯片调配策略对特斯拉股价的影响分析

埃隆马斯克芯片调配策略对特斯拉股价的影响分析 一、引言 在现代商业环境中&#xff0c;企业间的资源调配与策略布局往往对其股价产生深远影响。据外媒CNBC报道&#xff0c;埃隆马斯克在芯片资源分配上的决策引起了业界的广泛关注。他秘密要求英伟达将原本预留给特斯拉的高端…

如何为律师制作专业的商务名片?含电子名片二维码

律师关注细节&#xff0c;律师名片也不例外。它们不仅仅是身份的象征&#xff0c;更是律师专业形象的代表&#xff0c;传递专业知识和信任。今天就来和我们一起来看看制作律师商务名片的注意事项&#xff0c;以及如何制作商务名片上的电子名片二维码&#xff1f; 一、名片的主…

【Text2SQL】评估 LLM 的 Text2SQL 能力

论文&#xff1a;Evaluating the Text-to-SQL Capabilities of Large Language Models ⭐⭐⭐⭐ arXiv:2204.00498 一、论文速读 本论文尝试了多种 prompt 结构&#xff0c;并且评估了他们在 Codex 和 GPT-3 上的表现。下面介绍这些 prompt 结构&#xff1a; 二、不同的 prom…

Hive 面试题(二)

1. 简述Hive如何实现分区 &#xff1f; Hive中的分区是一种数据组织方式&#xff0c;它允许用户将表中的数据分割成不同的部分&#xff0c;每个部分称为一个分区。分区的主要目的是提高查询性能和数据管理的效率。以下是Hive实现分区的步骤和概念&#xff1a; 1. 创建分区表 …

优思学院|谈汽车零部件企业生产精益及现场管理

精益生产&#xff08;Lean Production&#xff09;和现场管理作为现代制造企业的核心管理理念&#xff0c;正在越来越多的企业中得到应用。尤其是在中国&#xff0c;许多汽车零部件企业通过精益管理和六西格玛方法&#xff0c;显著提高了生产效率&#xff0c;降低了生产成本&am…

过渡属性 height 设置 auto 不起作用

transition 在过渡时 无法将 auto 转换为 px&#xff0c;所以设置必须是具体数值&#xff0c;否则没有过渡效果 解决办法 操作 dom 对具体的数值进行转换 <div class"card-detail" v-for"(item, index) in 2" :key"index"><div class…

15.FreeRTOS 消息缓存 Message Buffer

FreeRTOS 消息缓存&#xff08;Message Buffer&#xff09;的使用 介绍 在实时操作系统&#xff08;RTOS&#xff09;中&#xff0c;任务之间的通信是一个非常重要的方面。FreeRTOS 提供了多种机制来实现任务间通信&#xff0c;其中之一就是消息缓存&#xff08;Message Buffe…

大数据之CDH对Hdfs做Balance数据均衡/数据平衡/数据倾斜

问题的来源: 由于在hive工具运行sql,出现sql卡顿的情况,去cdh上查看yarn资源的分布情况,发现了整个cdh平台中hdfs和yarn资源分布不均匀,大量的爆红显示: 以下 DataNode 数据目录 位于小于其可用空间 10.0 吉字节 的文件系统中。 /data1/dfs/dn&#xff08;可用&#xff1a;7.2 …

C++的类和new和delete和菱形继承机制

文章目录 参考虚函数使用虚函数的class结构相关实现源码IDA反编译子类虚表和父类虚表调用函数菱形继承 参考 https://showlinkroom.me/2017/08/21/C-%E9%80%86%E5%90%91%E5%88%86%E6%9E%90/ https://www.cnblogs.com/bonelee/p/17299985.html https://xz.aliyun.com/t/5242?t…

hadoop疑难问题解决_NoClassDefFoundError: org/apache/hadoop/fs/adl/AdlFileSystem

1、问题描述 impala执行查询&#xff1a;select * from stmta_raw limit 10; 报错信息如下&#xff1a; Query: select * from sfmta_raw limit 10 Query submitted at: 2018-04-11 14:46:29 (Coordinator: http://mrj001:25000) ERROR: AnalysisException: Failed to load …