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语言除了能让你了解编程的相关概念,带你走进编程的大门,还能让你明白程序的运行原理,比如,计算机的各个部件是如何交互的,程序在 ...
随机推荐
- 实现下拉弹出视图和Block的简单实现
实现效果如下: 实现代码如下: @interface ViewController ()<UIViewControllerTransitioningDelegate> { UILabel ...
- vmware安装密钥
VMware虚拟机已升级至14版本,之前的12版本的秘钥已经无法使用,在此分享一下VMware Workstation 14永久激活密钥: CG54H-D8D0H-H8DHY-C6X7X-N2KG6 ...
- maven中央仓库的配置在哪里?superpom是什么?中央仓库查找三方包
maven的superpom 每个项目都默认继承的pom 位置 $M2_HOME/lib/maven-model-builder.jar 使用tar -xvf解压后,grep -r central 搜 ...
- Navicat安装及使用
一.安装Navicat 1.下载安装文件:navicat11.0.17_premium_cs_x86.exe(32位) 2.Oracle 的 Instance Client:instantclient ...
- php csv 简单的导入
if($act == 'user_upload_do'){ global $db; $filename = $_FILES['file']['tmp_name']; if (empty ($filen ...
- c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - prepare to find start position just show master status
2018-12-27 08:39:49.808 [destination = example , address = /127.0.0.1:3308 , EventParser] WARN c.a.o ...
- [转帖]Linux系列之SAR命令使用详解
Linux系列之SAR命令使用详解 sar是System Activity Reporter(系统活动情况报告)的缩写.这个工具所需要的负载很小,也是目前linux中最为全面的性能分析工具之一.此款工 ...
- pgsql常用操作
pgsql备份: --进入pgsql容器docker exec -it 容器ID bash --备份pgsql /opt/rh/rh-postgresql95/root/usr/bin/pg_dump ...
- Pytest执行用例报Hint: make sure your test modules/packages have valid Python names.
近日,使用Pytest+Appium 实现APP端UI自动化,遇到Pytest收集用例失败的情况. 报错信息如下: test_room.py:None (test_room.py) ImportErr ...
- Redis 常用命令学四:有序集合类型命令
1.增加元素,修改存在元素的分数 127.0.0.1:6379> zadd score 99 a 88 b 66 c (integer) 3 127.0.0.1:6379> ZADD sc ...