标识符
例如变量名、常量名、函数名等等。 Go语言中标识符由字母数字和_(下划线)组成,并且只能以字母和_开头。例如abc,_ ,_123,a123。
基本数据类型
Go语言中有丰富的数据类型,除了基本的整型、浮点型、复数、布尔型、字符串、byte、rune外,还有数组、切片、结构体、函数、map、通道(channel)等。
这些类型都在builtin.go文件中,这个包含go的预声明定义包含常用的各种类型和方法声明,包括变量和常量两部分,大家可以自己查阅一下。
整型
有符号(带正负的)整型:int8(0-2^8-1以此类推)、int16、int32、int64
无符号(只有正)整型:uint8(-128-127总共2^8个以此类推)、uint16、uint32、uint64
默认的有无符号整型类型为int和unit;
int有点特殊它是根据你电脑操作系统来区分是几位的
32位操作系统上就是int32,64位操作系统上就是int64;
unit类似
浮点型
float32和float64
//打印π的前两位
fmt.Printf("%.2f\n", math.Pi)
复数
关于什么是复数的问题,这是初中的东西老子忘了,不过分吧。
complex64和complex128
var c1 complex64
c1 = 1 + 2i
var c2 complex128
c2 = 2 + 3i
复数有实部(就是整数那部分)和虚部(就是×i那部分),complex64的实部和虚部为32位,complex128的实部和虚部为64位。
布尔
true和false没什么好说的
字符串
这里看到string,想必学java的大家可能会有点疑问,其实严格意义上来说go不算是面向对象语言,官方给出的解释则是Yes and no,没错是又不是,这里留个彩蛋等我们之后的文章会更新。
字符串内部用UTF-8编码
var name string = “孙嵓”
byte和rune
byte 类型,代表了ASCII码的一个字符,本质是一个unit8。
rune类型,代表一个 UTF-8字符,本质是个int32。
给我的感觉就是java的char类型,好理解一点。。。
遍历字符串
str := “hello北京”
for _ , r:= range str{
fmt.Println®
}
for i , r:= range str{
fmt.Println(i,string®)
}
//不加string()强转将输出unicode值,最终打印效果
0 h
1 e
2 l
3 l
4 o
5 北
8 京
知识点:range
range关键字用于for循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在字符串、数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。
关于基本类型先分享到这其他的类型在后续碰到了我们在详细讨论。
类型转化
强制类型转换
表达式:
类型(表达式)
//例如float64与int之间的转换
var a int = 1
b := int(float64(a))
例子修改字符串:
func changeString() {
s1 := “big”
// 强制类型转换
byteS1 := []byte(s1)
byteS1[0] = ‘p’
fmt.Println(string(byteS1))
s2 := “孙嵓”
runeS2 := []rune(s2)
runeS2[0] = ‘牛’
fmt.Println(string(runeS2))
}
int与string相互转换(很常用very关键)
需要引入strconv包,此包主要用于基本数据类和其字符串表示的相互转换。
- int转string
n := 1
//第一种
fmt.Sprintf("%d",n)
//第二种
//翻看源码查看其实就是调用的FormatInt,内部将int转成了int64
strconv.Itoa(n)
//第三种
//必须是64位int类型,第二个参数是几进制
var n int64 = 1
strconv.FormatInt(n,10) - string转int
x, _ := strconv.Atoi(n2)
//这个方法我们可以点进源码
b: = “1”
z, _ := strconv.ParseInt(b,10,32)
//源码是这样的
//@param s 字符串表示的整数值
//@param base (2-36进制)base为0,则会从字符串前置判断,"0x"是16进制,"0"是8进制,否则是10进制
//@param bitSize 整数类型(0、8、16、32、64 分别代表 int、int8、int16、int32、int64)
func ParseInt(s string, base int, bitSize int) (i int64, err error) {
…
}
注意:如果语法有误,err.Error = ErrSyntax;如果结果超出类型范围err.Error = ErrRange,作为出参返回
变量和常量
Go语言中的变量需要声明后才能使用,同一作用域内不支持重复声明,并且Go语言变量声明后必须使用。
变量声明及初始化
以关键字var开头(与js类似),变量类型放在变量后,行尾不需要分号
var 变量名 变量类型
//例如
var name string = “孙嵓”
//也可初始化多个变量
var name, age = “孙嵓”, 18
go还支持批量变量声明
var (
sex = “男”
height = 188
)
go支持短变量声明,注意此类声明只针对函数内部的局部变量使用
name := “孙嵓”
go支持匿名变量,当想忽略某个值的时候,用一个下划线_来表示,如下
(具体的使用场景就是,方法返回了多个值,但其中的值后续用不到我们就可以用匿名变量,匿名变量是不占用命名空间不会分配内存)
func getName()(string,string){
return “孙嵓”,“男”
}
func main(){
name, _ := getName()
_, sex := getName()
fmt.Println(name + sex)
}
//out
//孙嵓男
类型推导
类似楼上声明变量不带数据类型,编译器会根据右边的值来推导变量的类型完成初始化。
一个字牛逼!
常量声明及初始化
常量可理解为恒定不变的值,用于程序运行期间不会改变的那些值(你在函数内部重新给他赋值ide会报错的,这也是跟var变量的一区别)
const name = “孙嵓”
常量也支持批量声明
const (
sex = “男”
height = “188”
)
//类似这种形式n2,n3都会被赋值为100;变量批量声明没有这种形式
const (
n1 = 100
n2
n3
)
总结回顾
变量和常量的区别
声明关键字不同,常量用的是const,变量用的是var
常量必须赋值,变量可以不赋值但是必须加类型(这种var name string)
在函数内部重新给常量赋值ide会报错的,变量不会
常量在函数中未引用不会报错,变量会
常量批量声明可以设置头一个值批量赋值,变量不可以