go语言数据类型

数据类型

指针:

指针是一个用来专门存储内存地址的整型变量。

内存地址是内存总某个字节单元的唯一编号,指针是一个实体,有自己的内存空间,空间内存储一个内存地址。

*	对指针取值
&	对变量取地址

数组:

数组是一个定长的数据集合。(可以利用interface存放不同类型的值)

数组是值类型,元素是值传递。

元素类型相同,但长度不同的数组不属于同一类型,不能进行赋值操作。

func main() {
	var a = [3]int{}           //	无元素自动初始化为默认值0
	b := [4]int{0, 1}          //	未初始化的元素自动初始化为默认值0
	c := [4]int{0, 1: 2, 3: 5} //	指定索引位置初始化

	d := [...]int{1, 2, 3}                         //	根据初始化值的数量确认数组长度
	e := [...]int{0, 1, 2, 4: 44, 4, 5, 6, 10: 99} //	自动推导长度也支持指定索引的出世后
	fmt.Println(a)	//	[0 0 0]
	fmt.Println(b)	//	[0 1 0 0]
	fmt.Println(c)	//	[0 2 0 5]
	fmt.Println(d)	//	[1 2 3]
	fmt.Println(e)	//	[0 1 2 0 44 4 5 6 0 0 99]
}

切片:

切片的本质是一个结构体

type Slice struct{
 Data unsafe.Pointer		//	go语言中的万能指针类型。(c语言是void*)没有具体数据类型,不能进行运算。	
 Len int	//	数据元素的个数
 Cap int	//	可扩展的有效容量		
}

切片是一个不定长的数据集合。(可以利用interface存放不同类型的值)

切片是引用类型:元素是引用传递。

定义切片必须make,或者设置元素。

可以是用apend追加,容量会自动扩张(1024下*2,之后1/4)

apend:向切片尾部添加数据,返回新切片

copy:将参数2切片拷贝到参数1切片(可以通过截取设置要,参数2切片的长度和参数1切片的起始位置)返回值是改变的元素个数(也就是第二个参数的长度)

不能对内容为空的切片进行写操作,但是能读

内容为空和nil是不同的

copy是值传递。

func copySlice() {
	s := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

	s1 := s[5:9]          //	5 6 7 8
	n := copy(s[4:], s1)  //	s: [0,1,2,3,5,6,7,8,8,9]
	fmt.Println(n, s, s1) //	4 [0 1 2 3 5 6 7 8 8 9] [6 7 8 8]
	s2 := make([]int, 6)
	n = copy(s2, s)
	fmt.Println(n, s2) //	6 [0 1 2 3 5 6]
}

map:

无需的键值对集合,key必须是支持==和!=比较的数据类型。

访问不存在的值时返回0值,不会引发错误。

可以使用ok-idiom模式判断键是否存在。

map是无序的

要修改map的值,只需要重新赋值即可

如果map的key是结构体,不能通过m[“a”].age +=1 来改变字段值

如果需要修改字段值,只能修改整个value

和切片一样,不能对内容为空的字典进行写操作,但是能读

内容为空和nil是不同的

map的key和value都可以使用interface来实现设置不同的类型

v,ok := m["a"]
//	两种初始化
m:=make(map[string]int)
m:=map[string]int{
    "a"=1"b"=2}

结构体:

结构体是将多个不同类型命名字段序列打包成一个复合类型。

只有在所有字段类型全部支持时相等操作时,才可以进行比较。只支持!=和==。

字段后可以用``设置字段标签,字段标签不是注释,可以用来对字段进行描述,常被用做格式校验,数据库关系映射等。

带标签的字段通常是导出字段,否则标签也无法使用。

type user10 struct {
	name string
	p    person10
	student10
}

type person10 struct {
	age int
}

type student10 struct {
	Address string `orm:"size(20)"`
}

func main() {
	u := user10{}
	u.name = "name"
	fmt.Println(u) //	{name {0} {}}

	u.student10.Address = "地址"
	fmt.Println(u) //	{name {0} {地址}}

	u.Address = "短地址"
	fmt.Println(u) //	{name {0} {短地址}}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值