常量
常量定义
可以使用 const关键字指定你想要定义的常量,例如:
1 | const PI=3.1415926 |
在定义的时候,你可以指定他的类型,也可以不指定,都可以
预定义常量
Go语言预定义了这些常量,true,false和iota
其中iota比较特殊,可以认为是一个可以被编译器修改的常量;
在第一次使用的时候,就自动置0,在下一个itoa出现以前,其代表的数字会依次+1;
例如:
1 | const( |
如果多个赋值语句一样,比如都是 变量名=iota,那么我们就可以简写这个表达式;
1 | const( |
枚举
Go不支持我们Java 的Enum关键字,所以我们可以使用下面这个方式来表示枚举类
1 | const( |
复数类型
复数实际上是由两个实数构成,一个是实部,一个是虚部
1 | var value1 complex64 // 由2个float32构成的复数类型 |
.实部与虚部 对于一个复数z = complex(x, y),就可以通过Go语言内置函数real(z)获得该复数的实 部,也就是x,通过imag(z)获得该复数的虚部,也就是y。
1 | const a complex64=1+2i |
字符串
1 | var str string // 声明一个字符串变量 |
申明:
求一个字符串的长度使用的是 len(变量名),获取字符串里的某一个位置上的字符,相当于Java里面的charAt()
1 | str:="123456" |
需要注意的是,我们的str[index]取出来的ASCII,直接输出会是数字,我们必须使用%c,%s来格式化;直接使用Println输出的字符串
| 运算 | 含义 | 结果 |
|---|---|---|
| x+y | 字符串连接 | “hello”+”123”=”hello123” |
| len(s) | 字符串长度 | len(“hello”)=5 |
| s[i] | 取字符 | “Hello”[1]=’e’(这里是字符的单引号) |
练习:遍历一个字符串
1 | str:="i am iron man" |
输出:
1 | i index is 0 |
其他数据类型变成字符串
第一种:fmt.Sprintln()
使用 接收者:=fmt.Sprintln(要转换的变量)
1 | a:=1 |
**第二种:使用strconv(string+convert:字符转换) **
1 | a:=1 |
func Formatxxxx(xxxx,base int) 返回i的base进制的字符串表示。base 必须在2到36之间,结果中会使用小写字母’a’到’z’表示大于10的数字。如果我们要使用这个类来和字符串进行转换,那么他的数据类型就必须是下面几类;**==int64,uint64,bool,float64==**
简单了解一下这个类:
strconv包实现了基本数据类型和其字符串表示的相互转换。

字符串变成其他的数据类型
使用strconv的parsexxxx
1 | str:="123" |
如果返回的没有我们想要的类型,那么我们就使用强制类型转换即可
简单分析一下这个函数:
1 | func ParseInt(s string, base int, bitSize int) (i int64, err error) { |
base指定进制(2到36),如果base为0,则会从字符串前置判断,”0x”是16进制,”0”是8进制,否则是10进制;
bitSize指定结果必须能无溢出赋值的整数类型,0、8、16、32、64 分别代表 int、int8、int16、int32、int64;返回的err是*NumErr类型的,如果语法有误,err.Error = ErrSyntax;如果结果超出类型范围err.Error = ErrRange。
我们可以初步了解一些我们go函数的返回值是在哪里标出的;
函数格式:func 函数名 (参数)(返回值)**,所以我们在使用这个函数的时候,没有找到变量接收这个函数的返回值,我们就是使用一个 **__下划线的意义是忽略这一个变量,另一个说法就是如果我们不忽略我们就要创建一个对象,但是这个对象我们却不知道会不会用,但是我们的go语言的规则就是创建了就必须使用,如果每一个类似的错误,我们都要使用,未免太难为人了
字符类型
就是我们Java里面的char,在Go语言中支持两个字符类型,一个是byte(实际上是uint8的别名),代表UTF-8字符串的单个字节的值;另一个是rune,代表单个Unicode字符。
数组
数组是Go语言编程中最常用的数据结构之一。顾名思义,数组就是指一系列同一类型数据 的集合。数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数 组的长度。
常见的声明办法:
1 | [32]byte // 长度为32的数组,每个元素为一个字节 |
代码实现:
创建一个数组:
1 | 原始方式:var array [3]int=[3]int{1,2,3} |
遍历一个数组的两种方式:
1 | 第一种 |
其中,第一种和我们的字符串的遍历一样,另一种就是我们原来的for(变量:变量),在上面的例子里可以看到,range具有两个返回值,第一个返回值是元素的数组下标,第二 个返回值是元素的值。
指针
一个指针变量可以指向任何一个值的内存地址,它所指向的值的内存地址在 32 和 64 位机器上分别占用 4 或 8 个字节,占用字节的大小与所指向的值的大小无关。当一个指针被定义后没有分配到任何变量时,它的默认值为 nil。指针变量通常缩写为 ptr。
从现在的认知来看,就是指针指向一个地址,那个地址上面存的的就是实际上的值;
1 | str:="123" |
结果是:
1 | 0xc00003a1f0 |
使用 *==&==**获得变量的值,使用 **====**获得指针的值
指针的类型是指向的值的类型,比如str:=&a,那么str的类型就是*int
值类型和引用类型
- 值类型:基本数据类型int,float,bool,string,数组和结构体
- 引用类型:指针,slice切片,map,管道chan,interface等都是引用类型
二者的使用特点:
值类型直接存储值,内存一般在栈中,引用类型存储的是一个地址,这个地址对应的空间才是真正的存储的地方,通常在堆中分配
标识符(命名规则)
- 由英文大小写,数字,下划线
- 数字不可以开头
- 严格区分大小写
- 一个标识符不能中间有空格
- 不能使用关键字
标识符注意事项:
- 包名:包名尽量和目录保持一致,不要和标准库冲突
- 变量名、函数名、变量名:采用驼峰命名法;但是要注意首字母不参与这种方式,因为首字母表示权限
- 变量名,函数名,常量名首字母如果大写就可以被其他的包访问,相当于public,如果是小写的就是私有的,可以看成private;



