go语言学习笔记——类型

2018-11-05  本文已影响0人  让梦想腾飞

在介绍类型之前,首先要看下变量常量,因为类型是修饰他们的,类型决定了变量的长度和存储方式。
常量和变量的区别:
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)

闭包:阮一峰老师讲的很好,闭包就是子函数返回匿名函数,通过返回的匿名函数,访问子函数的局部变量。

上一篇下一篇

猜你喜欢

热点阅读