在介绍类型之前,首先要看下变量和常量,因为类型是修饰他们的,类型决定了变量的长度和存储方式。
常量和变量的区别:
1、常量只读,变量值可变
2、变量在运行期分配内存,常量会被编译器在预处理阶段直接展开,作为指令数据使用。
一、变量
a:=1 //这种简短的方式,是go的特色,用起来很方便的。
var b int //这种可以用在分支结构里
if a==1{
b=1
}else{
b=2
}
fmt.Println(a,b)// 变量必须要使用哦。。否则编译不过。
二、常量
不同于变量,常量不使用,不会出错。
const (
RED =0+iota//1
GREEN //2
BLUE//3
)
三、字符串类型
两种声明初始化方式,如下:
var s string="简书"
s:="简书"
字符串是不可变的字节序列,遍历时分byte和rune两种类型
var s string="简书"
for i:=0;i<len(s);i++{
fmt.Printf("%d:[%c]\n",i,s[i])
}//byte格式
for k,v:=range s{
fmt.Printf("%d:[%c]\n",k,v)
}//rune格式
常用函数
var s string = "简书,很棒!,"
c := "是呀!"
ss := strings.Split(s, "")
st := strings.Trim(s, ",")
scarr:=[]string{s,c}
sc := strings.Join(scarr," ")//相比+一次次拼接(每次复制数据,到新分配的内存。) 效率快很多,
fmt.Println(ss, st, sc)
四、切片类型
var slice []string //声明
slice:=[]string{}//声明并初始化
slice:=make([]string,7,10)//指定len 和cap,声明并初始化
slice=append(slice,"1")//在切片最后一个元素后,追加元素,常用
切片本身是指针包装,传参数不需要传指针。
五、字典类型
maptest:=map[string]int{"a":1}//声明并初始化
val,ok:=maptest["a"]
fmt.Println(val,ok)//1 true
注意:
1、不能对nil的map进行写操作,但可读。
2、删除或新增键值是安全的,如果某个任务正在对字典进行写操作,那么其它任务就不能对该字典进行并发操作(读、写、删除),否则会导致进程崩溃。
3、字典对象本身是指针包装,传参数不需要传指针。
六、方法
注意如下结构体传值、传指针的区别
package main
import (
"reflect"
"fmt"
)
type S struct {
}
type T struct {
S
}
func (S) SVal() {}
func (*S) SPtr() {}
func (T) TVal() {}
func (*T) TPtr() {}
func methodSet(a interface{}) {
t := reflect.TypeOf(a)
for i, n := 0, t.NumMethod(); i < n; i++ {
m := t.Method(i)
fmt.Println(m.Name, m.Type)
}
}
func main() {
t :=T{}
methodSet(t)
fmt.Println("---------")
methodSet(&t)
}
//SVal func(main.T)
//TVal func(main.T)
//---------
//SPtr func(*main.T)
//SVal func(*main.T)
//TPtr func(*main.T)
//TVal func(*main.T)
闭包:阮一峰老师讲的很好,闭包就是子函数返回匿名函数,通过返回的匿名函数,访问子函数的局部变量。
网友评论