zoukankan      html  css  js  c++  java
  • Go语言——概念

    静态类型、动态类型、潜在类型

    静态类型:指在变量声明中示出的那个类型。绝大多数类型都只有静态类型。唯独接口类型的变量例外,他除了拥有静态类型之外,还拥有动态类型。

    动态类型:指在运行时与该变量绑定在一起的是实际类型。这个实际类型可以是实现了这个接口类型的任何类型(任何类型指的是蓝色字)。接口类型变量的动态类型可以在执行期间变化,因为所有实现了这个接口类型的类型的值都可以被赋值给这个变量。但是,这个变量的静态类型永远会是这个接口类型。

    只要一个数据类型(或者与其对应的指针类型)附带的方法集合是某一个接口的方法集合的超集。就可以判定该类型实现了这个接口。一个非接口类型的数据类型,他所拥有方法的集合决定了他是否实现了某个或者某些接口。

    潜在类型:每个类型都会有潜在类型。

           预定义类型(基本类型)的潜在类型是他自身;

           一个由类型字面量构造的复合类型,其潜在类型是它自身。

    type Book struct{
        Name           string
        ISBN           string
        Press          string
        PageNumber     uint16
    }

         除上面2种情况之外,这个类型的潜在类型就是在类型声明中的那个类型的潜在类型

    type myString1 string

    myString1的潜在类型就是string的潜在类型,而string是预定义类型(预定义类型的潜在类型是其自身),所以myString1的潜在类型是string

    type myString2 [3]string

    myString2的潜在类型就是[3]string的潜在类型,而[3]string既不是预定义类型,也不是有类型字面量构成的复合类型。而是一个类型为string的数组类型,他的潜在类型是string类型,所以myString2的潜在类型是数组类型

     类型断言 x.(T)

    x的动态类型是否是T类型或者T类型的实现类型。只有在运行期间,x的动态类型在能够被获知,而在编译期间能够确定的只有T所带代表的类型。这也就是为什么只有在运行期间才能够确定类型断言是否成功的原因。当类型断言失败时,将引发panic

    v,ok := x.(T)

    1.如果断言成功,v将会是已经被转换成T类型的表达式x的求值结果,否则v就是T类型的零值

    2.ok的值体现了断言是否成功(true成功,false失败)

    3.即使断言失败也不会引发panic

    值方法 & 指针方法

    在值方法中,对接收者的值的改变在该方法外是不可见的。

    见代码分析:http://www.cnblogs.com/kelamoyujuzhen/p/7074779.html

    值类型、指针类型、基本类型

    以上说法仅限于Go语言中方法的接收器。

    方法接收器声明的几条规则:

    1.接收器的类型必须是某个自定义的数据类型(值类型),或者自定义数据据类型对应的指针类型(指针类型)。但是不论是哪一种类型,接收器的基本类型都是那个自定义数据类型

    func (self *SortableStrings) Sort()

    接收器的类型是*SortableStrings,是一个指针类型。其基本类型是SortableStrings

    接收器的基本类型既不能是一个指针类型。也不能是一个接口类型

    2.接收器基本类型的声明必须与方法的声明在同一个代码包(package)内

    3.接收器的标识符不能是空标识符“_”

    定义变量

    使用var关键字是Go最基本的定义变量方式,有时也会使用到:=来定义变量。

    1 //“:=”只能在声明“局部变量”的时候使用,而“var”没有这个限制
    2 var number int                              //定义变量
    3 var number int = 10                         //定义变量并初始化值
    4 var number1, number2, number3 int = 1, 2, 3 //平行赋值
    5 number1, number2, number3 := 1, 2, 3        //平行赋值

     某一类型的nil值与empoty值

    nil有点复杂,个人观点:slice、map在只定义未赋值时为nil (太过于片面,欢迎大神补充)

    1 // 不管我们用 nil slice 还是 empty slice,内建函数 append,len和cap的工作方式完全相同。
    2 var slice []int         //nil slice
    3 silce := make([]int, 0) //empty slice
    4 slice := []int{}        //empty slice

    http://www.cnblogs.com/kelamoyujuzhen/p/7074779.html 

    这篇文章中,SortableStrings{}就是SortableStrings的empty值

  • 相关阅读:
    模拟Struts2框架Action的实现
    Servlet中表单的重复提交
    php回调函数设计
    vagrant+xdebug
    css之vw布局
    css之rem布局
    微信jssdk支付坑
    webpack中添加px2rem-loader
    phpstorm+xdebug手机app调试
    mysql产生死锁
  • 原文地址:https://www.cnblogs.com/kelamoyujuzhen/p/7074085.html
Copyright © 2011-2022 走看看