main函数

15.Go语言标准库之log介绍

主宰稳场 提交于 2020-02-07 00:52:14
1.log 1.1使用Logger log包定义了Logger类型,该类型提供了一些格式化输出的方法。 本包也提供了一个预定义的"标准"logger,可以通过调用Print系列(Print|Printf|Println)、Fatal系列(Fatal|Fatalf|fatalln)和Panic系列(Panic|Panicf|PanicLn)来使用,比自行创建一个logger对象更容易使用。 例如:我们可以像下面的代码一样,直接通过log包来调用上岸提到的方法,默认它们会把日志信息大隐刀终端界面。 package main import ( "log" ) func main() { log.Println("这是一条很普通的日志。") v := "很普通的" log.Printf("这是一条%s日志。\n", v) log.Fatalln("这是一条会触发fatal的日志。") log.Panicln("这是一条会触发panic的日志。") } 结果: 2020/02/06 21:57:13 这是一条很普通的日志。 2020/02/06 21:57:13 这是一条很普通的日志。 2020/02/06 21:57:13 这是一条会触发fatal的日志。 Process finished with exit code 1 logger会打印每条日志信息的日期、时间

并发编程之原子类

半腔热情 提交于 2020-02-07 00:49:17
Java从JDK 1.5开始提供了java.util.concurrent.atomic包(以下简称Atomic包),这个包中 的原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式。 🐤 内部都是采用CAS+volatile实现了无锁并发 这节不讲原理,只讲如何使用。 整体结构 从整体上可以分为5组,分别进行说明 ↘️ 基本类型 使用原子的方式更新基本类型 AtomicInteger:整形原子类 AtomicLong:长整型原子类 AtomicBoolean :布尔型原子类 数组类型 使用原子的方式更新数组里的某个元素 AtomicIntegerArray:整形数组原子类 AtomicLongArray:长整形数组原子类 AtomicReferenceArray :引用类型数组原子类 引用类型 AtomicReference:引用类型原子类 AtomicStampedRerence:原子更新引用类型里的字段原子类 AtomicMarkableReference :原子更新带有标记位的引用类型 对象的属性修改类型 AtomicIntegerFieldUpdater:原子更新整形字段的更新器 AtomicLongFieldUpdater:原子更新长整形字段的更新器 AtomicStampedReference :原子更新带有版本号的引用类型。该类将整数值与引用关联起来

13.Go语言标准库之time包

▼魔方 西西 提交于 2020-02-06 20:19:33
1.time包 time包提供了时间的系那是和测量用的函数。日历的计算采用的是公历。 1.1时间类型 time.Time类型表示时间。我们可以通过time.Now()函数获取当前的事件对象,然后获取时间对象的年月日时分秒等信息。 package main import ( "fmt" "time" ) func main() { now := time.Now() //获取当前时间 fmt.Printf("current time:%v\n", now) year := now.Year() //年 month := now.Month() //月 day := now.Day() //日 hour := now.Hour() //小时 minute := now.Minute() //分钟 second := now.Second() //秒 fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second) } 结果: current time:2020-02-06 18:59:27.940916 +0800 CST m=+0.000227262 2020-02-06 18:59:27 Process finished with exit code 0 1.2时间戳

Python发送简单SMTP邮件

怎甘沉沦 提交于 2020-02-06 17:21:35
一篇电子邮件基本上包含以下几个部分: (1) 源邮件地址/目的邮件地址,就是你自己的邮箱账号和对方的邮箱账号。 (2) 发件人/收件人,这个类似于下面这种图: 好像在QQ邮箱或163邮箱内可以自己设置名称。 (3) 主题,这个不用说了,可以为空。 (4) 正文。 (5) 附件 以下我们根据以上部分,使用python的smtplib和email模块模拟一封 验证码邮件 的发送。 一、介绍 1、smtplib模块 这个模块是Python自带模块,可直接导入。该模块使用了邮件中的SMTP协议,并进行了简单封装,常用以下函数: (1) SMTP()函数,创建smtp对象 (2) login()函数,登录邮箱 (3) sendmail()函数,发送邮件 (4) quit()函数,结束当前会话 2、email模块 也是Python的自带模块。本篇中,我们主要使用mime(Multipurpose Internet Mail Extensions)模块,称为多用途互联网邮件扩展类型,用于建立邮件体对象(主题、正文、附件等)。 (1) MIMEMultipart(),建立一个邮件体对象,为总体,其他小的部分(图片、文字、文件等都要往里面添加)。 (2) MIMEText(),建立文本对象。 (3) MIMEImage,建立图片对象。 (4) MIMEApplication,建立文件附件封装对象。

11.Go语言基础之接口

…衆ロ難τιáo~ 提交于 2020-02-06 16:46:31
接口定义了一个对象的行为规范,接口只定义规范不实现,由具体的对象来实现规范的细节。 1.1接口类型 在Go语言中,接口(interface)是一种类型,一种抽象的类型。 interface是一组method的集合,是duck-type programming的一种体现。 接口做的事情就像是定义一个协议(规则),只要一台机器有洗衣服和甩干的功能,就是洗衣机。不关心属性(数据),只关心行为(方法)。 在Java中,也是有接口的概念的。 1.2为什么要使用接口 package main import "fmt" type Cat struct {} func (c Cat) say() string { return "喵喵喵" } type Dog struct {} func (d Dog) say() string { return "汪汪汪" } func main() { var c Cat fmt.Println("猫:",c.say()) var d Dog fmt.Println("狗:",d.say()) } 结果: 猫: 喵喵喵 狗: 汪汪汪 Process finished with exit code 0 上面的代码中定义了猫和狗,都会叫,你会发现main函数中有明显的代码重复,如果动物越多,那么say()函数会越多,那怎样优化呢? 可以使用接口! 1

Go 系列教程 —— 23. 缓冲信道和工作池

自闭症网瘾萝莉.ら 提交于 2020-02-06 15:59:14
什么是缓冲信道? 在上一教程里,我们讨论的主要是无缓冲信道。我们在信道的教程里详细讨论了,无缓冲信道的发送和接收过程是阻塞的。 我们还可以创建一个有缓冲(Buffer)的信道。只在缓冲已满的情况,才会阻塞向缓冲信道(Buffered Channel)发送数据。同样,只有在缓冲为空的时候,才会阻塞从缓冲信道接收数据。 通过向 make 函数再传递一个表示容量的参数(指定缓冲的大小),可以创建缓冲信道。 ch := make(chan type, capacity) 要让一个信道有缓冲,上面语法中的 capacity 应该大于 0。无缓冲信道的容量默认为 0,因此我们在上一教程创建信道时,省略了容量参数。 我们开始编写代码,创建一个缓冲信道。 示例一 package main import ( "fmt" ) func (main() { ch := make(chan string, 2) ch <- "naveen" ch <- "paul" fmt.Println(<- ch) fmt.Println(<- ch) } 在线运行程序 在上面程序里的第 9 行,我们创建了一个缓冲信道,其容量为 2。由于该信道的容量为 2,因此可向它写入两个字符串,而且不会发生阻塞。在第 10 行和第 11 行,我们向信道写入两个字符串,该信道并没有发生阻塞。我们又在第 12 行和第 13

java中的join用法

蓝咒 提交于 2020-02-06 14:34:15
t1.join(); 在谁里面调用就把谁阻塞 join()方法的作用,是等待这个线程结束; 也就是说,t.join()方法 阻塞调用此方法的线程(calling thread)进入 TIMED_WAITING 状态,直到线程t完成,此线程再继续; 通常用于在main()主线程内,等待其它线程完成再结束main()主线程。 t1.join在main里面执行的,所以main线程被阻塞了, 直到t1线程执行完毕,才执行main函数的线程 public class lx01 { /* * 实现多线程的两种方法 * 1、继承Thread类 * 2、实现Runnable接口(推荐使用) * */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(Thread.currentThread().getName()); MyThread t1= new MyThread(); t1.start(); //System.out.println("isAlive: "+t1.isAlive()); MyRunnable r = new MyRunnable(); Thread t2 =new Thread(r); System.out.println(

C# 装箱与拆箱

倖福魔咒の 提交于 2020-02-06 13:58:11
知识点 值类型。 值类型是在栈中分配内存,在声明时初始化才能使用,不能为null。 值类型超出作用范围系统自动释放内存。 主要由两类组成:结构,枚举(enum),结构分为以下几类: 1、整型(Sbyte、Byte、Char、Short、Ushort、Int、Uint、Long、Ulong) 2、浮点型(Float、Double) 3、decimal 4、bool 5、用户定义的结构(struct) 引用类型。 引用类型在堆中分配内存,初始化时默认为null。 引用类型是通过垃圾回收机制进行回收。 包括类、接口、委托、数组以及内置引用类型object与string。 概念 由于C#中所有的数据类型都是由基类System.Object继承而来的,所以值类型和引用类型的值可以通过显式 (或隐式)操作相互转换,而这转换过程也就是装箱(boxing)和拆箱(unboxing)过程。 装箱 是值类型到 object 类型或到此值类型所实现的任何接口类型的隐式转换。对值类型装箱会在堆中分配一 个对象实例,并将该值复制到新的对象中。 拆箱 是从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换。 ------------------- 为何需要装箱? 一种最普通的场景是,调用一个含类型为Object的参数的方法,该Object可支持任意为型,以便通用。当你需 要将一个值类型

《java第二次实验》

自作多情 提交于 2020-02-06 05:28:33
(一)学习总结 1.什么是构造方法?什么是构造方法的重载?下面的程序是否可以通过编译?为什么? public class Test { public static void main(String args[]) { Foo obj = new Foo(); } } class Foo{ int value; public Foo(int intValue){ value = intValue; } } 构造方法是一种特殊的方法,它是一个与类同名且没有返回值类型的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载。 (1)在Java中,允许在一个类中定义多个构造方法。 (2)在创建对象时,系统会自动根据所调用的构造方法中包含的参数类型,个数,选择匹配的构造方法创建对象。 (3)构造方法的注意事项 (4)如果在类中没有明确定义构造方法,系统会自动调用默认的构造方法。 (5)如果指定了构造方法,则不调用默认的构造方法。 (6)如果已经指定了有参的构造方法,而又要调用无参的构造方法,则要在类中追加无参构造。 下面的程序不能通过编译,new Foo()错误,应创建构造函数Foo()。 2.运行下列程序,结果是什么?分析原因,应如何修改 public class Test { public

main特别之处

廉价感情. 提交于 2020-02-06 02:20:25
1 //package new_Object; 2 public class Main{ 3 public static void main(String[] args) { 4 System.out.println(args); 5 System.out.println(args.length); 6 for (int i = 0; i < args.length; i++) { 7 System.out.println(args[i]); 8 } 9 } 10 } run图解: 解释: [:数组 L:长类型 ava.lang:包名 String:字符串类型元素 @:分界符 667262b6:哈希值 -------------------------------------------------------------------- *主函数特殊之处:public static void main(String[] args) 1,格式固定 2,被JVM所识别和调用 public:因为权限必须最大的 static:不需要对象,直接用主函数所属类名调用即可 void:主函数没有具体的返回值 main:函数名,不是关键字,供JVM识别的固定的名字 String[] args:主函数的参数列表,是一个数组类型的参数,且元素都是字符串类型 来源: https://www.cnblogs