Go语言(或 Golang)起源于 2007 年,并在 2009 年正式对外发布。Go 是非常年轻的一门语言,它的主要目标是“兼具 Python 等动态语言的开发速度和 C/C++ 等编译型语言的性能与安全性”。
Go语言是编程语言设计的又一次尝试,是对类C语言的重大改进,它不但能让你访问底层操作系统,还提供了强大的网络编程和并发编程支持。Go语言的用途众多,可以进行网络编程、系统编程、并发编程、分布式编程。
Go语言的推出,旨在不损失应用程序性能的情况下降低代码的复杂性,具有“部署简单、并发性好、语言设计良好、执行性能好”等优势,目前国内诸多 IT 公司均已采用Go语言开发项目。
Go语言有时候被描述为“C 类似语言”,或者是“21 世纪的C语言”。Go 从C语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等很多思想,还有C语言一直所看中的编译后机器码的运行效率以及和现有操作系统的无缝适配。
因为Go语言没有类和继承的概念,所以它和 Java 或 C++ 看起来并不相同。但是它通过接口(interface)的概念来实现多态性。Go语言有一个清晰易懂的轻量级类型系统,在类型之间也没有层级之说。因此可以说Go语言是一门混合型的语言。
此外,很多重要的开源项目都是使用Go语言开发的,其中包括 Docker、Go-Ethereum、Thrraform 和 Kubernetes。
Go 是编译型语言(也是静态类型语言)
Go 使用编译器来编译代码。编译器将源代码编译成二进制(或字节码)格式;在编译代码时,编译器检查错误、优化性能并输出可在不同平台上运行的二进制文件。要创建并运行 Go 程序,程序员必须执行如下步骤。
-
使用文本编辑器创建 Go 程序;
-
保存文件;
-
编译程序;
-
运行编译得到的可执行文件。
这不同于 Python、Ruby 和 JavaScript 等语言,它们不包含编译步骤。Go 自带了编译器,因此无须单独安装编译器。
变量的数据类型
每一种数据都定义了明确的数据类型,在内存中分配了不同大小的内存空间
一、整数类型
整数的使用细节
1)Golang各整数类型分为:有符号
和无符号
,int、unit的大小和系统有关
2)Golang的整型默认声明是int型
3)如何在程序中查看某个变量的字节大小
和数据类型
示例如下:
var n2 = 522
fmt.Println("n2的字节大小是:",unsafe.Sizeof(n2))//8
fmt.Printf("n2的类型是:%T",n2)//int
4)Golang程序中,整型变量在使用时,遵守保小不保大原则
,即:在保证程序正确运行下,尽量使用占用空间小的数据类型(如:年龄)
5)bit:计算机中的最小存储单位,byte:计算机中基本的存储单元。(1byte=8bit)
二、浮点类型
说明:
1)关于浮点数在机器中存放形式的简单说明:
浮点数=符号位+指数位+尾数位
2)尾数比分可能丢失,造成精度损失。如:123.0000901 示例如下:
var h = 123.0000901
fmt.Println(float32(h))//123.00009
fmt.Println(float64(h))//123.0000901
3)浮点型的存储分为三部分:符号位+指数位+尾数位,在存储的过程中,精度会丢失
浮点数的使用细节
1)Golang中的浮点类型有固定的范围和字段长度,不受具体的系统的影响
2)Golang的浮点型默认声明为float64类型
3)浮点型常量有两种表示形式:
1、十进制数
2、科学计数法
4)通常情况下,应该使用float64,因为它比float32更准确
三、字符类型
Golang中没有专门的字符类型,如果要存储单个字符(字母),一般使用byte来保存
字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的。也就是说对于传统的字符串是由字符组成的,而Go的字符串不同,它是由字节组成的
代码示例:
var c1 byte = 'a'//注意此处要使用单引号,使用双引号会报错
var c2 byte = '0'
fmt.Println("c1=",c1,"c2=",c2)//c1=97,c2=48 直接输出byte值,就是输出了字符对应的码值
fmt.Printf("c1=%c,c2=%c",c1,c2)//c1=a,c2=0 格式化输出,输出的就是对应的字符
var c3 int = 120
fmt.Println("c3",c3)//120
fmt.Printf("c3=%c",c3)//x
var c3 int = 22269
fmt.Println("c4",c4)//22269
fmt.Printf("c4=%c",c4)//国
注意:如果我们保存的字符对应的码值大于255,这时我们可以使用int类型保存
如:var c3 byte="北"
报错,修改为var c3 int="北"
即可。
字符类型的使用细节
1)字符常量是用单引号括起来的单个字符
2)Go中允许使用转义字符"\"来将其后的字符转变为特殊字符型常量。如:var char byte='\n'
3)Go语言中的字符使用UTF-8编码
4)在Go中,字符的本质是一个整数,直接输出时,是该字符对应的UTF-8编码的码值
5)可以直接给某个变量赋一个数字,然后按格式化输出时%c,会输出该数字对应的unicode字符
6)字符类型是可以进行运算的,相当于一个整数,因为它都对应有Unicode码。
例:
var c6 int = 10+'a'
fmt.Println("c6=",c6)//107
字符类型本质探讨
1)字符型存储到计算机中,需要将字符对应的码值(整数)找出来
存储: 字符-->对应码值-->二进制-->存储
读取: 二进制-->码值-->字符-->读取
2)字符和码值的对应关系是通过字符编码表决定的
3)Go语言的编码都统一成了utf-8,非常的方便、统一,再也没有编码乱码的困扰了
四、布尔类型
1)布尔类型也叫bool类型,bool类型数据只允许取值true和false 2)bool类型占1个字节 3)boolean类型适于逻辑运算,一般用于程序流程控制
五、字符串类型string
字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的。Go语言的字符串的字节使用UTF-8编码标识Unicode文本
字符串类型的注意事项和使用细节
1)Go语言的字符串的字节使用UTF-8编码标识的Unicode文本,这样Golang统一使用UTF-8编码,就不会再有乱码问题的困扰
2)字符串一旦赋值,就不能修改了,在Go中字符串是不可变的
。
例:
var str string = "hello world"
str[0] = "A"//报错
fmt.Println(str)
3)字符串的两种表示形式
(1)双引号,会识别转义字符
(2)反引号,以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果
基本数据类型默认值
数据类型 | 默认值 |
---|---|
整型 | 0 |
浮点型 | 0 |
字符串 | "" |
布尔类型 | false |
在Go语言中,指针、切片、映射、通道、函数和接口的零值则是 nil |
基本数据类型的转换
1)Go中,数据类型的转换可以从表示范围小-->表示范围大,也可以从范围大-->范围小
2)被转换的是变量存储的数据
(即值),变量本身的数据类型并没有变化
3)在转换中,比如将int64转换成int8,编译时不会报错,只是转换的结果是按溢出处理
例:
var i int = 100
var n1 float32 = float32(i)
var n2 int8 = int8(i)
var n3 int64 = int64(i)//低精度-->高精度
fmt.Printf("n1的值为:%v,n2的值为:%v,n3=%v\n",n1,n2,n3)//n1的值为:100,n2的值为:100,n3=100 fmt.Printf("i的类型是%T",i)//int
//在转换中,比如将int64转为int8,编译时不会报错,只是转化的结果是按溢出处理
var n4 int64 = 999999
var n5 int8 = int8(n4)
fmt.Printf("n5=%v",n5) //n5=63
基本数据类型和string的转换
在程序开发中,我们经常需要将基本数据类型转换成string类型,或者将string类型转成基本数据类型
基本类型转string类型
方式1:fmt.Sprintf("%参数",表达式)
例:
var num1 int = 99
var num2 float64 = 23.456
var num3 bool = true
var num4 byte = 'h'
var str string
str = fmt.Sprintf("%d",num1)
fmt.Println("str=",str)//str= 99
fmt.Printf("%T %q",str,str)//string "99"
str = fmt.Sprintf("%f",num2)
fmt.Println("str=",str)//str= 23.456000
fmt.Printf("%T %q",str,str)//string "23.456000"
str = fmt.Sprintf("%t",num3)
fmt.Println("str=",str)//str= true
fmt.Printf("%T %q",str,str)//string "true"
str = fmt.Sprintf("%c",num4)
fmt.Println("str=",str)//str= h
fmt.Printf("%T %q",str,str)//string "h"
//%d表示为十进制
//%f表示有小数部分但无指数部分
//%t表示单词true或false
//%T:值的类型的Go语法表示
//%q:该值对应的单引号括起来的go语法字符字面值,必要时会采用安全的转义表示
方式2:使用strconv函数
1)strconv.FormatInt(i int64,base int):返回i的base进制的字符串表示
2)strconv.FormatUint(i uint64,base int):返回i的base进制的字符串表示,是FormatInt的无符号整数版本 3)strconv.FormatFloat(f float64,fmt byte,prec,bitSize int):返回浮点数表示的字符串 4)strconv.FormatBool(b bool):根据b的值返回true或者false
示例:
var num5 int = 99
var num6 float64 = 23.456
var num7 bool = true
var num8 uint = 100
var str string
str = strconv.FormatInt(int64(num5),10) //返回num5的10进制的字符串表示
fmt.Println("str=",str)//str= 99
fmt.Printf("%T %q",str,str)//string "99"
str = strconv.FormatFloat(float64(num6),'f',10,64)
//f表示格式只能用单引号引起来,10表示精度即小数位保留10位,64表示这个小数是float64
fmt.Println("str=",str)//str= 23.4560000000
fmt.Printf("%T %q",str,str)//string "23.4560000000"
str = strconv.FormatBool(num7)
fmt.Println("str=",str)//str= true
fmt.Printf("%T %q",str,str)//string "true"
str = strconv.FormatUint(uint64(num8),10)
fmt.Println("str=",str)//str= 100
fmt.Printf("%T %q",str,str)//string "100"
未完待续。。。
参考:
尚硅谷(B站)