Go数据类型
在 Go 编程语言中,数据类型用于声明函数和变量。
数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。具体分类如下:
类型 | 详解 |
---|---|
布尔型 | 布尔型的值只可以是常量 true 或者 false。 |
数字类型 | 整型 int 和浮点型 float。Go 语言支持整型和浮点型数字,并且支持复数,其中位的运算采用补码。 |
字符串类型 | 字符串就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本。 |
派生类型 | (a) 指针类型(Pointer)(b) 数组类型© 结构化类型(struct)(d) Channel 类型(e) 函数类型(f) 切片类型(g) 接口类型(interface)(h) Map 类型 |
1. 定义变量
声明变量的一般形式是使用 var 关键字,具体格式为:var identifier typename
。如下的代码中我们定义了一个类型为int的变量。
var 变量名 变量类型 = 变量值
package main
import "fmt"
func main() {
var a int = 27
fmt.Println(a);
}
1.0.1 如果变量没有初始化
在go语言中定义了一个变量,指定变量类型,如果没有初始化,则变量默认为零值。零值就是变量没有做初始化时系统默认设置的值。
类型 | 零值 |
---|---|
数值类型 | 0 |
布尔类型 | false |
字符串 | “”(空字符串) |
1.0.2 如果变量没有指定类型
在go语言中如果没有指定变量类型,可以通过变量的初始值来判断变量的类型。如下代码
package main
import "fmt"
func main() {
var d = true
fmt.Println(d)
}
1.0.3 :=符号
当我们定义一个变量后又使用该符号初始化变量,就会产生编译错误,因为该符号其实是一个声明语句。
使用格式:typename := value
变量名 := 变量值
也就是说intVal := 1
相等于:
var intVal int
intVal = 1
1.0.4 多个变量声明
可以同时声明多个 类型相同 的变量(非全局变量),如下图所示:
var x,y int
var c,d int = 1,2
g,h := 123,"hello"
1.0.5 全局变量
关于全局变量的声明如下:
var ( vname1 v_type1 vname2 v_type2 )
具体如下:
var (
a int
b bool
)
1.0.6 匿名变量
匿名变量的特点是一个下画线_,这本身就是一个特殊的标识符,被称为空白标识符。它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃,因此这些值不能在后续的代码中使用,也不可以使用这个标识符作为变量对其它变量进行赋值或运算。
使用匿名变量时,只需要在变量声明的地方使用下画线替换即可。
示例代码如下:
func GetData() (int,int) {
return 10,20
}
func main(){
a, _ := GetData()
_, b := GetData()
fmt.Println(a,b)
}
需要注意的是匿名变量不占用内存空间,不会分配内存。匿名变量与匿名变量之间也不会因为多次声明而无法使用。
1.0.7 变量作用域
作用域指的是已声明的标识符所表示的常量、类型、函数或者包在源代码中的作用范围,在此我们主要看一下go中变量的作用域,根据变量定义位置的不同,可以分为一下三个类型:
1.函数内定义的变量为局部变量,这种局部变量的作用域只在函数体内,函数的参数和返回值变量都属于局部变量。这种变量在存在于函数被调用时,销毁于函数调用结束后。
2.函数外定义的变量为全局变量,全局变量只需要在一个源文件中定义,就可以在所有源文件中使用,甚至可以使用import引入外部包来使用。全局变量声明必须以 var 关键字开头,如果想要在外部包中使用全局变量的首字母必须大写。
3.函数定义中的变量成为形式参数,定义函数时函数名后面括号中的变量叫做形式参数(简称形参)。形式参数只在函数调用时才会生效,函数调用结束后就会被销毁,在函数未被调用时,函数的形参并不占用实际的存储单元,也没有实际值。形式参数会作为函数的局部变量来使用。
1.1 基本数据类型
类型 | 描述 |
---|---|
uint8 / uint16 / uint32 / uint64 | 无符号 8 / 16 / 32 / 64位整型 |
int8 / int16 / int32 / int64 | 有符号8 / 16 / 32 / 64位整型 |
float32 / float64 | IEEE-754 32 / 64 位浮点型数 |
complex64 / complex128 | 32 / 64 位实数和虚数 |
byte | 类似 uint8 |
rune | 类似 int32 |
uintptr | 无符号整型,用于存放一个指针 |
以上就是go语言基本的数据类型,有了数据类型,我们就可以使用这些类型来定义变量,Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。
1.2 指针
与C相同,Go语言让程序员决定何时使用指针。变量其实是一种使用方便的占位符,用于引用计算机内存地址。Go 语言中的的取地址符是&
,放到一个变量前使用就会返回相应变量的内存地址。
指针变量其实就是用于存放某一个对象的内存地址。
1.2.1 指针声明和初始化
和基础类型数据相同,在使用指针变量之前我们首先需要申明指针,声明格式如下:var var_name *var-type
,其中的var-type 为指针类型,var_name 为指针变量名,* 号用于指定变量是作为一个指针。
代码举例如下:
var ip *int /* 指向整型*/
var fp * float32 /* 指向浮点型 */
指针的初始化就是取出相对应的变量地址对指针进行赋值,具体如下:
var a int = 20 /* 声明实际变量 */
var ip *int /* 声明指针变量 */
ip = &a /* 指针变量的存储地址 */
1.2.2 空指针
当一个指针被定义后没有分配到任何变量时,它的值为 nil,也称为空指针。它概念上和其它语言的null、NULL一样,都指代零值或空值。
1.3 数组
和c语言相同,Go语言也提供了数组类型的数据结构,数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。
1.3.1 声明数组
Go 语言数组声明需要指定元素类型及元素个数,语法格式如下:
var variable_name [SIZE] variable_type
以上就可以定一个一维数组,我们举例代码如下:
var balance [10] float32
1.3.2 初始化数组
数组的初始化方式有不止一种方式,我们列举如下:
1.直接进行初始化:var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
2.通过字面量在声明数组的同时快速初始化数组:balance := [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
3.数组长度不确定,编译器通过元素个数自行推断数组长度,在[ ]中填入…,举例如下:var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0
}和balance := [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
4.数组长度确定,指定下标进行部分初始化:balanced := [5]float32(1:2.0, 3:7.0)
/*
注意:
初始化数组中 {} 中的元素个数不能大于 [] 中的数字。
如果忽略 [] 中的数字不设置数组大小,Go 语言会根据元素的个数来设置数组的大小。
*/
1.3.3 go中的数组名意义
在c语言中我们知道数组名在本质上是数组中第一个元素的地址,而在go语言中,数组名仅仅表示整个数组,是一个完整的值,一个数组变量即是表示整个数组。
所以在go中一个数组变量被赋值或者被传递的时候实际上就会复制整个数组。如果数组比较大的话,这种复制往往会占有很大的开销。所以为了避免这种开销,往往需要传递一个指向数组的指针,这个数组指针并不是数组。关于数组指针具体在指针的部分深入的了解。
1.3.4 数组指针
通过数组和指针的知识我们就可以定义一个数组指针,代码如下:
var a = [...]int{1,2,3} // a 是一个数组
var b = &a // b 是指向数组的指针
数组指针除了可以防止数组作为参数传递的时候浪费空间,还可以利用其和for range
来遍历数组,具体代码如下:
for i,v := range b { // 通过数组指针迭代数组的元素
fmt.PrintLn(i,v)
}
1.4 结构体
通过上述数组的学习,我们就可以直接定义多个同类型的变量,但这往往也是一种限制,只能存储同一种类型的数据,而我们在结构体中就可以定义多个不同的数据类型。
1.4.1 声明结构体
在声明结构体之前我们首先需要定义一个结构体类型,这需要使用type和struct,type用于设定结构体的名称,struct用于定义一个新的数据类型。具体结构如下:
type struct_variable_type struct {
member definition
member definition
...
member definition
}
定义好了结构体类型,我们就可以使用该结构体声明这样一个结构体变量,语法如下:
variable_name := structure_variable_type {value1, value2...valuen}
variable_name := structure_variable_type { key1: value1, key2: value2..., keyn: valuen}
1.4.2 访问结构体成员
如果要访问结构体成员,需要使用点号 .
操作符,格式为:结构体变量名.成员名
。举例代码如下:
package main
import "fmt"
type Books struct {
title string
author string
}
func main() {
var book1 Books
Book1.title = "Go 语言入门"
Book1.author = "mars.hao"
}
1.4.3 结构体指针
关于结构体指针的定义和申明同样可以套用前文中讲到的指针的相关定义,从而使用一个指针变量存放一个结构体变量的地址。
定义一个结构体变量的语法:var struct_pointer *Books
。
这种指针变量的初始化和上文指针部分的初始化方式相同struct_pointer = &Book1
,但是和c语言中有所不同,使用结构体指针访问结构体成员仍然使用.操作符。格式如下:struct_pointer.title
原文地址:http://www.cnblogs.com/chunyouqudongwuyuan/p/16916067.html