结构体

谈谈go设计思想

Go语言通过用自定义的方式形成新的类型。Go语言使用结构体和结构体成员来描述真实世界。

Go语言没有类的概念,也不支持类的继承等面向对象思想。Go语言的结构体内嵌配合接口比面向对象具有更高的扩展性和灵活性。

Go语言不仅认为结构体能拥有方法,且每种自定义类型也可以拥有自己的方法。


无类型常量

一个常量可以有任意一个确定的基础类型,例如int或float64,或者是类似time.Duration这样命名的基础类型,但是许多常量并没有一个明确的基础类型。编译器为这些没有明确基础类型的数字常量提供比基础类型更高精度的算术运算;你可以认为至少有256bit的运算精度。这里有六种未明确类型的常量类型,分别是无类型的布尔型、无类型的整数、无类型的字符、无类型的浮点数、无类型的复数、无类型的字符串。


切片初识

切片介绍

在初始定义数组时,我们并不知道需要多大的数组,因此我们就需要“动态数组”。在Go里面这种数据结构叫slice。 切片解决了数组长度不能扩展,以及基本类型数组传递时产生副本的问题。


集合map

算法贴士

需要使用任意类型的关联,就需要用到集合,比如学号和名字。Go语言提供了映射关系容器是map,内部使用散列表(hash)实现。

大多数语言中映射关系容器使用两种算法:散列表和平衡树。


指针

指针的创建

Go保留了指针,代表某个内存地址,默认值为nil,使用&取变量地址,通过*访问目标对象。

简单示例:

1
2
3
4
5
v := "3"
ptr := &v
value := *ptr
fmt.Printf("指针地址为:%p\n", ptr) // 输出0x.....16进制数
fmt.Printf("指针地址内存储的值为:%s\n", value) // 输出3

数组

数组的声明

数组是一段固定长度的连续内存区域。数组的长度定义后不可更改,长度使用 len() 获取。

1
2
3
4
5
6
var arr1 [10]int					//定义长度为10的整型数组,很少这样使用
arr2 [5]int := [5]int{1,2,3,4,5} //定义并初始化
arr3 := [5]int{1,2,3,4,5} //自动推导并初始化
arr4 := [5]int{1,2} //指定总长度,前几位被初始化,没有的使用零值
arr5 := [5]int{2:10, 4:11} //有选择的初始化,没被初始化的使用零值
arr6 := [...]int{2,3,4} //自动计算长度

字符串

字符型

Golang 中没有专门的字符类型,如果要存储单个字符(字母),一般使用 byte 来保存,且使用单引号包裹。
字符类型可以以d%打印为整型。

1
2
3
4
5
6
7
8
9
var c1 byte = 'a'
var c2 byte = '0'

fmt.Println("c1=", c1) //输出 97
fmt.Println("c2=", c2) //输出48
fmt.Printf("c1=%c,c2=%c\n", c1, c2) //输出原值 a 0

//var c3 byte = '北'
//fmt.Printf("c3=%c", c3) //溢出错误

数值类型

整数类型

整数类型有无符号(如int)和带符号(如uint)两种,这两种类型的长度相同,但具体长度取决于不同编译器的实现。

int8、int16、int32和int64四种有符号整数类型,分别对应8、16、32、64bit大小的有符号整数,同样uint8、uint16、uint32和uint64对应四种无符号整数类型。


进制与转换

常见进制

  • 二进制:只有0和1,Go中不能直接使用二进制表示整数
  • 八进制:0-7,以数字0开头
  • 十进制:0-9
  • 十六进制:0-9以及A-F,以0X开头,A-F以及X不区分大小写