变量声明
- 函数内定义的变量称为局部变量
- 函数外定义的变量称为全局变量
- 函数定义中的变量称为形式参数
局部变量
在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,参数和返回值变量也是局部变量
在函数体外声明的变量称之为全局变量,全局变量可以在整个包甚至外部包(被导出后)使用。
Go 语言程序中全局变量与局部变量名称可以相同,但是函数内的局部变量会被优先考虑
数组
数组是具有相同唯一类型的一组编号且长度固定的数据项序列
数组只能存放相同类型的变量,并且长度不能动态变长
数组的船只属性是值传递
数组的边界不能超出指定长度否则会报越界错误
在变量传递的过程中如果传递的数组[3]int 接收只能是[3]int
声明数组
直接声明:var arr [3]int
make声明 arr:=make([]int,3)
字面量:a := [2]int{1, 2}
自动识别长度 :b := [...]int{1, 2}
二维数组:arr:[4][4]int{{1},{1,2},{1,2,3}}
new: arrp := new([10]int)
遍历数组
for k,v:=range a{
}
for i:= 0;i<len(a);i++{
fmt.Print(a[i],"\t")
}
数组排序
引入sort包 import "sort"
升序
整型排序 sort.Ints(arrayInt)
浮点型排序 sort.Floats64s(arrayFloat)
字符串型排序 sort.Strings(arrayString)
降序
sort.Sort(sort.Reverse(sort.IntSlice(arrayInt)))
sort.Sort(sort.Reverse(sort.Float64Slice(arrayFloat)))
sort.Sort(sort.Reverse(sort.StringSlice(arrayString)))
指针数组: 指针数组是一个存储指针的集合
a:=1
b:=2
pscore2 := [...]&int{&a, &b}
指向数组的指针:是指一个指针指向某个数组
var pscore *[5]int = &score3
字符串
//字符串包含 返回值 bool
fmt.Println(strings.Contains("helloogo", "hell"))
fmt.Println(strings.Contains("hellooogo", "goe"))
//字符串组合 返回值 字符串
s := []string{"abc", "hello", "mike", "go"}
buf := strings.Join(s, "_")
fmt.Println(buf)
//字符串分散 返回值是数组
split := "hello&the&most&handsome&man&in&the&space"
s1 := strings.Split(split, "&")
fmt.Println(s1)
//判断字符串在的另一个字符串中首次出现的位置 没有出现返回 -1
fmt.Println(strings.Index("abcdhello", "hello")) //4
fmt.Println(strings.Index("abcdhello", "b")) // 1
fmt.Println(strings.Index("abcdhello", "a")) // 0
fmt.Println(strings.Index("abcdhello", "ab")) // 0
fmt.Println(strings.Index("abcdhello", "go")) //-1
//判断字符串在的另一个字符串中最后一次出现的位置 没有出现返回 -1
fmt.Println(strings.LastIndex("jackisverysmart", "smart")) //10
fmt.Println(strings.LastIndex("jackisverysmart", "a")) //12
fmt.Println(strings.LastIndex("baa", "a")) //2
//字符串转为大写 小写 返回字符串
fmt.Println(strings.ToLower("GOL D ROGER")) //gol d roger
fmt.Println(strings.ToUpper("white beard")) //WHITE BEARD
// 每个字符串单词首字母大写
fmt.Println(strings.Title("hello world")) //Hello World
//字符串替换 返回替换后的字符串
fmt.Println(strings.Replace("black beard", "ack", "kca", 1)) //blkca beard
//替换多个
fmt.Println(strings.ReplaceAll("oink oink oink", "oink", "moo"))
//字符串过滤去掉两端的cut字符串 返回字符串
fmt.Println(strings.Trim("&luffy&sanji & robin &&", "&")) //luffy&sanji & robin
//字符串过滤 去掉左侧cut字符串
fmt.Println(strings.TrimLeft("&nami&chopper&usop", "&")) //nami&chopper&usop
//字符串过滤 去掉右侧侧cut字符串
fmt.Println(strings.TrimRight("&luffy&sanji & robin &*&", "&")) //&luffy&sanji & robin*
//字符串去除两端的空白字符 返回字符串
fmt.Print("onspace")
fmt.Print(strings.TrimSpace(" luffy nami robin * "))
fmt.Print("nospace")
// 以上返回 onspaceluffy nami robin *nospace 注意后面nospace前面没有空格
// 字符串重复count次数(算上本身),返回重复后的次数
fmt.Println(strings.Repeat("one", 3)) //oneoneone
//返回str空格分隔的所有子串的slice
fmt.Println(strings.Fields("jack 123 haha")) //[jack 123 haha]
//字符串是否包含前缀 返回值bool
fmt.Println(strings.HasPrefix("prepare", "prepare")) //true
//字符串是否包含后缀 返回值bool
fmt.Println(strings.HasSuffix("prepare", "are")) //true
//字符串长度 返回字符串长度(包含空格)
fmt.Println(len("jackisa boy ")) //10
//字符串出现的次数 返回出现的次数 没有出现过 返回 0
fmt.Println(strings.Count("cheese","e")) //3
//当sep(第二个参数)为空时候 Count 的返回值是:utf8.RuneCountInString(s) + 1
fmt.Println(strings.Count("谷歌中国",“”))
日期时间
start := time.Now()
2019-12-26 17:09:34.1183363 +0800 CST m=+0.006823301
time.since(start) //从start开始到现在执行since过了多少毫秒
start.Unix() 返回时间戳
time.Now().Unix()
结构体
定义声明结构体
type 类型名 struct {
字段1 字段1类型
字段2 字段2类型
}
对各个部分的说明:
- 类型名:标识自定义结构体的名称,在同一个包内不能重复。
- struct{}:表示结构体类型,type 类型名 struct{}可以理解为将 struct{} 结构体定义为类型名的类型。
- 字段1、字段2……:表示结构体字段名,结构体中的字段名必须唯一。
- 字段1类型、字段2类型……:表示结构体各个字段的类型。
1 结构体的定义只是一种内存布局的描述,只有当结构体实例化时,才会真正地分配内存
因此必须在定义结构体并实例化后才能使用结构体的字段。
2 实例化就是根据结构体定义的格式创建一份与格式一致的内存区域,结构体实例与实例间的内存是完全独立的。
结构体实例化:
1 基本类型
结构体本身是一种类型,可以像整型、字符串等类型一样,以 var 的方式声明结构体即可完成实例化
var ins T T为结构体类型,ins为结构体实例
2 指针类型
Go语言中,还可以使用 new 关键字对类型(包括结构体、整型、浮点数、字符串等)进行实例化,结构体在实例化后会形成指针类型的结构体。
ins:= new(T)
其中: T 为类型,可以是结构体、整型、字符串等。 ins:T 类型被实例化后保存到 ins 变量中,ins 的类型为 *T,属于指针。
2.1 另外一种实例化
对结构体进行&取地址操作时,视为对该类型进行一次 new 的实例化操作
ins := &T{}
其中: T 表示结构体类型。 ins 为结构体的实例,类型为 *T,是指针类型。
结构式初始化
初始化有两种形式分别是以字段“键值对”形式和多个值的列表形式,
键值对形式的初始化适合选择性填充字段较多的结构体, ins := 结构体类型名{ 字段1: 字段1的值, 字段2: 字段2的值, … } 多个值的列表形式适合填充字段较少的结构体。 ins := 结构体类型名{ 字段1的值, 字段2的值, … }
匿名结构体
map
Map是一种数据结构,可以用于存储一系列无序的键值对的集合。它基于键存储的,键就像一个索引一样,这也是Map强大的地方,可以快速快速检索数据,键指向与该键关联的值. map是无序的每次循环出来的顺序都有可能不一样,这是因为map是用hash表来实现的
map的声明
map[key]value key,value分别对应一种数据类型,所有的key的数据类型相同,所有value数据类型相同(注:key与value可以有不同的数据类型)
dict := make(map[sting]string) 这个可以存放键值对
dict := map[sring]string
如果不初始化 map,那么就会创建一个 nil map。nil map 不能用来存放键值对
报如下错误(panic: assignment to entry in nil map)
初始化map:字面值创建
dict := map[sring]string {"name":"lihua","job":"doctor"}
删除元素
delete(map, key)
map作为参数在函数建传递的时候 不是传递的
指针
一个指针变量可以指向任何一个值的内存地址,它所指向的值的内存地址在 32 和 64 位机器上分别占用 4 或 8 个字节,占用字节的大小与所指向的值的大小无关。当一个指针被定义后没有分配到任何变量时,它的默认值为 nil。指针变量通常缩写为 ptr
每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。Go语言中使用在变量名前面添加&操作符(前缀)来获取变量的内存地址(取地址操作),格式如下:
ptr := &v // v 的类型为 T
其中 v 代表被取地址的变量,变量 v 的地址使用变量 ptr 进行接收,ptr 的类型为*T,称做 T 的指针类型,*代表指针。
关系
变量、指针、地址三者的关系是,每个变量都拥有地址,指针的值就是地址
指针取值
当使用&操作符对普通变量进行取地址操作并得到变量的指针后,可以对指针使用*操作符,也就是指针取值
取地址操作符&和取值操作符*是一对互补操作符,&取出地址,*根据地址取出地址指向的值。
变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:
- 对变量进行取地址操作使用&操作符,可以获得这个变量的指针变量。
- 指针变量的值是指针地址。
- 对指针变量进行取值操作使用*操作符,可以获得指针变量指向的原变量的值。