wechat

35. Go 语言中关于接口的三个"潜规则"

*爱你&永不变心* 提交于 2020-08-20 05:31:41
Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客: http://golang.iswbm.com 我的 Github:github.com/iswbm/GolangCodingTime 1. 对方法的调用限制 接口是一组固定的方法集,由于静态类型的限制,接口变量有时仅能调用其中特定的一些方法。 请看下面这段代码 package main import "fmt" type Phone interface { call() } type iPhone struct { name string } func (phone iPhone)call() { fmt.Println("Hello, iPhone.") } func (phone iPhone)send_wechat() { fmt.Println("Hello, Wechat.") } func main() { var phone Phone phone = iPhone{name:"ming's iphone"} phone.call() phone.send_wechat() }

厉害了!知道这样重命名文件都是大佬级别!

北城以北 提交于 2020-08-20 00:46:02
大家好,我是良许。 在 Linux 下,重命名一个文件,我们通常是使用 mv 命令,一般是这样操作的: $ mv file1.txt file2.txt 这样重命令的方式当然是可以,但有个弊端就是你需要输入两次文件名。文件名比较短还好,一旦比较长的话,输两次会很让人崩溃的。 本文就介绍几种更高效的文件重命令方法,一般人不知道哦,知道的都是大神级别。 高效重命名文件的方法 首先,我们需要使用 vim 编辑 ~/.bashrc 文件。 $ vim ~/.bashrc 将下面这段代码添加到 ~/.bashrc 文件末尾: # Bash Function To Rename Files Without Typing Full Name Twice function mv() { if [ "$#" -ne 1 ] || [ ! -e "$1" ]; then command mv "$@" return fi read -ei "$1" newfilename command mv -v -- "$1" "$newfilename" } 然后,再按 wq 保存并退出。再接下来,使用 source 命令让这个修改生效。 $ source ~/.bashrc 接下来,就是见证奇迹的时刻! 现在,我们要重命名 file1.txt 文件,我们只需这样操作即可: $ mv file1.txt 然后

JVM 与 Linux 的内存关系详解

点点圈 提交于 2020-08-19 23:57:05
在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用大约800m。 从表面上,物理内存应该是足够使用的;但实际运行的情况是,会发生大量使用SWAP(说明物理内存不够使用 了),如下图所示。由于SWAP和GC同时发生会致使JVM严重卡顿,所以我们要追问:内存究竟去哪儿了? 要分析这个问题,理解JVM和操作系统之间的内存关系非常重要。接下来主要就Linux与JVM之间的内存关系进行一些分析。 一、Linux与进程内存模型 JVM以一个进程(Process)的身份运行在Linux系统上,了解Linux与进程的内存关系,是理解JVM与Linux内存的关系的基础。下图给出了硬件、系统、进程三个层面的内存之间的概要关系。 从硬件上看,Linux系统的内存空间由两个部分构成:物理内存和SWAP(位于磁盘)。物理内存是Linux活动时使用的主要内存区域;当物理内存不够使用时,Linux会把一部分暂时不用的内存数据放到磁盘上的SWAP中去,以便腾出更多的可用内存空间;而当需要使用位于SWAP的数据时,必须 先将其换回到内存中。 JVM运行时区域详解 ,推荐大家看下。 从Linux系统上看,除了引导系统的BIN区,整个内存空间主要被分成两个部分:内核内存(Kernel space)、用户内存

99 道 Java 多线程面试题,看完我跪了!

老子叫甜甜 提交于 2020-08-19 23:56:45
今天给大家更新的是一篇关于多线程面试的文章,是根据时下热门的面试内容给大家进行总结的,如有雷同,请多见谅。 本篇文章属于干货内容!请各位读者朋友一定要坚持读到最后,完整阅读本文后相信你对多线程会有不一样感悟,下次面试和面试官也能杠一杠相关内容了。 1.什么是进程? 进程是系统中正在运行的一个程序,程序一旦运行就是进程。 进程可以看成程序执行的一个实例。进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要使用进程间通信,比如管道,文件,套接字等。 2.什么是线程? 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 3.线程的实现方式? 1.继承Thread类 2.实现Runnable接口 3.使用Callable和Future 4.Thread 类中的start() 和 run() 方法有什么区别? 1.start()方法来启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。然后通过此Thread类调用方法run(

7 个棘手的 JavaScript 面试题!

浪子不回头ぞ 提交于 2020-08-19 20:35:11
如果您符合高级开发人员的资格,其工作涉及 JavaScript ,那么在编码面试中很有可能会被问到棘手的问题。 遵循这个建议:“熟能生巧”。深入有规律地学习 JavaScript 将提高您的编码能力,并且可以提高您的面试技巧。 在这篇文章中,你会发现 7 个乍一看很简单但很棘手的 JavaScript 面试问题。 虽然一开始这些问题看起来是随意的,但是它们试图与 JavaScript 的重要概念挂钩。所以你最好在下次面试前练习一下! 1、意外全局变量 Question 以下代码段中用于运算 typeof a 和 typeof b 的内容: function foo() { let a = b = 0; a++; return a; } foo(); typeof a; // => ??? typeof b; // => ??? Answer 让我们看一下第 2 行:let a = b = 0,该语句声明一个局部变量 a,然儿,它也声明了全局变量 b。 在 foo() 范围或全局范围中都没有声明变量 b。因此 JavaScript 将 b = 0 表达式解释为 window.b = 0。换句话说,b 是意外创建的全局变量。 在浏览器中,以上代码片段等效于: function foo() { let a; window.b = 0; a = window.b; a++; return

Elasticsearch基础但非常有用的功能之一:别名

自闭症网瘾萝莉.ら 提交于 2020-08-19 13:38:52
文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484454&idx=1&sn=43e95a27bd8635b73d78a23db79407fe&chksm=eaa82c0edddfa518e979b4b4fe5f6b6cf933b30f6177c663bb006148e5a1ef0d47684a8aac92&scene=21#wechat_redirect 1、别名分类 别名在Elasticsearch中有两种分类。 1.1 索引别名 官方释义: 索引别名可以指向一个或多个索引,并且可以在任何需要索引名称的API中使用。 别名为我们提供了极大的灵活性。它们允许我们执行以下操作: 1)在正在运行的集群上的一个索引和另一个索引之间透明切换; 2)对多个索引进行分组组合(例如,lastthreemonths的索引别名:是过去3个月索引 logstash201903, logstash201904, logstash_201905的组合); 3)在索引中的文档子集上创建“视图”(结合业务场景,会提升检索效率)。 通俗解释: 索引别名类似:windows的快捷方式,linux的软链接,mysql的视图。 前提:Elasitcsearch创建索引后,索引名不允许改。很多业务场景下单一索引可能无法满足要求。

一个程序员的水平能差到什么程度?

北城余情 提交于 2020-08-19 08:57:54
作者: Benny、零五 编辑:陶家龙 出处: https://www.zhihu.com/question/314644210 一则灵魂拷问“一个程序员的水平能差到什么程度?”让各位程序员们纷纷有感而发。小编精选了两个有趣的高赞回答只为抛砖引玉,欢迎大家说出你的故事! 来自网友“Benny” 想起了一件十多年前的往事,有一次帮客户的 Java 项目组升级框架。 入场之后屡次听到项目组的运维小哥抱怨 war 包过大,导致每次发布要等很久很久,用过 WebSphere 的童鞋可能知道我在说什么。 那么,这 war 有多大呢?大概 2G!!!??? 富有求知欲的我于是下决心去研究下这鸽子,不对,这 war 包为什么这么大? 草草一挖,果然就在里面发现了宝贝。原来 war 包里还藏着两个程序安装包。 一个是 JDK1.4;另一个是 PES2006,实…….实况足球?! 根据 SVN 的提交记录,肇事的大哥很快就被找到了。 据说是在一个月黑风高的晚上,几个还在加班的码畜临时起意,决定一起找点乐子解解乏。 这位带头大哥为了方便把自己的游戏分享给小伙伴,就想到了把它先提交到 SVN 上这样一个天才的主意…… 当然,按照他原本的计划,这个文件应该随后被删除的!可是,那晚他们玩的实在太尽兴了…… 没人会料到这个文件竟会悄无声息的溜进 war 包,一路潜伏到生产环境,然后反反复复的摩擦了可怜的

详解 Java 中 4 种 IO 模型

旧街凉风 提交于 2020-08-18 23:34:08
来源:ncoding ncoding.com/2018/04/02/java/io.html 同步、异步、阻塞、非阻塞都是和I/O(输入输出)有关的概念,最简单的文件读取就是I/O操作。而在文件读取这件事儿上,可以有多种方式。 本篇会先介绍一下I/O的基本概念,通过一个生活例子来分别解释下这几种I/O模型,以及Java支持的I/O模型。 基本概念 在解释I/O模型之前,我先说明一下几个操作系统的概念 文件描述符fd 文件描述符(file descriptor)是计算机科学中的一个术语,是一个用于表述指向文件的引用的抽象化概念。 文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。 当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。 在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。 缓存I/O 缓存I/O又被称作标准I/O,大多数文件系统的默认I/O操作都是缓存I/O。在Linux的缓存I/O机制中, 操作系统会将I/O的数据缓存在文件系统的页缓存中,也就是说,数据会先被拷贝到操作系统内核的缓冲区中, 然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。 缓存I

Java架构师必须知道的 6 大设计原则

半世苍凉 提交于 2020-08-18 21:19:30
作者:pdai www.cnblogs.com/pengdai/p/9151800.html 在软件开发中,前人对软件系统的设计和开发总结了一些原则和模式, 不管用什么语言做开发,都将对我们系统设计和开发提供指导意义。本文主要将总结这些常见的原则,和具体阐述意义。 开发原则 面向对象的基本原则(solid)是五个,但是在经常被提到的除了这五个之外还有 迪米特法则和合成复用原则等, 所以在常见的文章中有表示写六大或七大原则的; 除此之外我还将给出一些其它相关书籍和互联网上出现的原则; S单一职责SRP Single-Responsibility Principle, 一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合,高内聚在面向对象原则的引申,将职责定义为引起变化的原因,以提高内聚性减少引起变化的原因。 定义 一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。(Every object should have a single responsibility, and that responsibility should be entirely encapsulated by the class.),即又定义有且仅有一个原因使类变更。点击 这里 查看高可用架构设计9种方案详解。 原则分析 一个类(或者大到模块,小到方法)承担的职责越多

解决并发问题,数据库常用的两把锁!

旧城冷巷雨未停 提交于 2020-08-18 20:50:23
作者:黄青石 cnblogs.com/huangqingshi/p/10165409.html 在写入数据库的时候需要有锁,比如同时写入数据库的时候会出现丢数据,那么就需要锁机制。 数据锁分为乐观锁和悲观锁 它们使用的场景如下: 乐观锁适用于写少读多的情景,因为这种乐观锁相当于JAVA的CAS,所以多条数据同时过来的时候,不用等待,可以立即进行返回。 悲观锁适用于写多读少的情景,这种情况也相当于JAVA的 synchronized ,reentrantLock等,大量数据过来的时候,只有一条数据可以被写入,其他的数据需要等待。执行完成后下一条数据可以继续。 他们实现的方式上有所不同。 乐观锁采用版本号的方式,即当前版本号如果对应上了就可以写入数据,如果判断当前版本号不一致,那么就不会更新成功,比如 update table set column = value where version=${version} and otherKey = ${otherKey} 悲观锁实现的机制一般是在执行更新语句的时候采用for update方式,比如 update table set column='value' for update 这种情况where条件呢一定要涉及到数据库对应的索引字段,这样才会是行级锁,否则会是表锁,这样执行速度会变慢。 下面我就弄一个spring boot