我的Go+语言初体验——(3)Go+ 语言数据类型

我的Go+语言初体验——(3)Go+ 语言数据类型

“我的Go+语言初体验” | 征文活动进行中…

Go+ 语言刚刚发布,网络上还很难找到各种的支持文档和编程指南,使初学者很难深入地进行学习。
本文结合官方文档与 Go 语言的技术资料,介绍 Go+ 数据类型与基本运算符。全文内容已在 Go+ 环境下进行了测试。


1. Go+ 基本数据类型

数据类型是程序设计中重要的基本概念。在程序设计语言中,采用数据类型来描述程序中的数据结构、数据范围和数据在内存中的存储分配。

Go+ 对于数据类型有严格的定义,相同类型的值才能进行比较,兼容类型的值才能进行运算。

  • 如果值的类型是接口(interface),必须实现相同的接口。
  • 如果一个值是常量,那么另一个值必须与该常量的类型兼容。

1.1 布尔类型

布尔型的值只能是常量 true 或者 false。未初始化的布尔变量的初值为 false。

布尔型无法参与数值运算,也无法与其他类型进行转换。

【例程 1】

var v1 bool = true

1.2 数字类型

Go+ 语言支持整型和浮点型数字,数字类型包括:整型 int 和浮点型 float32、float64。

Go+ 语言引入了有理数类型,用后缀 “r” 表示有理数,可以支持大整数运算,包括:bigint、bigrat、bigfloat。

例如: (1r << 200) 表示 bigint ,其值等于 2 的 65 次幂;4/5r 表示有理常数 4/5。

// 有符号整数
int8 (-128 ~ 127)
int16 (-32768 ~ 32767)
int32 (-2,147,483,648 ~ 2,147,483,647)
int64 (-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807)
int (32位操作系统上 32 位,64位操作系统 64)// 无符号整数
uint8 (0 ~ 255)
uint16 (0 ~ 65,535)
uint32 (0 ~ 4,294,967,295)
uint64 (0 ~ 18,446,744,073,709,551,615)
uint (32位操作系统上 32 位,64位操作系统 64)// 浮点型
float32 (+/- 1e-45 ~ +/- 3.4*1e38)
float64 (+/- 5*1e-324 ~ +/- 107*1e308// 复数,用 "re+im I" 表示
complex64 (32 位实数和虚数)
complex128 (64 位实数和虚数)// 有理数,用后缀 "r" 表示
bigint  // 有理数整数
bigrat  //有理数分数
bigfloat  //有理数浮点数

Go+ 语言使用 var 关键字进行变量声明。

【例程 2】

package main
import "fmt"func main() {// 变量声明和初始化var v1 int = -1                 //声明一个整型变量 v1var v2 uint = 10                //声明一个无符号整型变量 v2var v3 float64 = 3.14           //声明一个浮点型变量 v3var v4 complex64 = -1.0 + 3.14i //声明一个复数变量 v4var v5 bigint = 1r << 65        // 声明一个有理数变量 v5var v6 bigrat = 4/5r            // 声明一个有理数变量 v6// 输出fmt.Println("整型变量 v1: ", v1)fmt.Println("无符号整型变量 v2: ", v2)fmt.Println("浮点型变量 v3: ", v3)fmt.Println("复数变量 v4: ", v4)fmt.Println("有理数变量 v5: ", v5)fmt.Println("有理数变量 v6: ", v6)
}

程序运行结果:

整型变量 v1: -1
无符号整型变量 v2: 10
浮点型变量 v3: 3.14
复数变量 v4: (-1+3.14i)
有理数变量 v5: 36893488147419103232
有理数变量 v6: 4/5


1.3 字符类型

Go+ 语言的字符类型包括: byte 类型(uint8 类型)和 rune 类型(int32 类型)。

uint8 类型( byte 类型)用 “\x” + 2位16进制数表示,表示 ASCII 码字符;rune 类型用"\u" + 4位16进制数表示,表示 UTF-8 码字符,可以处理中文、日文或复合字符。

【例程 3】

package main
import "fmt"func main() {// 变量声明和初始化var ch1 byte = '\x4C'   // "\x" + 2位16进制数表示var ch2 uint = 36       // 等价于 ASCII 数字var ch3 rune = '\u004C' // "\u" + 4位16进制数表示var ch4 int32 = '\u03B3'var ch5 int = '\U00101024'// 输出fmt.Printf("%d - %d\n", ch1, ch2)           // integerfmt.Printf("%c - %c\n", ch1, ch2)           // characterfmt.Printf("%d - %d - %d\n", ch3, ch4, ch5) // integerfmt.Printf("%c - %c - %c\n", ch3, ch4, ch5) // characterfmt.Printf("%X - %X - %X\n", ch3, ch4, ch5) // UTF-8 bytesfmt.Printf("%U - %U - %U", ch3, ch4, ch5)   // UTF-8 code point
}

程序运行结果:

76 - 36
L - $
76 - 947 - 1052708
L - γ - 􁀤
4C - 3B3 - 101024
U+004C - U+03B3 - U+101024


1.4 字符串类型

字符串是一串固定长度的字符连接而成的字符序列。

字符串的值是用双引号中 ” ” 包括的内容,多行字符串使用反括号 ``表示。

【例程 4】

package main
import "fmt"func main() {// 变量声明和初始化var s1 string = "hello Go+!"var s2 string = "你好"var s3 string = `
Line 1
Line 2
Line 3`// 输出fmt.Printf("%s\n", s1)fmt.Printf("%s\n", s2)fmt.Printf("%s\n", s3)
}

程序运行结果:

hello Go+!
你好

Line 1
Line 2
Line 3



2. Go+ 扩展数据类型

2.1 指针类型

Go+ 语言的指针类型和 C/C++的指针类型用法相同,使用 “&(普通变量)” 对普通变量取内存地址后,得到指针变量,其类型为 *T,即 T 的指针类型。

针对 C/C++ 在指针运算和内存释放上的问题,Go+ 语言对指针增加了一些限制:

  • 不同类型的指针不能互相转换,例如 int, int32 与 int64 类型的指针不能互相转换
  • 任何普通指针类型 *T和 uintptr 之间不能互相转换
  • 指针变量不能进行运算,例如不能对指针进行 ++, – 操作

【例程 5】

package main
import "fmt"func main() {// 定义指针变量vint := 1    // 定义普通变量ptr := &vint // 定义指针变量fmt.Println("普通变量 vint:", vint)fmt.Println("普通变量 *ptr:", *ptr)fmt.Println("指针变量 &vint:", &vint)fmt.Println("指针变量 ptr:", ptr)vstr := "hello Go+"vbool := falsevrune := 'y'vfloat := 3.14fmt.Printf("vstr 的指针类型:%T\n", &vstr)fmt.Printf("vint 指针类型是:%T\n", &vint)fmt.Printf("vbool 指针类型是:%T\n", &vbool)fmt.Printf("vrune 指针类型是:%T\n", &vrune)fmt.Printf("vfloat 指针类型是:%T\n", &vfloat)// 空指针var p *stringfmt.Println(p)fmt.Printf("p的值是: %v\n", p)
}

程序运行结果:

普通变量 vint: 1
普通变量 *ptr: 1
指针变量 &vint: 0xc00000a088
指针变量 ptr: 0xc00000a088
vstr 的指针类型:*string
vint 指针类型是:*int
vbool 指针类型是:*bool
vrune 指针类型是:*int32
vfloat 指针类型是:*float64
<nil>
p的值是: <nil>


2.2 数组类型

数组是一系列同一类型数据的集合。数组也是一种数据类型,在 Go+ 语言中数组是值类型。

在 Go+ 语言中,数组类型由元素类型和数组长度两部分组成,数组长度在定义后不可更改。

数组类型定义的基本语法如下:

var 数组名 [数组大小]值的数据类型

【例程 6】

package main
import "fmt"func main() {// 数组声明var arrayBytes [10]byte                 // 声明长度为5的数组,每个元素为一个字节;var arrayPointer [2]*int                // 指针数组var array2Dimensional [2][3]int         // 二维数组var array3Dimensional [2][3][4]int      // 三维数组,等同于[2]([3]([4]int))var arrayString [5]string               // 字符串数组var arrayDynamic = [...]int{1, 2, 3, 4} // 动态数组声明时需要赋值fmt.Println(arrayBytes)        // [0 0 0 0 0 0 0 0 0 0]fmt.Println(arrayPointer)      // [<nil> <nil>]fmt.Println(array2Dimensional) // [[0 0 0] [0 0 0]]fmt.Println(array3Dimensional) // [[[0 0 0 0] [0 0 0 0] [0 0 0 0]] [[0 0 0 0] [0 0 0 0] [0 0 0 0]]]fmt.Println(arrayString)       // [    ]fmt.Println(arrayDynamic)      // [1 2 3 4]
}

程序运行结果:

[0 0 0 0 0 0 0 0 0 0]
[<nil> <nil>]
[[0 0 0] [0 0 0]]
[[[0 0 0 0] [0 0 0 0] [0 0 0 0]] [[0 0 0 0] [0 0 0 0] [0 0 0 0]]]
[ ]
[1 2 3 4]


2.3 切片类型

切片是 Go+ 中的数据类型,切片是基于数组类型的抽象,其长度可以改变,也称为可变数组。

切片类型定义的基本语法如下:

var 类型名[]值的数据类型

切片的原型为:

type Slice struct {
base *elemType // 指向0th元素的指针
len int // 切片中元素的数量
cap int // 切片可以容纳元素的数量
} 

【例程 7】

func main() {// 切片类型var slice []int        // 定义 int 类型切片slice = make([]int, 5) // 初始化切片,切片长度为5slice[0] = 9           // 向切片元素赋值var slice2 = []int{1, 2, 3, 4, 5} // 定义 int 类型切片并赋值var v [10]int             // 定义int类型长度为 10 的数组var slice3 []int = v[2:5] // 将数组 v 中的 2:5 元素赋值给切片array := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}slice4 := array[1:5]  //[]int{1,2,3,4}slice5 := slice4[4:7] //[]int{6,7,8}fmt.Println(slice)       // [9 0 0 0 0]fmt.Println(slice2)      // [1 2 3 4 5]fmt.Println(slice3)      // [0 0 0]fmt.Printf("slice4:%v,len:%d,cap:%d\n", slice4, len(slice4), cap(slice4)) // slice4:[2 3 4 5],len:4,cap:9fmt.Printf("slice5:%v,len:%d,cap:%d\n", slice5, len(slice5), cap(slice5)) // slice5:[6 7 8],len:3,cap:5
}

程序运行结果:

[9 0 0 0 0]
[1 2 3 4 5]
[0 0 0]
slice4:[2 3 4 5],len:4,cap:9
slice5:[6 7 8],len:3,cap:5


2.4 字典类型(map)

字典类型是由若干个 key:value 键值对组合形成的数据类型,key 和 value 可以有各自的数据类型。

字典类型的变量要经过初始化后才能赋值。

字典类型使用 map 关键字来声明,字典类型定义的基本语法如下:

var 类型名 map[key的数据类型]value的数据类型

【例程 8】

package main
import "fmt"func main() {// 字典类型var scores1 map[string]int = map[string]int{"student1": 90, "student2": 80}scores2 := map[string]int{"student1": 90, "student2": 80}scores3 := make(map[string]int)scores3["student1"] = 80scores3["student2"] = 85var scores4 map[string]int     // 声明字典类型 scoresscores4 = make(map[string]int) // 初始化字典scores4["student1"] = 90fmt.Println(scores1)  // map[student1:90 student2:80]fmt.Println(scores2)  // map[student1:90 student2:80]fmt.Println(scores3)  // map[student1:90 student2:80]fmt.Println(scores4)  // map[student1:90]
}

程序运行结果:

map[student1:90 student2:80]
map[student1:90 student2:80]
map[student1:90 student2:80]
map[student1:90]


2.5 结构体类型(struct)

与 C/C++ 语言类似,在 Go+ 语言中可以声明新的结构体类型,作为其它类型的属性或字段的容器。

结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。结构体类型是由一些列属性组成的复合数据类型 ,每个属性都具有名称、类型和值,结构体将属性组合在一起进行由程序进行处理。

结构体定义使用 typestruct 关键字来声明,需要指定其包含的属性(名和类型)。结构体类型定义的基本语法如下:

type 类型名 struct {

字段1 类型1

字段2 类型2

… }

其中 “类型名” 标识自定义结构体的名称,“字段1…” 表示结构体中的字段名,“类型1…” 表示结构体中的各个字段的类型。 同一个包内的类型名不能重复,一个结构体中的字段名不能重复。

在定义结构体时可以为结构体指定结构体名(命名结构体),用于后续声明结构体变量使用。

【例程 9】

package main
import "fmt"
type Book struct {title  stringauthor stringpress  stringprice  float64
}func main() {var book1 Book                // 初始化一个 Boook 实例, book1 是一本具体的书(Object)fmt.Println("book1: ", book1) // {title: author: press: price}book1 = Book{"Go+语言", "author", "GoPress", 80.0}fmt.Println("book1: ", book1) // {Go+语言 author GoPress 80}var book2 Book = Book{title:  "C语言程序设计",author: "谭浩强",press:  "高等教育出版社",price:  50.0, // 最后一个逗号","不能省略}fmt.Println("book2: ", book2) // {C语言程序设计 谭浩强 高等教育出版社 50}fmt.Println("book3: ", Book{title: "Go+ Programming Language", press: "IT Press"})// {Go+ Programming Language  IT Press 0}, 缺少的字段为 0 或 空
}

程序运行结果:

book1: { 0}
book1: {Go+语言 author GoPress 80}
book2: {C语言程序设计 谭浩强 高等教育出版社 50}
book3: {Go+ Programming Language IT Press 0}


2.6 接口类型(interface)

接口类型是 Go语言的一种数据类型。 接口类型是其它类型行为的概括与抽象, 它把所有的具有共性的方法定义在一起,任何其它类型只要实现了这些方法就是实现了这个接口。

接口是用来定义行为的类型。这些被定义的行为不由接口直接实现,而是由用户定义的类型实现,一个实现了这些方法的具体类型是这个接口类型的实例。

接口类型使用 typeinterface 关键字来声明。接口类型定义的基本语法如下:

/* 定义接口 */
type interface_name interface {
method_name1 [return_type]
...
method_namen [return_type]
}
/* 定义结构体 */
type struct_name struct {
/* variables */
}
/* 实现接口方法 */
func (struct_name_variable struct_name) method_name1() [return_type] {
/* 方法实现 */
}
...
func (struct_name_variable struct_name) method_namen() [return_type] {
/* 方法实现*/
}

2.7 nil 类型

任何类型的变量在初始化前都对应一个初值:布尔类型的初值为 false,整型的初值为 0,字符串类型的初值为"",而指针、数组、切片、字典、结构体和接口类型的初值都是 nil。



3. 总结

本文结合官方文档与 Go 语言的技术资料,介绍 Go+ 数据类型与基本运算符。

本文的大部分内容参考 Go 语言教程进行整理。全文内容和例程都已在 Go+ 环境下进行调试和运行测试。


【本节完】


版权声明:

原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/121619284)

Copyright 2021 youcans, XUPT

Crated:2021-11-29


欢迎关注『我的Go+语言初体验』系列,持续更新中…

我的Go+语言初体验——(1)超详细安装教程
我的Go+语言初体验——(2) IDE 详细安装教程
我的Go+语言初体验——(3)Go+ 数据类型

“我的Go+语言初体验” | 征文活动进行中…

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

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

相关文章

循环输出

使用foreach循环输出List中的数据 步骤详解&#xff1a; 1.数据库的设计和实现 2. Java代码的书写 3. jsp页面的显示 效果图展示 数据库数据 查询结果的显示 功能分析&#xff1a; 链接数据库查找数据库内容把这些内容放入List数组里面用session传递jsp页面获取session内…

我的Go+语言初体验——(4)零基础学习 Go+ 爬虫

我的Go语言初体验——&#xff08;4&#xff09;零基础学习 Go 爬虫 “我的Go语言初体验” | 征文活动进行中… Go 语言非常适合编写爬虫程序&#xff0c;具有并发机制完善、并发数量大、占用资源少、运行速度快、部署方便的优点。 本文结合官方文档与 Go 语言的资料&#xff…

latex的基本使用

LaTeX使用 LaTeX使用基本使用源文件的基本结构中文处理办法字体字号设置文章基本结构特殊字符处理图片的使用表格的使用Texstduio的导入表格功能会更快浮动体的使用数学公式初步矩阵的使用TexStudio里面的矩阵模板功能参考文献使用BibTex定义自己的命令 基本使用 sublime使用…

【OpenCV 例程300篇】48. 直方图处理之彩色直方图匹配

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程300篇】48. 直方图处理之彩色直方图匹配 图像直方图是反映图像像素分布的统计表。 灰度直方图是图像灰度级的函数&#xff0c;用来描述每个灰度级在图像矩阵中的像素个数。 直方图匹配又称为直方图规定化&a…

Vue的安装和配置

Vue是目前最流行的前端框架之一&#xff0c;给大家讲一下如何安装和配置Vue环境。 网上也有许多关于安装和配置Vue的教程&#xff0c;但是他们的方法太过于麻烦了&#xff0c;而且对于初学者来说对网上的一些安装和配置Vue的方法不理解&#xff0c;看了之后还是没有一点思绪&a…

【OpenCV 例程300篇】49. 直方图处理之局部直方图处理(cv2.createCLAHE)

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程300篇】49. 直方图处理之局部直方图处理&#xff08;cv2.createCLAHE&#xff09; 图像直方图是反映图像像素分布的统计表。 灰度直方图是图像灰度级的函数&#xff0c;用来描述每个灰度级在图像矩阵中的像素…

ResNet网络详解与keras实现

ResNet网络详解与keras实现 ResNet网络详解与keras实现Resnet网络的概览Pascal_VOC数据集第一层目录第二层目录第三层目录 梯度退化Residual LearningIdentity vs Projection ShortcutsBottleneck architectureResnet网络构建表ResNet论文结果为了搭建Resnet网络我们使用了以下…

简易计算器

用JavaScript实现简易计算器 先看效果图 计算加法弹框输出计算结果 程序解读&#xff1a; 1.两个输入框和一个下拉框 2. 弹框显示结果 3. 加减乘除的简单运算 代码演示 Html页面内容 <!DOCTYPE html> <html><head><meta charset"utf-8">…

【OpenCV 例程300篇】50. 直方图处理之直方图统计量图像增强

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程300篇】50. 直方图处理之直方图统计量图像增强 图像直方图是反映图像像素分布的统计表。 灰度直方图是图像灰度级的函数&#xff0c;用来描述每个灰度级在图像矩阵中的像素个数。 直方图统计量图像增强&…

在大数据时代下金融风控的分类

Date&#xff1a;2018-05-24 Author&#xff1a;等等 依托城市数据湖海量数据资源&#xff0c;尤其是在信贷领域对企业或者个人的个人信贷画像描述评判准则已经是第三方房贷企业或者银行对借贷人的评分标准。风控建模以数据价值挖掘为导向&#xff0c;吸纳大量数据、人工智能科…

多功能标准型计算器

实现一个标准型计算器及其各项功能的实现 效果图欣赏 是不是看起来很漂亮的呢&#xff1f;&#xff1f;&#xff1f; 功能详解&#xff1a; 屏幕显示输入的数字和符号实现加减乘除运算回退和清零功能小数的运算结果的输出 相信小伙伴们都已经迫不及待的想要知道源码了。 代…

【OpenCV 例程200篇】51. 直方图处理之直方图反向追踪(cv2.calcBackProject)

『youcans 的 OpenCV 例程300篇 - 总目录』 【OpenCV 例程200篇】51. 直方图处理之直方图反向追踪&#xff08;cv2.calcBackProject&#xff09; 图像直方图是反映图像像素分布的统计表。 灰度直方图是图像灰度级的函数&#xff0c;用来描述每个灰度级在图像矩阵中的像素个数。…

【转需】【金融干货】四步教你:开发风控模型?

一、市场调研 目前市面主流的风控模型 1、互联网金融前10名排行榜(数据截止日期2017-09-12) 互联网金融公司排名分别是蚂蚁金服、陆金所、京东金融、苏宁金融、百度金融、腾讯理财通、宜信、钱大掌柜、万达金融和网易理财。 1.1 蚂蚁金服 1.1.1 大数据技术对接第三方征信公司芝…

推箱子

推箱子小游戏原理的实现 功能分析&#xff1a; 1.找一张类似于箱子的图片自行设置图片的大小 2.设置控制箱子移动的四个方向的按钮 3.使用键盘控制图片上下左右的移动、 效果图演示 原始位置 点击键盘向右移动三次向下移动一次后的位置 看了上述过程是不是感觉很有意思呀&…

我的Go+语言初体验——(5)Go+ 基本语法之 Switch

我的Go语言初体验——&#xff08;5&#xff09;Go 基本语法之 Switch “我的Go语言初体验” | 征文活动进行中… Go 语言中提供多路分支条件语句 switch&#xff0c; 用于在不同条件下执行不同动作。 使用 if-else 嵌套结构也可以实现多路分支条件结构&#xff0c;但程序冗长…

java web 开发之写在前面(0)

java是sun公司&#xff08;现在属于Oracle公司&#xff09;推出的能够跨越多平台的、可以执行最高的一种面向对象的编程语言&#xff0c;也是目前最先进、特征最丰富、功能最强大的计算机语言。利用java可以编写桌面应用程序&#xff0c;web应用程序、分布式系统、嵌入式系统程…

【OpenCV 例程200篇】52. 图像的相关与卷积运算

【OpenCV 例程200篇】52. 图像的相关与卷积运算 欢迎关注 『OpenCV 例程200篇』 系列&#xff0c;持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列&#xff0c;持续更新中 滤波通常是指对图像中特定频率的分量进行过滤或抑制。图像滤波是在尽可能保留图像细节特征的条件…

java web 之 网页前端开发基础(1)

1.HTML&#xff08;Hypertext Markup Language&#xff0c;HTML&#xff0c;超文本标记语言&#xff09; 1.1 创建第一个HTML文件 编写html语言可以通过两种方式&#xff0c;一种是手工编写html代码&#xff0c;一种是借助一些开发软件&#xff0c;如Dreamweaver或者微软公司…

文本框为空按钮不可点击

在form表单的提交中判断输入框的内容是否为空&#xff0c;如果输入框的内容为空则按钮不可点击&#xff0c;只有当输入框的内容不为空时才能点击并执行之后的提交等操作。 效果图演示 输入框为空&#xff08;按钮不可点击&#xff0c;点击无效果&#xff09; 输入框不为空时…

【youcans 的 OpenCV 学习课】7. 空间域图像滤波

专栏地址&#xff1a;『youcans 的图像处理学习课』 文章目录&#xff1a;『youcans 的图像处理学习课 - 总目录』 【youcans 的 OpenCV 学习课】7. 空间域图像滤波 图像滤波是在尽可能保留图像细节特征的条件下对目标图像的噪声进行抑制&#xff0c;是常用的图像预处理操作。 …