Go Interface 从理解到深入

Go Interface 从理解到深入 如果说 goroutine 和 channel 是 Go 并发的两大基石,那么接口是 Go 语言编程中数据类型的关键。在 Go 语言的实际编程中,几乎所有的数据结构都围绕接口展开,接口是 Go 语言中所有数据结构的核心 Go 不是一种典型的 OO 语言,它在语法上不支持类和继承的概念 没有继承是否就无法拥有多态行为了呢?答案是否定的,Go 语言引入了一种新类型—Interface,它在效果上实现了类似于 C++ 的 “多态” 概念,虽然与 C++ 的多态在语法上并非完全对等,但至少在最终实现的效果上,它有多态的影子 虽然 Go 语言没有类的概念,但它支持的数据类型可以定义对应的 method(s)。本质上说,所谓的 method(s) 其实就是函数,只不过与普通函数相比,这类函数是作用在某个数据类型上的,所以在函数签名中,会有个 receiver(接收器) 来表明当前定义的函数会作用在该 receiver 上 Go 语言支持的除 Interface 类型外的任何其它数据类型都可以定义其 method(而并非只有 struct 才支持 method),只不过实际项目中,method(s) 多定义在 struct 上而已。 从这一点来看,我们可以把 Go 中的 struct 看作是不支持继承行为的轻量级的 “类”,这一点比较类似 Abstract Class 从语法上看,Interface 定义了一个或一组 method(s),这些 method(s) 只有函数签名,没有具体的实现代码(有没有联想起 C++ 中的虚函数?)。若某个数据类型实现了 Interface 中定义的那些被称为 “methods” 的函数,则称这些数据类型实现(implement)了 interface。这是我们常用的 OO 方式……

阅读全文

如何写好 golang 代码的一些 tips

如何写好 golang 代码的一些 tips 1. 首先需要知道的概念 不要像其他语言一样写 Go, Go 不是 Java/Python/Ruby/PHP,Go 的程序思维很古典也很超前 保持简洁,避免过度工程化 学会阅读源码 interface 很重要,很多问题都可以用 interface 解决 保持函数精炼,变量名长度合适 (在不丢失意义的情况下,尽量短小) 用更小的单元实现代码功能,然后 ** 组合 ** 慎重使用全局变量 (尤其是跨 package 使用,变量作用域上容易踩坑,可以参考 vs6IeAu5U5n) 2. 函数声明的 tips 函数声明首先是函数名字要具有自解释性,需要能够解释清楚大致提供的功能,而不是模糊的 common/util。 其次具体的功能解释,这个要说到代码注释了,这里就不赘述了。 除了函数声明外,还有函数的形参定义。这里以一个例子来说一下扩展性好的函数的参数应该如何定义 (见 2.1)。 2.1 普通函数 假设我们需要一个简单的 server,我们可以像下面这样定义,addr 表示 server 启动在哪个端口上。 func NewServer(addr string) 第一期的需求很简单,就上面这些足够满足了。项目上线跑了一段时间发现,由于连接没有设置超时,很多连接一直得不到释放(异常情况),严重影响服务器性能。 好,那第二期我们加个 timeout。 func NewServer(addr string, timeout time.Duration) 这个时候尴尬的情况出现了,调用你代码的所有人都需要改动代码。而且这只是一个改动,之后如果要支持 tls,那么又得改动一次。 2.2 不定参数 解决上面的窘境的一种方法是使用不定参数。 比如我要实现一个整数加法。 func Add(list .……

阅读全文

正则表达式基本使用介绍

正则表达式有两种风格:posix和perl风格,最常用是posix风格的。下面记录的均是posix风格 字符集和类 通配符,可以匹配除换行符(\\n)之外的任意一个字符 >.at,可以匹配”cat”,“sat”,“mat”等,一般这种通配符用于匹配操作系统中的文件名 限定范围 > 1. 如果要限定匹配的范围,可以使用[a-z]at形式,任何包括在方括号中的内容都是一个字符类-匹配字符所属的字符集合 >2. 可以列出一个集合,[aeiou],来匹配所有元音字母 >3. 也可以描述一个范围,正如前面的连字符,也是一个范围集:[a-zA-Z],这个集合代表任何的大小字母 >4. 也可以指明不属于某个集合,[^a-z],用来匹配不在小写字母中的字符 重复 如果希望某个字符串或者字符类不止一次出现,可以使用2个特殊字符代替:*和+,这两个符号放在表示式后面 - *表示这个模式可以重复0次或多次 - +表示这个模式可以重复1次或更多次 c+at,表示可以匹配”cat”,“ccat”,“cccat”,但是无法匹配”at” c*at,表示可以匹配”cat”,“ccat”,“cccat”,也可以匹配”at” 子表达式 通常,将一个表达式分为几个子表达式非常有用,使用圆括号来实现。 (very )*large,可以匹配:”large”,“very large”,“very very large” 子表达式计数 可以在花括号{}中的数字表达式来指定内容允许重复出现的次数。可以指定一个确切的数字,也可以是一个重复次数范围,或是一个开区间的重复范围 (very){1, 2},可以匹配”very”,“veryvery” (very){3},可以匹配”veryveryvery” (very)(1,),可以匹配”very”,“veryvery”,“veryveryvery”… 定位到字符串的开始或末尾 脱字符号^用于正则表达式的开始,表示子字符串必须出现被搜索字符串的开始处 字符$,用于正则表达式的末尾,表示子字符串必须出现在字符串的末尾 ^bob,用于在字符串开始处匹配bob com$,用于在字符串末尾处匹配com ^[a-z]$,这个将只能匹配a-z之间的字符组成的字符串 分支 可以使用正则表达式中一条竖线,来表示一个选择 com|edu|net,来匹配”com”,“net”,“edu”中任意一个 匹配特殊字符 如果要匹配那些特殊字符,需要使用转义形式,在要匹配的字符前面加一个反斜杠\\ 特殊字符主要有: - \: 转义字符 - ^: 在字符串开始匹配 - $: 在字符串末尾匹配 - .……

阅读全文

MySQL的基础使用相关知识

登录到MySQL mysql -h hostname -P hostport -u username -p -h 指定希望连接的主机,可以用来连接远程主机上的MySQL,如果忽略默认登录本机数据库 -P 指定所连接主机开放的MySQL端口,如果忽略此项默认使用3306端口登录 -u 指定连接数据库时使用的用户名称,如果忽略此项默认使用你的本机用户名 -p 告诉服务器会使用密码来连接数据库,如果忽略此项使用无密码登录 使用密码登入时,会出现以下响应 Enter password: 输入密码后成功登录会得到以下响应 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.7.12 MySQL Community Server (GPL) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates.……

阅读全文

js intro 对象

对象 对象(object)是js的基本数据类型。是一种复合值:将很多值(原始值或者其它对象)聚合在一起,可以通过名字访问这些值。 每个属性都是一个名/值对(key/value),属性名是字符串,因此我们可以把对象看成从字符串到值的映射。 然而对象不仅仅是字符串到值的映射,除了保持自有的属性,js对象还可以从一个称为原型的对象继承属性。 对象的方法通常是继承的属性,这种原型式继承是js的核心特征。 js对象是动态的,可以新增属性,也可以删除属性。 除了字符串、数字、true、false、null和undefined之外,js中的值都是对象。 对象是可变的,我们通过引用而非值来操作对象。如果变量x是指向一个对象的引用,那么执行代码 var y = x; 变量y也是指向同一个对象的引用,而非这个对象的副本。通过y来修改这个对象也会对变量x造成影响 js的属性,除了名字和值之外,每个属性还有一些与之相关的值,称为 属性特性: - 可写,表明是否可以设置该属性的值 - 可枚举,表明是否可以通过for/in循环返回该属性 - 可配置,表明是否可以删除或修改该属性 除了包含属性之外,每个对象还拥有三个相关的对象特性: - 对象的原型(prototype)指向另一个对象,本对象的属性继承自它的原型对象 - 对象的类是一个标识对象类型的字符串 - 对象的扩展标记(extensible flag)指明了在ECMAScript5中是否可以向该对象添加新的属性 三类js对象和两类属性的区分: - 内置对象(native object)是由ECMAScript规范定义的对象或类。例如,数组、函数、日期和正则表达式 - 宿主对象(host object)是由js解释器所嵌入的宿主环境(比如WEB浏览器)定义的。客户端js中表示网页结构的HTMLElement对象均是宿主对象。既然宿主环境定义的方法可以当成普通的js函数对象,那么宿主对象也可以当成内置对象 - 自定义对象(user-defined Object)是由运行中的js代码创建的对象 - 自有属性(own property)是直接在对象中定义的属性 - 继承属性(inherited property)是在对象的原型对象中定义的属性 创建对象 创建对象主要有三种方法: - 对象直接量 - 关键字new创建 - Object.create()函数 对象直接量 对象直接量是由若干名值对组成的映射表,名值对中间用冒号分割,名值对之间用逗号分割,整个映射表用花括号括起来 属性名可以是js标识符也可以是字符串直接量 属性的值可以是任意类型js表达式、表达式的值就是这个属性的值 来个例子: var empty = {}; // 没有任何属性的对象 var point = { x:0, y:1 }; // 两个属性 var point2 = { x: point.……

阅读全文

js intro 语句

语句 js程序其实就是一系列可执行语句的集合。只要掌握了语句,就可以开始写js程序 默认情况下,js依照语句编写顺序依次执行,其中有很多语句和控制语句,来改变默认执行顺序: - 条件语句,js解释器根据一个表达式的值来判断是执行还是跳过这些语句,比如if语句、switch语句 - 循环语句,可以重复执行语句,如while语句和for语句 - 跳转语句,可以让解释器跳转至程序的其他部分继续执行,如break语句、return语句、 throw语句 表达式语句 赋值语句 递增、递减运算符 函数调用 greeting = "hello" + name; i *= 3; counter++; delete o.x; window.close(); cx = Math.cos(x); 复合语句和空语句 js可以讲多条语句联合在一起,形成一条复合语句,只需要用花括号将多条语句括起来即可。 下面代码可以当成一条单独的语句,使用在任何js希望使用一条语句的地方: { x = Math.PI; cx = Math.cos(x); console.log("cos(pi) = " + cx); } 关于语句块,需要注意: - 语句块结尾不需要分号,块中语句必须以分号结束,但语句块不需要 - 语句块中的缩进不是必须的,但是为了代码可读性,还是需要整齐的缩进更好 - js中没有快级作用域,语句块中声明的变量并不是语句块私有的 在js中,希望多条语句被当作一条语句使用时,使用复合语句来替代,空语句正好相反,允许包含0条语句 空语句如下: ; js执行空语句时,不会执行任何动作。但是创建一个具有空循环体时,空语句很有用 for(var i=0; i<a.length; a[i++]=0) ; 注意,在for循环、while循环或if语句的右圆括号后的分号不起眼,很容易造成一些不容易定位的bug if((a == 0) || ( b == 0)); // 这一行代码没有执行任何东西 o = null; // 这一行总会执行 如果有特殊目的需要使用空语句,最好在代码中注释……

阅读全文

js intro 表达式和运算符

表达式和运算符 程序中最简单的表达式就是,程序中的常量 变量名也是一种简单的表达式 复杂的表达式是由简单的表达式组成的 函数调用表达式是由函数对象的表达式和0个或多个参数表达式构成 可以使用运算符来将简单的表达式来组合成复杂的表达式 原始表达式 “原始表达式”,说简单点就是最简单的表达式,并且不再包含其他表达式 >js中原始表达式有以下: - 常量 - 直接量 - 关键字 - 变量 栗子: //直接量 1.23 // 数字直接量 "hello" // 字符串直接量 /pattern/ // 正则表达式直接 //保留字 true false null // 返回空 this // 返回“当前对象” //变量 i // 返回i的值 sum // 返回sum的值 undefined // undefined是全局变量,和null不同,不是一个关键字 对象和数组的初始化表达式 对象和数组的初始化表达式实际上是一个新创建的对象和数组,并不是原始表达式 数组初始化表达式 栗子: - [] //空数组 - [1+2,3+4] // 2个元素数组 [3,7] - var matrix = [[1,2],[3,4]] // 数组可嵌套……

阅读全文

js intro 类型/值/变量

词法结构 字符集:unicode 区分大小写,关键字、变量、函数名、标示符必须采取大小写一致 注释 ``` // 单行注释 /* ~一段注释~ / // 另一段注释 / 多行注释 多行注释 */ ``` 直接量 12 // 数字 1.2 // 小数 "hello world" // 一个字符串 'hi' // 另一种字符串 true // 布尔值 /^javascript$/gi //正则表达式直接量 null // 空 { x:1 ,y:2} // 对象 [ 1,2,3,4,5 ] //数组 标示符、保留字 TBD 可选的分号 在任何需要分割的地方使用 ; 进行分隔 在任何可以省略分号的地方都将其省略 如果不使用分号,由于语句的分隔规则,会导致一些意想不到的情况,建议无论什么时候都使用分号进行分割 类型、值和变量 js中的数据类型: - 数字 - 字符串 - 布尔值 - null - undefine - 对象……

阅读全文

js intro 基本介绍

什么是 JavaScript? JavaScript 是一门跨平台、面向对象的轻量级脚本语言。 在主机环境中, JavaScript能够通过连接环境对象而实现可控制编译。 JavaScript内置了一个包含一系列对象的标准库,比如数组,日期,数学和一个语言元素核心集合包括操作符,流程控制符以及语句等。JavaScript的核心部分可以通过组合已有语言核心对象来扩展语言以适应不同用途;例如: - 客户端的JavaScript通过提供控制浏览器及其文档对象模型(DOM)的对象来扩展语言核心。例如:客户端版本直接支持应用将元素放在在HTML表单中并且支持响应用户事件比如鼠标点击、表单提交和页面导航 - 服务端的JavaScript则通过提供有关在服务器上运行JavaScript的对象来可扩展语言核心。例如:服务端版本直接支持应用和数据库通信,提供应用不同调用间的信息连续性,或者在服务器上执行文件操作 JavaScript 和 ECMAScript 规范 JavaScript 的标准化组织是 ECMA ——这个欧洲信息与通信系统标准化协会提供基于 Javascript 的标准化方案(ECMA 原先是欧洲计算机制造商协会的首字母缩写)。这种标准化版本的JavaScript被称作ECMAScript,在所有支持该标准的应用中以相同的方式工作。公司可以使用开放标准语言来开发他们自己的JavaScript实现版本。ECMAScript标准被记录于ECMA-262规范说明中。 参照 JavaScript的新特性 以便学习更多关于不同版本的JavaScript和ECMAScript规范版本。 ECMAScript 规范是一套用于实现ECMAScript的要求。如果你想在你的ECMAScript实现版本 或 引擎(例如火狐的SpiderMonkey和Chrome 的V8)中实现标准兼容语言(例如ES6)的特性,这将十分有用. ECMAScript 文档并不有助于脚本编程。编写脚本时请参考 JavaScript 文档。 JavaScript上手 Javascript的上手是非常简单的,你仅仅只需要一个浏览器,比如Chrome浏览器 在Chrome浏览器菜单栏“设置按键”=>”更多工具“=>“开发者工具”可以打开控制台,点击Element旁边的console便可以打开console Hello world 不写一段Hello World代码,怎么能叫在学习一门语言呢,SO~DO it in the console 在console中输入 console.log('Hello World!') 你便能看到……

阅读全文

js 保留关键字以及危险变量名

Javascript 的保留关键字(标识符)不可以用作变量、标签或者函数名。 有些保留关键字是作为 Javascript 以后扩展使用。 关键字是严格不允许,而浏览器定义的变量名或者类名在使用的时候注意确保作用域 EMCAScript 中的关键字 break case catch continue s abstract arguments boolean break byte case catch char class* const continue debugger default delete do double else enum* eval export* extends* false final finally float for function goto if implements import* in instanceof int interface let long native new null package private protected public return short static super* switch synchronized this throw throws transient true try typeof var void volatile while with yield ‘*’ 标记的关键字是 ECMAScript5 中新添加的。……

阅读全文