Go -- log4go日志

折腾:

【已解决】go语言中实现log信息同时输出到文件和控制台(命令行)

期间,已经通过io的MultiWriter搞定了同时输出信息到文件和console,但是不支持level。

所以,再去试试这个log4go。

github.com/keepeye/log4go

 

【折腾过程】

1.大概看了看,貌似功能很强大。

有点类似于之前的C#的NLog,为C#的log功能扩展;

此处log4go,是针对go语言的log功能的扩展。

2.此log4go,是go语言的第三方的包,所以,先要去搞懂:

【记录】go语言中安装第三方包package(库):log4go

3.安装完毕后,再去参考官网的:

http://code.google.com/p/log4go/wiki/GettingStarted

去看看如何使用。

4.先去导入:

?
1
2
//import l4g "log4go.googlecode.com/hg"
import l4g "code.google.com/p/log4go"

结果是:

?
1
2
3
E:\Dev_Root\go\src\EmulateLoginBaidu>go run EmulateLoginBaidu.go
# command-line-arguments
.\EmulateLoginBaidu.go:34: imported and not used: "code.google.com/p/log4go"

这说明:

正确导入了(但只是暂时还没去使用而已)

5.接着去使用。

用如下代码:

?
1
2
3
4
5
6
7
8
9
10
11
//do some init for crifanLib
func initCrifanLib(){
    l4g.Info("init for crifanLib")
    //gLogger.Println("init for crifanLib");
    gCurCookies = nil
    return
}
//init for logger
func initLogger(){
    l4g.Debug("in initLogger")

效果是:

log4c debug and info output in console

6.看到其解释了:

上述用的,是默认的,已经实现了的,对于console的log

默认配置为:DEBUG的level:debug及以上的level都显示。

所有的level,依次是:Finest, Fine, Debug, Trace, Info, Warning, Error, Critical

而此处,我想要实现:

(1)重新更改此console的level为Info

(2)添加此处的log文件作为输出,且设置level所有,即最低一级的Finest

7.先去添加log文件:

但是想要去看对应的文档的,结果原先作者的说明:

先去:

?
1
godoc -http=:6060

(我此处实际上本身已经打开godoc的server了)

再去打开地址:

http://localhost:6060/pkg/log4go.googlecode.com/svn/stable/

结果肯定不对的。

后来经过自己的分析,去访问:

http://localhost:6060/pkg/code.google.com/p/log4go/

就可以了。

8.去看看对应的:

http://localhost:6060/pkg/code.google.com/p/log4go/#AddFilter

内容是:

func AddFilter

func AddFilter(name string, lvl level, writer LogWriter)

Wrapper for (*Logger).AddFilter 

去试试代码。

结果基本实现了所要的效果:

console only show info

log file can also show debug

即:

对于代码中debug信息,只在文件中显示

对于info及以上的信息,console和文件,都显示。

实现了level的自定义。

9.目前,唯一一个小问题,不是我喜欢的:

对于,我经常调试程序,

希望每次重新运行时,对于log文件,都自动清空。

而不要对于log文件是APPEND模式:

每次的输出,都添加到后面。

而不清空log文件。

10.所以,再去想办法,新建log时,判断是否已经存在文件,如果存在去删除掉:

【已解决】go语言中判断文件是否存在如果有已存在则删除

 

【总结】

最终,基本实现了全部的效果:

1.每次运行程序,可以OVERWRITE旧的log文件,而不是APPEND

2.可以同时输出内容到log文件和console

3.且console和log文件的输出level都可以配置:

此处要的是:

INFO及以上的,都可以在console中显示;

全部信息(包括debug),都可以在log文件中显示。

全部代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
/*
 * [File]
 * EmulateLoginBaidu.go
 *
 * [Function]
 * 【记录】用go语言实现模拟登陆百度
 * http://www.crifan.com/emulate_login_baidu_using_go_language/
 *
 * [Version]
 * 2013-09-19
 *
 * [Contact]
 * http://www.crifan.com/about/me/
 */
package main
import (
    //"fmt"
    //"builtin"
    //"log"
    "os"
    "runtime"
    "path"
    "strings"
    //"io"
    "time"
    "io/ioutil"
    "net/http"
    //"net/http/cookiejar"
    //"sync"
    //"net/url"
)
//import l4g "log4go.googlecode.com/hg"
//import l4g "code.google.com/p/log4go"
import "
github.com/keepeye/log4go
"
/***************************************************************************************************
    Global Variables
***************************************************************************************************/
var gCurCookies []*http.Cookie;
//var gLogger *log.Logger;
var gLogger log4go.Logger;
/***************************************************************************************************
    Functions
***************************************************************************************************/
//do init before all others
func initAll(){
    gCurCookies = nil
    gLogger = nil
     
    initLogger()
    initCrifanLib()
}
//de-init for all
func deinitAll(){
    gCurCookies = nil
    if(nil == gLogger) {
        gLogger.Close();
        gLogger = nil
    }
}
//do some init for crifanLib
func initCrifanLib(){
    gLogger.Debug("init for crifanLib")
    gCurCookies = nil
    return
}
//init for logger
func initLogger(){
    var filenameOnly string
    filenameOnly = GetCurFilename()
    var logFilename string =  filenameOnly + ".log";
     
    //gLogger = log4go.NewLogger()
    gLogger = make(log4go.Logger)
    //for console
    //gLogger.AddFilter("stdout", log4go.INFO, log4go.NewConsoleLogWriter())
    gLogger.AddFilter("stdout", log4go.INFO, log4go.NewConsoleLogWriter())
    //for log file
    if _, err := os.Stat(logFilename); err == nil {
        //fmt.Printf("found old log file %s, now remove it\n", logFilename)
        os.Remove(logFilename)
    }
    //gLogger.AddFilter("logfile", log4go.FINEST, log4go.NewFileLogWriter(logFilename, true))
    gLogger.AddFilter("logfile", log4go.FINEST, log4go.NewFileLogWriter(logFilename, false))
    gLogger.Info("Current time is : %s", time.Now().Format("15:04:05 MST 2006/01/02"))
    return
}
// GetCurFilename
// Get current file name, without suffix
func GetCurFilename() string {
    _, fulleFilename, _, _ := runtime.Caller(0)
    //fmt.Println(fulleFilename)
    var filenameWithSuffix string
    filenameWithSuffix = path.Base(fulleFilename)
    //fmt.Println("filenameWithSuffix=", filenameWithSuffix)
    var fileSuffix string
    fileSuffix = path.Ext(filenameWithSuffix)
    //fmt.Println("fileSuffix=", fileSuffix)
     
    var filenameOnly string
    filenameOnly = strings.TrimSuffix(filenameWithSuffix, fileSuffix)
    //fmt.Println("filenameOnly=", filenameOnly)
     
    return filenameOnly
}
//get url response html
func GetUrlRespHtml(url string) string{
    gLogger.Debug("GetUrlRespHtml, url=%s", url)
    var respHtml string = "";
     
    resp, err := http.Get(url)
    if err != nil {
        gLogger.Warn("http get url=%s response errror=%s\n", url, err)
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    //gLogger.Debug("body=%s\n", body)
    gCurCookies = resp.Cookies()
     
    respHtml = string(body)
    return respHtml
}
func printCurCookies() {
    var cookieNum int = len(gCurCookies);
    gLogger.Info("cookieNum=%d", cookieNum)
    for i := 0; i < cookieNum; i++ {
        var curCk *http.Cookie = gCurCookies[i];
        //gLogger.Info("curCk.Raw=%s", curCk.Raw)
        gLogger.Info("------ Cookie [%d]------", i)
        gLogger.Info("Name\t=%s", curCk.Name)
        gLogger.Info("Value\t=%s", curCk.Value)
        gLogger.Info("Path\t=%s", curCk.Path)
        gLogger.Info("Domain\t=%s", curCk.Domain)
        gLogger.Info("Expires\t=%s", curCk.Expires)
        gLogger.Info("RawExpires=%s", curCk.RawExpires)
        gLogger.Info("MaxAge\t=%d", curCk.MaxAge)
        gLogger.Info("Secure\t=%t", curCk.Secure)
        gLogger.Info("HttpOnly=%t", curCk.HttpOnly)
        gLogger.Info("Raw\t=%s", curCk.Raw)
        gLogger.Info("Unparsed=%s", curCk.Unparsed)
    }
}
func main() {
    initAll()
    gLogger.Info("this is EmulateLoginBaidu.go")
    var baiduMainUrl string
    baiduMainUrl = "http://www.baidu.com/";
    //baiduMainUrl := "http://www.baidu.com/";
    //var baiduMainUrl string = "http://www.baidu.com/";
    gLogger.Info("baiduMainUrl=%s", baiduMainUrl)
    respHtml := GetUrlRespHtml(baiduMainUrl)
    gLogger.Debug("respHtml=%s", respHtml)
    printCurCookies()
     
    deinitAll()
}

效果是:

 

console中输出的内容:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
E:\Dev_Root\go\src\EmulateLoginBaidu>go run EmulateLoginBaidu.go
[09/20/13 18:39:40] [INFO] Current time is : 18:39:40 +0800 2013/09/20
[09/20/13 18:39:40] [INFO] this is EmulateLoginBaidu.go
[09/20/13 18:39:40] [INFO] baiduMainUrl=http://www.baidu.com/
[09/20/13 18:39:40] [INFO] cookieNum=3
[09/20/13 18:39:40] [INFO] ------ Cookie [0]------
[09/20/13 18:39:40] [INFO] Name =BDSVRTM
[09/20/13 18:39:40] [INFO] Value        =3
[09/20/13 18:39:40] [INFO] Path =/
[09/20/13 18:39:40] [INFO] Domain       =
[09/20/13 18:39:40] [INFO] Expires      =0001-01-01 00:00:00 +0000 UTC
[09/20/13 18:39:40] [INFO] RawExpires=
[09/20/13 18:39:40] [INFO] MaxAge       =0
[09/20/13 18:39:40] [INFO] Secure       =false
[09/20/13 18:39:40] [INFO] HttpOnly=false
[09/20/13 18:39:40] [INFO] Raw  =BDSVRTM=3; path=/
[09/20/13 18:39:40] [INFO] Unparsed=[]
[09/20/13 18:39:40] [INFO] ------ Cookie [1]------
[09/20/13 18:39:40] [INFO] Name =H_PS_PSSID
[09/20/13 18:39:40] [INFO] Value        =3415_1431_2975_2981
[09/20/13 18:39:40] [INFO] Path =/
[09/20/13 18:39:40] [INFO] Domain       =.baidu.com
[09/20/13 18:39:40] [INFO] Expires      =0001-01-01 00:00:00 +0000 UTC
[09/20/13 18:39:40] [INFO] RawExpires=
[09/20/13 18:39:40] [INFO] MaxAge       =0
[09/20/13 18:39:40] [INFO] Secure       =false
[09/20/13 18:39:40] [INFO] HttpOnly=false
[09/20/13 18:39:40] [INFO] Raw  =H_PS_PSSID=3415_1431_2975_2981; path=/; domain=.baidu.com
[09/20/13 18:39:40] [INFO] Unparsed=[]
[09/20/13 18:39:40] [INFO] ------ Cookie [2]------
[09/20/13 18:39:40] [INFO] Name =BAIDUID
[09/20/13 18:39:40] [INFO] Value        =AF99372EE54C9816618EED94475DDD26:FG=1
[09/20/13 18:39:40] [INFO] Path =/
[09/20/13 18:39:40] [INFO] Domain       =.baidu.com
[09/20/13 18:39:40] [INFO] Expires      =0001-01-01 00:00:00 +0000 UTC
[09/20/13 18:39:40] [INFO] RawExpires=Fri, 20-Sep-43 10:39:32 GMT
E:\Dev_Root\go\src\EmulateLoginBaidu>

log文件中输出的内容:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
[2013/09/20 18:39:40 ] [INFO] (main.initLogger:91) Current time is : 18:39:40 +0800 2013/09/20
[2013/09/20 18:39:40 ] [DEBG] (main.initCrifanLib:68) init for crifanLib
[2013/09/20 18:39:40 ] [INFO] (main.main:159) this is EmulateLoginBaidu.go
[2013/09/20 18:39:40 ] [INFO] (main.main:165) baiduMainUrl=http://www.baidu.com/
[2013/09/20 18:39:40 ] [DEBG] (main.GetUrlRespHtml:117) GetUrlRespHtml, url=http://www.baidu.com/
[2013/09/20 18:39:40 ] [DEBG] (main.main:167) respHtml=<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"><title>百度一下,你就知道</title><style >html,.......... new Date(_t + 10000).toGMTString()})}catch(e){}</script></html><!--0556c44ca22cac33-->
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:137) cookieNum=3
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:141) ------ Cookie [0]------
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:142) Name   =BDSVRTM
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:143) Value  =3
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:144) Path   =/
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:145) Domain =
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:146) Expires    =0001-01-01 00:00:00 +0000 UTC
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:147) RawExpires=
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:148) MaxAge =0
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:149) Secure =false
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:150) HttpOnly=false
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:151) Raw    =BDSVRTM=3; path=/
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:152) Unparsed=[]
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:141) ------ Cookie [1]------
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:142) Name   =H_PS_PSSID
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:143) Value  =3415_1431_2975_2981
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:144) Path   =/
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:145) Domain =.baidu.com
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:146) Expires    =0001-01-01 00:00:00 +0000 UTC
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:147) RawExpires=
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:148) MaxAge =0
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:149) Secure =false
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:150) HttpOnly=false
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:151) Raw    =H_PS_PSSID=3415_1431_2975_2981; path=/; domain=.baidu.com
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:152) Unparsed=[]
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:141) ------ Cookie [2]------
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:142) Name   =BAIDUID
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:143) Value  =AF99372EE54C9816618EED94475DDD26:FG=1
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:144) Path   =/
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:145) Domain =.baidu.com
[2013/09/20 18:39:40 ] [INFO] (main.printCurCookies:146) Expires    =0001-01-01 00:00:00 +0000 UTC

整体效果还不错的说。

转载于:https://www.cnblogs.com/mafeng/p/6839592.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572485.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 查看索引命中_请问下如何在Mysql中where与orderBy后在命中索引?

我现在大概有一个需求&#xff0c;是需要在数据库中查询一个列表。数据表的样子大概是这样的&#xff1a;ABCDE1112016-08-0540...............而我现在的SQL语句大概是这样的SELECT * FROM TABLE WHERE B 1 AND C 1 AND D 2016-08-05 ORDER BY E DESC在这种情况下我应该怎么…

linux自动挂载windows磁盘

自动挂载配置文件&#xff1a; /etc/fstab 1 # /etc/fstab: static file system information.2 #3 # Use blkid to print the universally unique identifier for a4 # device; this may be used with UUID as a more robust way to name devices5 # that works even if disks …

java云开发_Java 快速开始

# Java 快速开始代码示例&#xff1a;点击下方按钮一键部署&#xff1a;# 第 1 步&#xff1a;编写基础应用首先我们创建一个 Spring Boot 应用。使用 curl 和 unzip 命令新建一个空 Web 项目&#xff1a;curl https://start.spring.io/starter.zip \-d dependenciesweb \-d ja…

首个比较成型的切图作品

花了一天的时间&#xff0c;跌跌撞撞完成了自己的第一个切图作品。纪念一下&#xff01; https://github.com/yangpeijia/psd-html.git转载于:https://www.cnblogs.com/jiajiayang/p/6840056.html

java jar包 配置文件_java 导入jar包中配置文件

spring项目只能识别到项目内的xml配置文件&#xff0c;无法识别jar中xml配置文件解决思路&#xff1a;在启动初始化期间&#xff0c;将jar包内部的文件拷贝到jar包外部相对路径中。//jarFullFileName: the file name with full path in jar.//newFilePath: the new file direct…

Jmeter响应中中文乱码怎么解决?

在jmeter的bin目录下有一个jmeter.properties的文件&#xff0c;打开它&#xff0c;搜索sampleresult.default.encoding&#xff0c;把它的注释打开&#xff0c;也就是把最前面的#去掉&#xff0c;改成sampleresult.default.encodingUTF-8&#xff0c;保存&#xff0c;重新打开…

三星java3倍拍照手机_全世界拍照最强的两款手机,一个是三星,一个是它

原标题&#xff1a;全世界拍照最强的两款手机&#xff0c;一个是三星&#xff0c;一个是它要说到手机拍照&#xff0c;三星S7毫无疑问是现阶段公认拍照最好的安卓手机&#xff0c;而这很大一定程度上取决于F1.7大光圈和先进的双核对焦技术。而在最近非常火的一款国产新机OPPO R…

抽卡时下拉通知栏导致icon丢失

之前一直忙着出版本&#xff0c;这两天好不容易空一点&#xff0c;赶紧把之前的坑填一下。上次说的那个十连抽&#xff0c;下拉通知栏是会有icon不渲染的问题&#xff0c;直觉是对的是与timescale有关&#xff0c;按昨天的研究结果来看&#xff0c;是因为用了ITween.ScaleTo这个…

ie11java阻止_企业IT管理员IE11升级指南【10】—— 如何阻止IE11的安装

企业IT管理员IE11升级指南 系列&#xff1a;如何阻止IE11的安装希望自行管理更新计划的企业和组织可以使用 IE11 Automatic Update Blocker Toolkit (自动更新拦截工具)禁止自动更新 Internet Explorer 11&#xff0c;与针对 IE10、IE9、IE8 和 IE7 的阻止程序工具包一样&#…

LeetCode: Convert BST to Greater Tree

利用好BST的特性&#xff0c;解起来并不难 1 /**2 * Definition for a binary tree node.3 * public class TreeNode {4 * int val;5 * TreeNode left;6 * TreeNode right;7 * TreeNode(int x) { val x; }8 * }9 */ 10 public class Solution { 11 …

java解析shell命令_Android中执行java命令的方法及java代码执行并解析shell命令

这篇文章给大家介绍Android中执行java命令的方法及java代码执行并解析shell命令&#xff0c;需要的朋友一起学习android中执行java命令的方法大家都晓得吗&#xff0c;下面一段内容给大家带来了具体解析。android的程序基于java开发&#xff0c;当我们接上调试器&#xff0c;执…

python学习之 - re模块

re模块功能&#xff1a;实现字符串匹配。元字符 描述\ 将下一个字符标记符、或一个向后引用、或一个八进制转义符。例如&#xff0c;“\\n”匹配\n。“\n”匹配换行符。序列“\\”匹配“\”而“\(”则匹配“(”。即相当于多种编程语言中都有的“转义字符”的概念。^ 匹…

java从入门到精通第11章_《Java从入门到精通》第十章学习笔记

第10章  Java集合类一、概述Java中的java.util包中提供了一些集合类&#xff0c;也被称为容器&#xff0c;不同于数组&#xff0c;集合的长度是可变的&#xff0c;存放的是对象的引用。常用的集合有List集合、Set集合、Map集合&#xff0c;其中List和Set实现了Collection接口…

Hive之import和export使用详解

在hive-0.8.0后引入了import/export命令。 Export命令可以导出一张表或分区的数据和元数据信息到一个输出位置&#xff0c;并且导出数据可以被移动到另一个hadoop集群或hive实例&#xff0c;并且可以通过import命令导入数据。 当导出一个分区表&#xff0c;原始数据可能在hdfs的…

java中抓阄_如何进行抓阄

展开全部步骤&#xff1a;1、设计总体中的N个个体编号。2、把号码写在号e68a84e8a2ad3231313335323631343130323136353331333431366366签上&#xff0c;将号签放在一个容器中搅拌均匀。3、每次从中抽取一个号签&#xff0c;连续不放回抽取n次。4、将取出的n个号签上所对应的n个…

ARMV8 datasheet学习笔记5:异常模型

1.前言 2.异常类型描述 见 ARMV8 datasheet学习笔记4&#xff1a;AArch64系统级体系结构之编程模型&#xff08;1&#xff09;-EL/ET/ST 一文 3. 异常处理路由对比 AArch32、AArch64架构下IRQ 和Data Abort 异常处理流程图对比. 3.1 IRQ 路由 3.1.1. AArch32 IRQ 路由 图 AAr…

leetcode 三数之和 python_16.leetcode题目讲解(Python):最接近的三数之和

题目如下&#xff1a;题目这道题可以用排一些特殊情况&#xff0c;减少计算量&#xff0c; 参考代码如下&#xff1a;class Solution:def threeSumClosest(self, nums, target):""":type nums: List[int]:type target: int:rtype: int"""# 如果只…

给GridView设置行高

近期在工作中遇到了这样一个问题,使用一个GridView展示数据,item中仅仅是一个TextView,可是里面显示的文字多少不固定多少,必须所有展示出来. 遇到的问题: 1.把item中的宽和高设置match_parent,还是设置成wrap_content,当内容过多的时候,会覆盖下一行的显示的内容. 2.没有一个属…

java导出excel float_【Java】导入导出Excel表格

1、将excel导入到内存1、 调用工作簿Workbook的静态方法getWorkbook(),获得工作簿Workbook对象InputStream in new FileInputStream(file);Workbook wb Workbook.getWorkbook(in);2、 获取Excel表中的工作表格Sheet3、 获取行、列sheet.getRows();sheet.getColumns();4、 读取…

C#的基础数据类型

一、概述 C# 的类型系统是统一的&#xff0c;因此任何类型的值都可以按对象处理。C# 中的每个类型直接或间接地从 object 类类型派生&#xff0c;而 object 是所有类型的最终基类。C#的数据类型主要分为三类&#xff1a;值类型、引用类型和指针类型&#xff08;如下图所示&…