Go语言——概念
静态类型、动态类型、潜在类型
静态类型:指在变量声明中示出的那个类型。绝大多数类型都只有静态类型。唯独接口类型的变量例外,他除了拥有静态类型之外,还拥有动态类型。
动态类型:指在运行时与该变量绑定在一起的是实际类型。这个实际类型可以是实现了这个接口类型的任何类型(任何类型指的是蓝色字)。接口类型变量的动态类型可以在执行期间变化,因为所有实现了这个接口类型的类型的值都可以被赋值给这个变量。但是,这个变量的静态类型永远会是这个接口类型。
只要一个数据类型(或者与其对应的指针类型)附带的方法集合是某一个接口的方法集合的超集。就可以判定该类型实现了这个接口。一个非接口类型的数据类型,他所拥有方法的集合决定了他是否实现了某个或者某些接口。
潜在类型:每个类型都会有潜在类型。
预定义类型(基本类型)的潜在类型是他自身;
一个由类型字面量构造的复合类型,其潜在类型是它自身。
type Book struct{
Name string
ISBN string
Press string
PageNumber uint16
}
除上面2种情况之外,这个类型的潜在类型就是在类型声明中的那个类型的潜在类型
type myString1 string
myString1的潜在类型就是string的潜在类型,而string是预定义类型(预定义类型的潜在类型是其自身),所以myString1的潜在类型是string
type myString2 []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最基本的定义变量方式,有时也会使用到:=
来定义变量。
//“:=”只能在声明“局部变量”的时候使用,而“var”没有这个限制
var number int //定义变量
var number int = //定义变量并初始化值
var number1, number2, number3 int = , , //平行赋值
5 number1, number2, number3 := , , //平行赋值
某一类型的nil值与empoty值
nil有点复杂,个人观点:slice、map在只定义未赋值时为nil (太过于片面,欢迎大神补充)
// 不管我们用 nil slice 还是 empty slice,内建函数 append,len和cap的工作方式完全相同。
var slice []int //nil slice
silce := make([]int, ) //empty slice
slice := []int{} //empty slice
http://www.cnblogs.com/kelamoyujuzhen/p/7074779.html
这篇文章中,SortableStrings{}就是SortableStrings的empty值
Go语言——概念的更多相关文章
- 数据分析与R语言-概念点(一)
一.数据分析 1.数据分析的多层模型 常用的统计量 常用的算法 常用的数据分析工具 常见的报表 二.R语言 1.什么是R语言? R是用于统计分析.绘图的语言和操作环境.R是属于GNU系统的一个 ...
- 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...
- XML 概述 (可扩展标记语言)
XML:eXtensible Markup Language 可扩展标记语言 概念:可扩展:xml中所有的标签都是自定义的.没有预定义的. 功能: 存储数据 ...
- [转]深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
以下内容转自: 作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-l ...
- C语言杂谈(三)存储类别
本文讨论C语言中的存储类别,包括数据在内存的存储.变量的存储类别.函数的存储类别.生存周期.下图为计算机的存储空间,有寄存器和内存. 一.存储区域 1.寄存器:存放立即参加运算的数据. 2.系统区:存 ...
- 21世纪C语言(影印版)
<21世纪C语言(影印版)> 基本信息 原书名:21st Century C 作者: Ben Klemens 出版社:东南大学出版社 ISBN:9787564142056 上架时间:201 ...
- 一套帮助你理解C语言的测试题(转)
前言 原文链接:http://www.nowamagic.net/librarys/veda/detail/775 内容 在这个网站(http://stevenkobes.com/ctest.html ...
- Dart语言入门(一)
Dart 语言介绍 Dart 是谷歌在 2011 年推出的编程语言,是一种结构化 Web 编程语言,允许用户通过 Chromium 中所整合的虚拟机(Dart VM)直接运行 Dart 语言编写的程序 ...
- 为什么入门首选C语言
对于大部分程序员,C语言是学习编程的第一门语言,很少有不了解C的程序员. C语言除了能让你了解编程的相关概念,带你走进编程的大门,还能让你明白程序的运行原理,比如,计算机的各个部件是如何交互的,程序在 ...
随机推荐
- linux上安装pycharm
百度搜索pycharm 然后打开pycharm的官网 然后在官网首页点击down,下载linux版pycharm 上传到linux服务器.解压 然后再打开bin目录 执行:sh ./pycharm.s ...
- ubuntu18.04下eclipse修改maven源为阿里源
下载安装Java和Eclipse:https://www.cnblogs.com/zifeiy/p/9030111.html 然后命令行安装Maven(不是必须的): sudo apt-get ins ...
- destoon 6.0 手机站支持在所有浏览器访问
我们的在本地调试destoon 6.0的手机站模板时,用浏览器的自带审查元素很不方便. 可是destoon 默认是在电脑端打不开手机站,如果这个设置能够去除掉,那就可以了. 去掉这个限制,指需要两步 ...
- win10 1803 频繁死机,卡死不动
摘自微软官网的解决办法,我的目测好像是可以了. 小娜搜索框输入“PowerShell”选择在管理员命令提示符下键入以下命令: Dism /Online /Cleanup-Image /ScanHeal ...
- Egret入门学习日记 --- 第十一篇(书中 4.1~4.6节 内容)
第十一篇(书中 4.1~4.6节 内容) 好了,到了这篇开始,前三章都记录完了. 接下来就是到第四章了. 4.1节 的内容总结一下重点: 1.resource目录下default.res.json文件 ...
- 携程Apollo统一配置中心的搭建和使用
原文链接:https://blog.csdn.net/luhong327/article/details/81453001 一.Apollo配置中心介绍 1.What is Apollo 1.1 Ap ...
- Java 面试 - 打印九九乘法口诀表
在Java面试过程中, 面试者经常会被要求手写代码或上机操作.一般来说,手写代码或上机操作,主要还是考察面试者的分析问题和解决问题的能力.打印九九乘法口诀无疑是非常基础的,那么如何实现呢?首先我们先来 ...
- 【Python | opencv+PIL】常见操作(创建、添加帧、绘图、读取等)的效率对比及其优化
一.背景 本人准备用python做图像和视频编辑的操作,却发现opencv和PIL的效率并不是很理想,并且同样的需求有多种不同的写法并有着不同的效率.见全网并无较完整的效率对比文档,遂决定自己丰衣足食 ...
- sonar+Jenkins 构建代码质量自动化分析平台
1.Sonar 介绍 Sonar 是一个用于管理代码质量的开源工具,可以分析代码中的bug和漏洞以及Code Smells,支持20多种编程语言的检测,如java,c/c++,python,php等语 ...
- 怎样理解构造函数的原型对象prototype
通过构造函数生成的实例对象中的属性和方法其实是从构造函数中"copy"一份后生成的, 也就是说虽然生成的对象是构造函数的实例, 但里面的属性和方法确实相互独立的, 比如下面的lil ...