func TrimSpace
type URL
type URL struct { Scheme string
Opaque string // encoded opaque data
User *Userinfo // username and password information
Host string // host or host:port
Path string
RawQuery string // encoded query values, without '?'
Fragment string // fragment for references, without '#'
// Println 使用其操作数的默认格式进行格式化并写入到标准输出。
func Println(a ...interface{}) (n int, err error) {
return Fprintln(os.Stdout, a...)
Stdin = NewFile(uintptr(syscall.Stdin), "/dev/stdin")
Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout")
Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr")
var (
// NewFile returns a new File with the given file descriptor and name.
func NewFile(fd uintptr, name string) *File {
f := &File{&file{fd: fdi, name: name}}
runtime.SetFinalizer(f.file, (*file).close)
// Fprintln 使用其操作数的默认格式进行格式化并写入到 w。
func Fprintln(w io.Writer, a ...interface{}) (n int, err error) {
p.doPrint(a, true, true)
// newPrinter 分配一个新的,或抓取一个已缓存的 pp 结构体。
erroring bool // printing an error condition // 打印错误条件
// arg holds the current item, as an interface{}.
// arg 将当前条目作为 interface{} 类型的值保存。
// value holds the current item, as a reflect.Value, and will be
// the zero Value if the item has not been reflected.
// value 将当前条目作为 reflect.Value 类型的值保存;若该条目未被反射,则为
// reordered records whether the format string used argument reordering.
// reordered 记录该格式字符串是否用实参来重新排序。
// goodArgNum records whether the most recent reordering directive was valid.
// goodArgNum 记录最近重新排序的指令是否有效。
func (p *pp) doPrint(a []interface{}, addspace, addnewline bool) {
for argNum := 0; argNum < len(a); argNum++ {
// always add spaces if we're doing Println
isString := arg != nil && reflect.TypeOf(arg).Kind() == reflect.String
if addspace || !isString && !prevString {
prevString = p.printArg(arg, 'v', 0)
func (p *pp) doPrintf(format string, a []interface{}) {
}// Println 使用其操作数的默认格式进行格式化并写入到标准输出。
func Println(a ...interface{}) (n int, err error) {
return Fprintln(os.Stdout, a...)
Stdin = NewFile(uintptr(syscall.Stdin), "/dev/stdin")
Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout")
Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr")
// NewFile returns a new File with the given file descriptor and name.
func NewFile(fd uintptr, name string) *File {
f := &File{&file{fd: fdi, name: name}}
runtime.SetFinalizer(f.file, (*file).close)
// Fprintln 使用其操作数的默认格式进行格式化并写入到 w。
func Fprintln(w io.Writer, a ...interface{}) (n int, err error) {
p := newPrinter()
// newPrinter 分配一个新的,或抓取一个已缓存的 pp 结构体。
erroring bool // printing an error condition // 打印错误条件
// arg holds the current item, as an interface{}.
// arg 将当前条目作为 interface{} 类型的值保存。
// value holds the current item, as a reflect.Value, and will be
// the zero Value if the item has not been reflected.
// value 将当前条目作为 reflect.Value 类型的值保存;若该条目未被反射,则为
// reordered records whether the format string used argument reordering.
// reordered 记录该格式字符串是否用实参来重新排序。
// goodArgNum records whether the most recent reordering directive was valid.
// goodArgNum 记录最近重新排序的指令是否有效。
func (p *pp) doPrintf(format string, a []interface{}) {
argNum := 0 // we process one argument per non-trivial format // 我们为每个非平凡格式都处理一个实参。
afterIndex := false // previous item in format was an index like [3]. // 格式中的前一项是否为类似于 [3] 的下标。
for i < end && format[i] != '%' {
p.buf.WriteString(format[lasti:i])
// done processing format string // 处理格式字符串完成
// Do we have flags? // 是否有标记?
// Do we have an explicit argument index?
argNum, i, afterIndex = p.argNumber(argNum, format, i, len(a))
if i < end && format[i] == '*' {
p.fmt.wid, p.fmt.widPresent, argNum = intFromArg(a, argNum)
p.fmt.wid, p.fmt.widPresent, i = parsenum(format, i, end)
if afterIndex && p.fmt.widPresent { // "%[3]2d"
if i+1 < end && format[i] == '.' {
argNum, i, afterIndex = p.argNumber(argNum, format, i, len(a))
if i < end && format[i] == '*' {
p.fmt.prec, p.fmt.precPresent, argNum = intFromArg(a, argNum)
p.fmt.prec, p.fmt.precPresent, i = parsenum(format, i, end)
argNum, i, afterIndex = p.argNumber(argNum, format, i, len(a))
c, w := utf8.DecodeRuneInString(format[i:])
// percent is special - absorbs no operand
p.buf.WriteByte('%') // We ignore width and prec. // 我们忽略宽度和精度。
} else if argNum >= len(a) { // out of operands // 超过操作数
// Go syntax. Set the flag in the fmt and clear the sharp flag.
// Struct-field syntax. Set the flag in the fmt and clear the plus flag.
// Check for extra arguments unless the call accessed the arguments
// out of order, in which case it's too expensive to detect if they've all
// been used and arguably OK if they're not.
if !p.reordered && argNum < len(a) {
for ; argNum < len(a); argNum++ {
p.buf.WriteString(reflect.TypeOf(arg).String())
用到的第三方代码库: 1.beego框架:一个go语言开发的web框架 安装: go get github.com/astaxie/beego 2.goquery:网页源代码获取过滤的第三方库 安装: go get github.com/PuerkitoBio/goquery 3.excelize框架:写入excel文件第三方库 安装: go get github.com/xuri/excelize 遇到问题: excel写入数据只能写入一部分: 猜想:线程相关超时直接跳过了,不执行写入文件操作