Day3:《Go 语言入门指南:基础语法和常用特性解析-3》
1.常量
常量使用关键字 const 定义,用于存储不会改变的数据。
存储在常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。
常量的定义格式:const identifier [type] = value,例如:
const PI = 3.1415
需要注意的命名规范是:常量一般都是全大写
同时,常量还可以用作枚举:
const (
Unknown = 0
Female = 1
Male = 2
)
2.(重要)值类型和引用类型
程序中所用到的内存在计算机中使用一堆箱子来表示,这些箱子被称为“字”。根据不同的处理器以及操作系统类型,所有的字都具有 32 位(4 字节)或 64 位(8 字节)的相同长度;所有的字都使用相关的内存地址来进行表示(以十六进制数表示)。
所有像 int、float、bool 和 string 这些基本类型都属于值类型,使用这些类型的变量直接指向存在内存中的值。此外,数组和结构这种复合类型也是值类型。
当使用等号 = 将一个变量的值赋值给另一个变量时,如:j = i,实际上是在内存中将 i 的值进行了拷贝。
如果读者学过C语言,应该知道在c中通过“&i”可以取到i的内存地址,对于引用类型,如指针、slices、maps、channel等,被引用的变量会存储在堆中,使用赋值语句时也是只有地址被复制。
3.init函数
变量除了可以在全局声明中初始化,也可以在 init() 函数中初始化。这是一类非常特殊的函数,它不能够被人为调用,而是在每个包完成初始化后自动执行,并且执行优先级比 main() 函数高。
每个源文件可以包含多个 init() 函数,同一个源文件中的 init() 函数会按照从上到下的顺序执行,如果一个包有多个源文件包含 init() 函数的话,则官方鼓励但不保证以文件名的顺序调用。初始化总是以单线程并且按照包的依赖关系顺序执行。
用途:开始执行程序之前对数据进行检验或修复,以保证程序状态的正确性。
实例:
//init.go
package trans
import "math"
var Pi float64
func init() {
Pi = 4 * math.Atan(1) // init() function computes Pi
}
//use_init.go
package main
import (
"fmt"
"./trans"
)
var twoPi = 2 * trans.Pi
func main() {
fmt.Printf("2*Pi = %g\n", twoPi) // 2*Pi = 6.283185307179586
}
4.字符串
go中的字符串类型还是值得说一说的。
字符串是 UTF-8 字符的一个序列(当字符为 ASCII 码时则占用 1 个字节,其它字符根据需要占用 2-4 个字节)。UTF-8 是被广泛使用的编码格式,是文本文件的标准编码,其它包括 XML 和 JSON 在内,也都使用该编码。
由于该编码对占用字节长度的不定性,Go 中的字符串里面的字符也可能根据需要占用 1 至 4 个字节,这与其它语言如 C++、Java 或者 Python 不同(Java 始终使用 2 个字节)。Go 这样做的好处是不仅减少了内存和硬盘空间占用,同时也不用像其它语言那样需要对使用 UTF-8 字符集的文本进行编码和解码。
字符串是一种值类型,且值不可变。
即创建某个文本后你无法再次修改这个文本的内容;更深入地讲,字符串是字节的定长数组。
go中字符串的内容(纯字节)可以通过标准索引法来获取,在中括号 [] 内写入索引,索引从 0 开始计数:
- 字符串 str 的第 1 个字节:str[0]
- 第 i 个字节:str[i - 1]
- 最后 1 个字节:str[len(str)-1]
注意,如果读者比较熟悉java,应该知道java中的String类型是引用类型,java中的String是不可以通过标准索引法进行获取字符的,这一点需要注意。
- strings 和 strconv 包
提到string就不得不说strconv包,strconv包有很多对于字符串的预定义处理函数。
①HasPrefix() 判断字符串 s 是否以 prefix 开头:
strings.HasPrefix(s, prefix string) bool
②HasSuffix() 判断字符串 s 是否以 suffix 结尾:
strings.HasSuffix(s, suffix string) bool
③Contains() 判断字符串 s 是否包含 substr:
strings.Contains(s, substr string) bool
④Index() 返回字符串 str 在字符串 s 中的索引(str 的第一个字符的索引),-1 表示字符串 s 不包含字符串 str:
strings.Index(s, str string) int
⑤LastIndex() 返回字符串 str 在字符串 s 中最后出现位置的索引(str 的第一个字符的索引),-1 表示字符串 s 不包含字符串 str:
strings.LastIndex(s, str string) int
⑥Replace() 用于将字符串 str 中的前 n 个字符串 old 替换为字符串 new,并返回一个新的字符串,如果 n = -1 则替换所有字符串 old 为字符串 new:
strings.Replace(str, old, new string, n int) string
今天的学习就到这里啦,明天再见~