注意点:因为本人在同时学习C++和GO,所以需要使用例子区别时,会优先使用C++区别,而且二则直接还是有许多相识之处的。如果想知道它和Java之间的区别可以自行百度。
1、整数
1.1有符号整数:int8、int16、int32、int64(后面的数字代表占多少位)
1.2无符号整数:uint8、uint16、uint32、uint64
1.3常用的两个int(有符号)、uint(无符号)
它们所占位数取决于编译环境,但二则所占位数相同。
1.4rune类型:int32的同义词,用于指明该值为Unicode码点
byte类型:int8的同义词,强调一个值为原始数据
注:可以通过type为数据类型重新命名,例如
type myint int;
此时myint和int具有相同的结构,但是不能相互运算。
关于运算:(C++也是如此)
(1)Go语言取模结果的正负性与被除数一致,例如-5%-3 = -5%3 = -2;
(2)无论是无符号还是有符号,当发生溢出时,溢出的高位会被直接丢弃;
2、浮点数和复数
2.1浮点数
浮点数有两种:float32和float64(无double类型),其算术特性遵从IEEE754标准
2.2复数
复数也是两种:complex64和complex128,二者分别由float32和float64构成
关于复数:数学形式为 x+yi (高中数学学过,其中i*i=-1)
通过内置函数:
complex构造复数,real提取实部,imag提取虚部
package main import "fmt" func main() { x := complex(1, 2); fmt.Println(x)//输出 (1+2i) fmt.Println(real(x))//输出 1 fmt.Println(imag(x))//输出 2 }
3、布尔值
true和false(与C++相同)
4、字符串(重点,这里和C++有很大区别)
4.1不可变:不可改变的字符串
所以字符串的内部数据不允许修改:s[0]='H' //编译错误:s[0]无法复制
(而C++明显可以修改)
但是为什么可以进行+=操作在字符串后面添加字符串?
答:这并不会改变原来字符串的数据,只是将+=语句生成的新字符串赋予给字符串
不可变的好处?
答:不可变意味着两个字符串能安全地共用同一段底层内存,使复制任何长度字符串的开销都低廉。举例说明:字符串和其子串可以安全的共享数据,因此子串的开销低廉,因为它们会共享底层字节数组。
(补充:子串是连续的,子序列可以不连续)
4.2内置函数
len:返回字符串的字节数 例子:x := len(s) //x的值为s的字节数
(补充说明:字符串第i个字节不一定是第i个字符,因为非ASCII字符的UTF-8码点需要两个或者多个字节)
s[i,j]:s为字符串变量,用于获取i->j的子串。(补充说明:该子串包括i,不包括j)
s := "helloworld" fmt.Println(s[0:5])//输出 hello fmt.Println(s[1:5])//输出 ello
(补充说明:Go的源文件总是按UTF-8编码,并且习惯上Go的字符串会按UTF-8解读)
4.3关于字符串的修改
一般情况下会选择先转化为slice,在slice上修改后重新赋值给字符串
5、常量和iota
5.1常量(const)例:const pi = 3.1415926
注意点:当使用const声明一组常量,除第一项外,其他项可以不赋值,这意味着会复用前面一项的数据和类型。例如:
const( data1 = 1 data2 data3 = 1.1 data4 )
那么这里的 data2=1,data4=1.1
5.2常量生成器iota
const ( day1=iota //0 day2 //1 day3 //2 day4 //3 day5 //4 day6 //5 day7 //6 )
5.3无类型常量
Go语言的常量有个不同寻常之处。虽然一个常量可以有任意一个确定的基础类型,例如int,但是许多常量并没有一个明确的基础类型。编译器为这些没有明确基础类型的数字常量提供比基础类型更高精度的算术运算,但是当赋值给特定类型时精度会有影响。而且只有常量可以是无类型的。根据《GO程序设计语言》中表示,可以认为它们的精度至少达到256位。
6、数据的Printf输出形式
注意:Go语言的fmt包中有三种输出函数分别是:
(1)fmt.Print和fmt.Println:二则的区别是后者会自动换行,其他的和C++的cout基本一致
(2)fmt.Printf:可以支持二进制、八进制等等形式的输出,和C语言的printf基本一致
注意区别使用,关于Printf的输出格式如下:
二进制:%b 八进制:%o 十进制:%d 十六进制:%x
字符:%c 带引号的字符:%q
浮点数:%g、%e(有指数)、%f(无指数)
补充一组fmt包中好玩的函数fmt.Sprintf(),fmt.Sprint(),fmt.Sprintln()
作用:将对应的输出结果转化为字符串返回
用处之一:很方便的把数字转化成字符串
sx := "こんにちは" fmt.Println(sx)//输出:こんにちは nsx := fmt.Sprintf("sx=%s", sx) fmt.Println(nsx)//输出:sx=こんにちは
字符串转化成数字:
s = "12334" nums, _ := strconv.Atoi(s) fmt.Println(nums)
注意导入strconv包,而且Atoi有两个返回值,第二个返回值用于判断是否转化成功
如果第二个值为nil则成功,否则则失败