interface基础

//介绍和定义
接口定义来对象的行为规范, 只定义,不实现
具体的对象实现规范细节 //接口是一组方法签名的集合
type Animal interface {
Talk()
Eat() int
Run()
}
//一个对象只要包含接口中的所有方法,那么就实现来这个接口
//接口类型的变量, 可以保存具体类型的实例
type people interface {
say()
} type user struct {
} func (u user) say() {
fmt.Println("user say")
} func main() {
var u user var p people
p = u
p.say()
}
//接口应用实例
1.公司每个部门员工都有计算薪水的方法,但是计算方法不同
2.日志输入console,文件等方式
//空接口和类型断言
// 空接口没有定义任何方法
type A interface { } func main() {
var a A
}
//接口类型实例值是nil
func main() {
var a interface{}
fmt.Println(a)
} //<nil>
func main() {
var a interface{} = 10
fmt.Println(a)
} //10
//空接口可以存任意类型的值
func main() {
var a interface{} b:=1
c:=false
a = b
fmt.Println(a)
a = c
fmt.Println(a)
} //1
//false
//空接口类型作为map的key: 可接收任意类型的值
//空接口类型作为函数的参数: 可接收任意类型的值
func test(a interface{}) {
fmt.Println(a)
}
func main() {
test(1)
test(false)
} //1
//false
//获取接口类型里具体的值

func test(i interface{}) {
s := i.(int) //get the underlying int value from i
fmt.Println(s)
} func main() {
var a interface{} = 10
test(a)
} //10
//获取接口类型存储的值

func test(i interface{}) {
s := i.(int) //get the underlying int value from i
fmt.Println(s)
} func main() {
var a interface{} = "hel"
test(a)
} //panic: interface conversion: interface {} is string, not int
// 类型断言: ok机制: 判断空接口里存储的类型

func test(i interface{}) {
v, ok := i.(int) //get the underlying int value from i
if ok {
fmt.Println(v)
}
} func main() {
var a interface{} = "hel"
test(a)
}
//类型断言: switch
func test(i interface{}) {
switch i.(type) {
case int:
fmt.Println(i.(int))
case string:
fmt.Println(i.(string))
default:
fmt.Println("unkown type")
}
} func main() {
var a interface{} = 10
test(a) var b interface{} = "hi"
test(b)
} //10
//hi

interface使用例子

//日志库例子: 没有接口约束的情况

type ConsoleLog struct {
} func NewConsoleLog() *ConsoleLog {
return &ConsoleLog{}
} func (c *ConsoleLog) LogConsoleDebug(msg interface{}) {
fmt.Println(msg)
} type FileLog struct {
} func NewFileLog() *FileLog {
return &FileLog{}
} func (c *FileLog) LogFileDebug(msg interface{}) {
fmt.Println(msg)
} func main() {
console := NewConsoleLog()
console.LogConsoleDebug("console: test log") file := NewFileLog()
file.LogFileDebug("file: test log")
}
//日志库例子: 有接口约束的情况, 切换log更加方便

type LogInterface interface {
Debug(msg interface{})
} type ConsoleLog struct {
} func NewConsoleLog() LogInterface { //返回类型是接口
return &ConsoleLog{}
} func (c *ConsoleLog) Debug(msg interface{}) {
fmt.Println(msg)
} type FileLog struct {
} func NewFileLog() LogInterface {
return &FileLog{}
} func (c *FileLog) Debug(msg interface{}) {
fmt.Println(msg)
} func main() {
log := NewConsoleLog()
log.Debug("console: test log") log = NewFileLog()
log.Debug("file: test log")
}

输出日志

//输出日志到console
msg := fmt.Sprintf(format, args...) //format里的坑 args解出的数据相匹配
fmt.Fprintf(os.Stdout, "%s\n", msg) //输出日志到文件
file, _ := os.OpenFile("/tmp/test.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0755)
fmt.Fprintf(file, "name: %s\n", "maotai")

异步写日志

//将日志写入chan
select {
case f.LogDataChan <- logData:
default:
} //从chan中去除日志写到文件
for logData := range f.LogDataChan {
fmt.Fprintf(file, "%s %s (%s:%s:%d) %s\n", logData.TimeStr, logData.LevelStr, logData.Filename, logData.FuncName, logData.LineNo, logData.Message)
}
//写日志核心逻辑

func main() {
ch := make(chan int, 10)
//异步写日志 //读日志
go func() {
for v := range ch {
fmt.Println(v)
}
}() for {//防止子协程退出
select {
case ch <- 1:
default: //管道满了则丢弃日志,防止程序夯住
}
time.Sleep(time.Second)
}
}

[go]日志库小例子的更多相关文章

  1. easylog -- Linux 下的简单日志库

    之前使用 log4c 或者 log4cpp 的时候, 总需要配置一些文件和链接库之类复杂的配置. 虽然越复杂越说明这个软件支持的功能多.可选择性强, 但是对于一个小的项目,或者要研究他人的代码而加点儿 ...

  2. C++第三方日志库Pantheios

    C++第三方日志库Pantheios Kagula 2012-1-11 简介 在项目实践中发现一个好的日志记录非常重要,你需要借助Logging才能跟踪软件中的错误.所以这里研究下第三方C++库Pan ...

  3. GO的日志库log竟然这么简单!

    前言 最近在尝试阅读字节开源RPC框架Kitex的源码,看到日志库klog部分,果不其然在Go原生的log库的基础上增加了自己的设计,大体包括增加了一些格式化的输出.增加一些常用的日志级别等. 一番了 ...

  4. 爆料喽!!!开源日志库Logger的使用秘籍

    日志对于开发来说是非常重要的,不管是调试数据查看.bug问题追踪定位.数据信息收集统计,日常工作运行维护等等,都大量的使用到.今天介绍著名开源日志库Logger的使用,库的地址:https://git ...

  5. 开源日志库log4cplus+VS2008使用

    一.简介     log4cplus是C++编写的开源的日志系统,功能非常全面.本文介绍如何在Windows+VS2008中使用该日志库.   二.下载     可从网站[url]http://log ...

  6. jsf小例子

    有人问我用过jsf没?   当时没有用过,就看了一下: 写了一个小例子  JSF和struts2 差不多的,都有一些配置和跳转 struts2的action配置和JSF的faces-config.xm ...

  7. c/c++ vector,map,set,智能指针,综合运用的小例子

    标准库,智能指针,综合运用的小例子 功能说明:查询单词在文件中出现的次数,如果在同一行出现多次,只算一次. 比如查询单词:你好 输出的结果: 你好 出现了:2次 (行号 2)xxxxxxx 你好 (行 ...

  8. C++的开源跨平台日志库glog学习研究(二)--宏的使用

    上一篇从整个工程上简单分析了glog,请看C++的开源跨平台日志库glog学习研究(一),这一篇对glog的实现代码入手,比如在其源码中以宏的使用最为广泛,接下来就先对各种宏的使用做一简单分析. 1. ...

  9. Logan:美团点评的开源移动端基础日志库

    前言 Logan是美团点评集团移动端基础日志组件,这个名称是Log和An的组合,代表个体日志服务.同时Logan也是“金刚狼”大叔的名号,当然我们更希望这个产品能像金刚狼大叔一样犀利. Logan已经 ...

随机推荐

  1. Java基础加强-类加载器

    /*类加载器*/ 把.class文件从硬盘上加载出来,将类的字节码(二进制)加载到内存中 /*类加载器及其委托机制*/ Java虚拟机中可以安装多个类加载器(可以自己编写),系统默认三个主要类加载器, ...

  2. 实现Vue的双向绑定

    一.概述 之前有讲到过vue实现整体的整体流程,讲到过数据的响应式,是通过Object.defineProperity来实现的,当时只是举了一个小小的例子,那么再真正的vue框架里是如何实现数据的双向 ...

  3. js中拼接html代码时onclick参数问题

    一.如果是int类型.可以直接传参 二.如果是字符串类型.需要加上引号 1.使用转义符号\转义引号: (\''+strings+'\') 2.使用"  .比如: ("'+strin ...

  4. orecle 查询数量 union合并 的排序问题

    orecle  查询数量 union合并 之后按照从小到大排序了,这边需要不排序的 直接将union  改成union all 就解决了. 图就不传了,验证没问题

  5. 安装 ALC 解决 centos8 不能播放多媒体的问题

    装完centos8 后,发现看不到视频,听不到音乐,连web在线听音乐也不行.通过安装ALC可以解决. 1.三步安装VLC 这是 centos8 的安装包,曾使用 8 之前的版本安装是不成功的 sud ...

  6. python-----批量操作xml文件(新建、增、删、改、查)

    最近需要处理xml文件,学习并整理了一些常用的操作,代码如下: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/7/9 15: ...

  7. idou老师教你学Istio 08: 调用链埋点是否真的“零修改”?

    本文将结合一个具体例子中的细节详细描述Istio调用链的原理和使用方式.并基于Istio中埋点的原理解释来说明:为了输出一个质量良好的调用链,业务程序需根据自身特点做适当的修改,即并非官方一直在说的完 ...

  8. 2018年5月20日--西安icpc邀请赛打铁总结

    2018年5月20日--西安icpc邀请赛打铁总结  事后诸葛亮 大致回顾一下比赛,29号的热身赛和30号的正式赛. 热身赛总共三道题,一个小时,没有AC一道题目. A题是一个几何题目,审题时犯了一个 ...

  9. 巧用linux云服务器下的的/dev/shm/,避开磁盘IO不给力!

    巧用linux云服务器下的的/dev/shm/,避开磁盘IO不给力! 一.什么是tmpfs和/dev/shm/? tmpfs是Linux/Unix系统上的一种基于内存的文件系统.tmpfs可以使用您的 ...

  10. selenium web driver

    WebDriver 支持的浏览器 IE6-10 FireFox大部分版本 Chrome Safari Opera Andrioid 系统上的自带浏览器 IOS系统上自带浏览器 HtmlUnit的无界面 ...