命名规则
- go语言中的函数、变量、常量、类型、语句标签和包的名称遵循一个简单的规则:名称的开头是一个字母或者下划线,后面可以跟任意数量的字符/数字和下划线,并区分大小写。如heapSort和HeapSort是不同名称。
- 在命名时不能使用go语言语法中的保留关键字
- 函数名/变量名等 第一个字母的大小写决定其可见行是否跨包。如果名称以大写字母开头,它是导出的,意味者它对包外是可见的和可访问的,可以被包之外的其他程序所引用。
func main() {
fmt.Println("hello world") //Println()以大写字母开头,可以被外面的包调用
}
- 命名风格:当遇到由单词组合的名称时,Go程序员使用"驼峰式"的风格–更喜欢使用大小写而不是下划线。
GO变量
语法格式:var name type = expression
:
- var:代表声明一个变量
- name:变量名,十一哦那个驼峰式
- type:变量类型
- expression:变量表达式
- 类型与表达式部分可以省略一个,但是不能都省略。
- 类型省略,它的类型将由初始化表达式决定
- 表达式省略:其初始值对应于类型的零值:
a. 对于数字是0,
b. 对于布尔值是false,
c. 对于字符串是"",
d. 对于接口和引用类型(slice、指针、map、通道、函数)是nil。
e. 对于一个像数组或者结构体这样的复合类型,零值是其所有元素或成员的零值。
常见的变量使用方式:
/*单变量*/
var tmp int //声明一个int类型的变量,省略初始值,初始值默认为0
var tmp int = 10 //声明+初始化值为10
var tmp = 10 //声明+初始化,省略类型,由编译器推导出类型
tmp := 10 //短变量声明方式,声明和初始化一个变量,一般在局部变量的声明和初始化使用这种
/*多变量*/
tmp1, tmp2, tmp3 := 1, 2, 3
var tmp1, tmp2, tmp3 = 1,2,3
/*短变量复制注意点*/
tmp := 10
tmp, tmp1 := 11, 12 //短变量赋值时,需要保证左边至少有一个变量没有声明过
go常量
- 常量是一种表达式,其可以保证在编译阶段就计算出表达式的值,并不需要等到运行时,从而使编译器得以知晓其值。所以常量本质上都是属于基本类型:布尔值、字符串或数字。
- 语法格式:
const name type = value
,type可以省略,例如:const pi = 3.1415926
- 常量生成器iota:
- iota是一个可以改变的常量,在编译的过程中会被编译器修改的变量
- iota不是一个值,他可以创建一系列相关值,而不是逐个值现式写出。常量声明中,iota从0开始取值,逐项加1
- iota在time包中的使用
// A Weekday specifies a day of the week (Sunday = 0, ...).
type Weekday int
const (
Sunday Weekday = iota // 0
Monday // 1
Tuesday // 2
Wednesday // 3
Thursday // 4
Friday // 5
Saturday // 6
)
go基本数据类型
go语言同Java/C/C++一样是强类型语言,所以在使用时需要对变量表明具体的类型。
数字类型
整数
- int8:有符号8位整型(-128到127)
- int16:有符号16位整型(-32768 到 32767)
- int32:有符号32位整型(-2147483648 到 2147483647)
- int64:有符号64位整型(-9223372036854775808 到 9223372036854775807)
- uint8:无符号8位整型(0 到 255)
- uint16:无符号16位整型(0到65535)
- uint32:无符号32位整型(0 到 4294967295)
- uint64:无符号64位整型(0 到 18446744073709551615)
- rune类型是int32类型的同义词,常常用于指明一个值是Unicode码点(code point)
- byte类型是uint8类型的同义词,强调一个值是原始数据,而非量值
- uintptr类型是无符号整数,其大小不明确,但足以完整存放指针
浮点数
- float32:IEEE 754标准中的float32的大小,最大约为3.4e38
- float64:IEEE 754标准中的float64的大小,最大约为1.8e308
复数:
- complex64:由float32组成
- complex128:由float64组成
var x complex128 = complex(1, 2) // 1 + 2i
布尔类型
bool型首位值或布尔值(boolean)只有2种可能:真(true)和假(false)
var isTrue bool = true
字符串
- 字符串是不可变的字节序列,它可以包含任意数据,包括0值字节
- 文本字符串被解读成按照UTF-8编码的Unicode码点(文本符号)序列。
- string底层其实就是一个[]byte(slice类型),并且可以直接跟[]byte类型互相转换(string本质就是一个字符流)
- 字符串中的字符是不能修改的,string是一个只读的类型,不能修改意味着两个字符串能安全地公用同一段底层内存,使的复制任何长度字符串的开销都很低廉
- 字符串的两种格式:
var str string = "123456" //用于定义一个单行字符串
var str string = `hello
world` //``用于定义一个多行的字符串,内部进行原样解析
- 字符串转译:
\a "警告"或响铃
\b 退格符
\f 换页符
\n 换行符(直接跳到下一行的同一位置)
\r 回车符(值返回到行首)
\t 制表符
\v 垂直制表符
\' 单引号
\" 双引号
\\ 反斜杠
- 字符串支持易用str[0] 数组下标的方式访问字符串中的单个元素
- 字符串支持使用+,进行字符串拼接
- 字符串和byte[] (字节slice)
go语言中提供类4个标准包对字符串操作特别重要:bytes、strings、strconv和unicode。- strings: 提供类了许多函数,用于搜索、替换、比较、修改、切片与链接字符串
- bytes:提供了与strings类似的函数,用于操作字节slice([]byte类型,其某些属性和字符串相同),由于字符串不可变,因此按增量方式构建字符串会导致多次的内存分配和复制。bytes.Buffer类型会更高效。
- strconv:包中的函数主要用于转换布尔值、整数、浮点数为与之对应的字符串形式,或者把字符串转换为布尔值、整数、浮点数,还有为字符串添加/去除引号的函数
- unicode:包备有判别文字符号值特性的函数,如IsDight、IsLetter、IsUpper和IsLower。
- 具体了解包中的所有函数与用法,可以参考go语言标准库文档中文版