Golang学习(1)——fmt 包

1160636144 · · 2411 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Golang学习聽-聽fmt聽包

--------------------

//聽Print聽将参数列表聽a聽中的各个参数转换为字符串并写入到标准输出中。

//聽非字符串参数之间会添加空格,返回写入的字节数。

func聽Print(a聽...interface{})聽(n聽int,聽err聽error)


//聽Println聽功能类似聽Print,只不过最后会添加一个换行符。

//聽所有参数之间会添加空格,返回写入的字节数。

func聽Println(a聽...interface{})聽(n聽int,聽err聽error)


//聽Printf聽将参数列表聽a聽填写到格式字符串聽format聽的占位符中。

//聽填写后的结果写入到标准输出中,返回写入的字节数。

func聽Printf(format聽string,聽a聽...interface{})聽(n聽int,聽err聽error)聽

--------------------

//聽功能同上面三个函数,只不过将转换结果写入到聽w聽中。

func聽Fprint(w聽io.Writer,聽a聽...interface{})聽(n聽int,聽err聽error)

func聽Fprintln(w聽io.Writer,聽a聽...interface{})聽(n聽int,聽err聽error)

func聽Fprintf(w聽io.Writer,聽format聽string,聽a聽...interface{})聽(n聽int,err聽error)

--------------------

//聽功能同上面三个函数,只不过将转换结果以字符串形式返回。

func聽Sprint(a聽...interface{})聽string

func聽Sprintln(a聽...interface{})聽string

func聽Sprintf(format聽string,聽a聽...interface{})聽string

--------------------

//聽功能同聽Sprintf,只不过结果字符串被包装成了聽error聽类型。

func聽Errorf(format聽string,聽a聽...interface{})聽error

--------------------

//聽示例

func聽main()聽{聽

聽 聽fmt.Print("a",聽"b",聽1,聽2,聽3,聽"c",聽"d",聽"\n") 聽 //ab1聽2聽3cd

聽 聽fmt.Println("a",聽"b",聽1,聽2,聽3,聽"c",聽"d") 聽//聽a聽b聽1聽2聽3聽c聽d

聽 聽fmt.Printf("ab聽%d聽%d聽%d聽cd\n",聽1,聽2,聽3) 聽 //聽ab聽1聽2聽3聽cd

聽 聽if聽err聽:=聽percent(30,聽70,聽90,聽160);聽err聽!=聽nil聽{ 聽 聽 聽 聽 聽 聽 聽聽

聽聽聽聽聽聽聽聽fmt.Println(err)

聽 聽 }

聽 聽 //30%

聽聽聽聽//70%

聽 聽 //90%

聽聽聽聽//数值聽160聽超出范围(100)

}

func聽percent(i聽...int)聽error聽{

聽聽聽聽for聽_,聽n聽:=聽range聽i聽{

聽聽聽聽聽聽聽聽if聽n聽>聽100聽{

聽聽聽聽聽聽聽聽聽聽聽聽return聽fmt.Errorf("数值聽%d聽超出范围(100)",聽n)聽

聽聽聽聽聽聽聽聽}

聽聽聽聽聽聽聽聽fmt.Print(n,聽"%\n")

聽聽聽聽}

聽聽聽聽return聽nil

}

--------------------

//聽Formatter聽由自定义类型实现,用于实现该类型的自定义格式化过程。

//聽当格式化器需要格式化该类型的变量时,会调用其聽Format聽方法。

type聽Formatter聽interface聽{

聽聽聽聽//聽f聽用于获取占位符的旗标、宽度、精度等信息,也用于输出格式化的结果

聽聽聽聽//聽c聽是占位符中的动词

聽聽聽聽Format(f聽State,聽c聽rune)

}

//聽由格式化器(Print聽之类的函数)实现,用于给自定义格式化过程提供信息

type聽State聽interface聽{

聽聽聽聽//聽Formatter聽通过聽Write聽方法将格式化结果写入格式化器中,以便输出。

聽聽聽聽Write(b聽[]byte)聽(ret聽int,聽err聽error)

聽聽聽聽//聽Formatter聽通过聽Width聽方法获取占位符中的宽度信息及其是否被设置。

聽聽聽聽Width()聽(wid聽int,聽ok聽bool)

聽聽聽聽//聽Formatter聽通过聽Precision聽方法获取占位符中的精度信息及其是否被设置。

聽聽聽聽Precision()聽(prec聽int,聽ok聽bool)

聽聽聽聽//聽Formatter聽通过聽Flag聽方法获取占位符中的旗标[+-聽0#]是否被设置。

聽聽聽聽Flag(c聽int)聽bool

}

//聽Stringer聽由自定义类型实现,用于实现该类型的自定义格式化过程。

//聽当格式化器需要输出该类型的字符串格式时就会调用其聽String聽方法。

type聽Stringer聽interface聽{

聽聽聽聽String()聽string

}

//聽Stringer聽由自定义类型实现,用于实现该类型的自定义格式化过程。

//聽当格式化器需要输出该类型的聽Go聽语法字符串(%#v)时就会调用其聽String聽方法。

type聽GoStringer聽interface聽{

聽聽聽聽GoString()聽string

}

--------------------

//聽示例

type聽Ustr聽string

func聽(us聽Ustr)聽String()聽string聽{

聽聽聽聽return聽strings.ToUpper(string(us))聽

}

func聽(us聽Ustr)聽GoString()聽string聽{ 聽聽聽聽return`"`聽+聽strings.ToUpper(string(us))聽+聽`"`

}

func聽(u聽Ustr)聽Format(f聽fmt.State,聽c聽rune)聽{ 聽聽聽聽

聽聽聽聽write聽:=聽func(s聽string)聽{聽

聽聽聽聽聽聽聽聽f.Write([]byte(s))

聽聽聽聽}

聽聽聽聽switch聽c聽{

聽聽聽聽聽聽聽聽case'm',聽'M':

聽聽聽聽聽聽聽聽聽聽聽write("旗标:[")聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽

聽聽聽聽聽聽聽聽聽聽聽聽for聽s聽:=聽"+-聽0#";聽len(s)聽>聽0;聽s聽=聽s[1:]聽{聽聽聽聽

聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽if聽f.Flag(int(s[0]))聽{

聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽write(s[:1])聽

聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽}

聽聽聽聽聽聽聽聽聽聽聽聽}

聽聽聽聽聽聽聽聽聽聽聽聽write("]")

聽聽聽聽聽聽聽聽聽聽聽聽if聽v,聽ok聽:=聽f.Width();聽ok聽{

聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽write("聽|聽宽度:"聽+聽strconv.FormatInt(int64(v),聽10))

聽聽聽聽聽聽聽聽聽聽聽聽}

聽 聽 聽 聽 聽 聽if聽v,聽ok聽:=聽f.Precision();聽ok聽{

聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽write("聽|聽精度:"聽+聽strconv.FormatInt(int64(v),聽10))

聽聽聽聽聽聽聽聽聽聽聽}

聽聽聽聽聽聽聽聽case's',聽'v':

聽 聽 聽 聽 聽聽聽聽//聽如果使用聽Format聽函数,则必须自己处理所有格式,包括聽%#v

聽聽聽聽聽聽聽聽聽聽聽聽if聽c聽==聽'v'聽&&聽f.Flag('#')聽{

聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽write(u.GoString())

聽聽聽聽聽聽聽聽聽聽聽聽}聽else聽{

聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽write(u.String())聽

聽聽聽聽聽聽聽聽聽聽聽聽}

聽聽聽聽聽聽聽聽default:

聽聽聽聽聽聽聽聽聽聽聽聽//聽如果使用聽Format聽函数,则必须自己处理默认输出

聽聽聽聽聽聽聽聽聽聽聽聽write("无效格式:"聽+聽string(c))

聽聽聽聽}

}

func聽main()聽{聽

聽聽聽聽u:=Ustr("Hello聽World!") 聽 聽 聽//聽"-"聽标记和聽"0"聽标记不能同时在

聽聽聽聽fmt.printf("%-+聽0#8.5m\n",聽u) //聽旗标:[+-聽#]聽|聽宽度:8聽|聽精度:5

聽聽聽聽fmt.Printf("%+聽0#8.5M\n",聽u)聽聽//聽旗标:[+聽0#]聽|聽宽度:8聽|聽精度:5 聽 聽聽聽聽fmt.Println(u)聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽//聽HELLO聽WORLD! 聽 聽 聽 聽 聽 聽 聽 聽聽

聽 聽 fmt.Printf("%s\n",聽u)聽聽聽聽聽聽聽聽聽//聽HELLO聽WORLD! 聽 聽 聽聽

聽 聽 fmt.Printf("%#v\n",聽u)聽聽聽聽聽聽聽聽//聽"HELLO聽WORLD!" 聽 聽 聽

聽 聽 fmt.Printf("%d\n",聽u)聽聽聽聽聽聽聽聽聽//聽无效格式:d

}

--------------------

//聽Scan聽从标准输入中读取数据,并将数据用空白分割并解析后存入聽a聽提供

//聽的变量中(换行符会被当作空白处理),变量必须以指针传入。

//聽当读到聽EOF聽或所有变量都填写完毕则停止扫描。

//聽返回成功解析的参数数量。

func聽Scan(a聽...interface{})聽(n聽int,聽err聽error)

//聽Scanln聽和聽Scan聽类似,只不过遇到换行符就停止扫描。

func聽Scanln(a聽...interface{})聽(n聽int,聽err聽error)

//聽Scanf聽从标准输入中读取数据,并根据格式字符串聽format聽对数据进行解析,

//聽将解析结果存入参数聽a聽所提供的变量中,变量必须以指针传入。

//聽输入端的换行符必须和聽format聽中的换行符相对应(如果格式字符串中有换行

//聽符,则输入端必须输入相应的换行符)。

//聽占位符聽%c聽总是匹配下一个字符,包括空白,比如空格符、制表符、换行符。

//聽返回成功解析的参数数量。

func聽Scanf(format聽string,聽a聽...interface{})聽(n聽int,聽err聽error)

//聽功能同上面三个函数,只不过从聽r聽中读取数据。

func聽Fscan(r聽io.Reader,聽a聽...interface{})聽(n聽int,聽err聽error)

func聽Fscanln(r聽io.Reader,聽a聽...interface{})聽(n聽int,聽err聽error)

func聽Fscanf(r聽io.Reader,聽format聽string,聽a聽...interface{})聽(n聽int,聽err聽error)

//聽功能同上面三个函数,只不过从聽str聽中读取数据。

func聽Sscan(str聽string,聽a聽...interface{})聽(n聽int,聽err聽error)

func聽Sscanln(str聽string,聽a聽...interface{})聽(n聽int,聽err聽error)

func聽Sscanf(str聽string,聽format聽string,聽a聽...interface{})聽(n聽int,聽err聽error)

--------------------

//聽示例

//聽对于聽Scan聽而言,回车视为空白

func聽main()聽{聽

聽聽聽聽a,聽b,聽c聽:=聽"",聽0,聽false

聽聽聽聽fmt.Scan(&a,聽&b,聽&c)聽

聽聽 聽fmt.Println(a,聽b,聽c)

聽聽聽聽//聽在终端执行后,输入聽abc聽1聽回车聽true聽回车

聽聽聽聽//聽结果聽abc聽1聽true

}

//聽对于聽Scanln聽而言,回车结束扫描

func聽main()聽{聽

聽聽 聽a,聽b,聽c聽:=聽"",聽0,聽false

聽聽 聽fmt.Scanln(&a,聽&b,聽&c)

聽聽聽聽fmt.Println(a,聽b,聽c)

聽聽聽聽//聽在终端执行后,输入聽abc聽1聽true聽回车

聽聽聽聽//聽结果聽abc聽1聽true

}

//聽格式字符串可以指定宽度

func聽main()聽{聽

聽聽聽聽a,聽b,聽c聽:=聽"",聽0,聽false

聽聽聽聽fmt.Scanf("%4s%d%t",聽&a,聽&b,聽&c)聽

聽聽 聽fmt.Println(a,聽b,聽c)

聽聽聽聽//聽在终端执行后,输入聽1234567true聽回车

聽聽聽聽//聽结果聽1234聽567聽true

}

--------------------

//聽Scanner聽由自定义类型实现,用于实现该类型的自定义扫描过程。

//聽当扫描器需要解析该类型的数据时,会调用其聽Scan聽方法。

typeScannerinterface聽{

聽聽聽聽//聽state聽用于获取占位符中的宽度信息,也用于从扫描器中读取数据进行解析。

聽聽聽聽//聽verb聽是占位符中的动词聽聽聽聽

聽聽聽聽Scan(state聽ScanState,聽verb聽rune)聽error

}

//聽由扫描器(Scan聽之类的函数)实现,用于给自定义扫描过程提供数据和信息

typeScanStateinterface聽{

聽聽聽聽//聽ReadRune聽从扫描器中读取一个字符,如果用在聽Scanln聽类的扫描器中,

聽聽聽聽//聽则该方法会在读到第一个换行符之后或读到指定宽度之后返回聽EOF。

聽聽聽聽//聽返回“读取的字符”和“字符编码所占用的字节数”

聽聽聽聽ReadRune()聽(r聽rune,聽size聽int,聽err聽error)

聽聽聽聽//聽UnreadRune聽撤消最后一次的聽ReadRune聽操作,

聽聽聽聽//聽使下次的聽ReadRune聽操作得到与前一次聽ReadRune聽相同的结果。

聽聽聽聽UnreadRune()聽error

聽聽聽聽//聽SkipSpace聽为聽Scan聽方法提供跳过开头空白的能力。

聽聽聽聽//聽根据扫描器的不同(Scan聽或聽Scanln)决定是否跳过换行符

聽聽聽聽SkipSpace()

聽聽聽聽//聽Token聽用于从扫描器中读取符合要求的字符串,

聽聽聽聽//聽Token聽从扫描器中读取连续的符合聽f(c)聽的字符聽c,准备解析。

聽聽聽聽//聽如果聽f聽为聽nil,则使用聽!unicode.IsSpace(c)聽代替聽f(c)。

聽聽聽聽//聽skipSpace:是否跳过开头的连续空白。返回读取到的数据。

聽聽聽聽//聽注意:token聽指向共享的数据,下次的聽Token聽操作可能会覆盖本次的结果

聽聽聽聽Token(skipSpace聽bool,聽f聽func(rune)聽bool)聽(token聽[]byte,聽err聽error)

聽聽聽聽//聽Width聽返回占位符中的宽度值以及宽度值是否被设置

聽聽聽聽Width()聽(wid聽int,聽ok聽bool)

聽聽聽聽//聽因为上面实现了聽ReadRune聽方法,所以聽Read聽方法永远不应该被调用。

聽聽聽聽//聽一个好的聽ScanState聽应该让聽Read聽直接返回相应的错误信息。

聽聽聽聽Read(buf聽[]byte)聽(n聽int,聽err聽error)

}聽

--------------------

//聽示例

type聽Ustr聽string聽

func聽(u聽*Ustr)聽Scan聽(state聽fmt.ScanState,聽verb聽rune)聽(err聽error)聽{ 聽聽聽聽var聽s聽[]byte

聽聽聽聽switch聽verb聽{

聽聽聽聽聽聽聽聽case'S': 聽聽聽聽聽聽聽聽聽聽聽聽

聽聽聽聽聽聽聽聽聽聽聽聽s,聽err聽=聽state.Token(true,聽func(c聽rune)聽bool聽{聽

聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽return'A'聽<=聽c聽&&聽c聽<=聽'Z'

聽聽聽聽聽聽聽聽聽聽聽聽})

聽聽聽聽聽聽聽聽聽聽聽聽if聽err聽!=聽nil聽{

聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽return

聽聽聽聽聽聽聽聽聽聽 聽}

聽聽聽聽聽聽聽聽case's',聽'v': 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽

聽聽聽聽聽聽聽聽聽聽聽聽s,聽err聽=聽state.Token(true,聽func(c聽rune)聽bool聽{聽

聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽return'a'聽<=聽c聽&&聽c聽<=聽'z'

聽聽聽聽聽聽聽聽聽聽聽聽})

聽聽聽聽聽聽聽聽聽聽聽聽if聽err聽!=聽nil聽{

聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽return

聽聽聽聽聽聽聽聽聽聽聽聽}

聽聽聽聽聽聽聽聽default:

聽聽聽聽聽聽聽聽聽聽聽聽return聽fmt.Errorf("无效格式:%c",聽verb)聽

聽聽聽聽}聽

聽聽聽聽*u聽=聽Ustr(s)

聽聽聽聽return聽nil

}

func聽main()聽{

聽聽聽聽var聽a,聽b,聽c,聽d,聽e聽Ustr 聽 聽 聽 聽聽聽聽

聽聽聽聽n,聽err聽:=聽fmt.Scanf("%3S%S%3s%2v%x",聽&a,聽&b,聽&c,聽&d,聽&e)聽聽聽聽

聽聽聽聽fmt.Println(a,聽b,聽c,聽d,聽e)聽

聽聽聽聽fmt.Println(n,聽err)

聽聽聽聽//聽在终端执行后,输入聽ABCDEFGabcdefg聽回车

聽聽聽聽//聽结果:

聽聽聽聽//聽ABC聽DEFG聽abc聽de

聽聽聽聽//聽4聽无效格式:x

}


有疑问加站长微信联系(非本文作者)

本文来自:51CTO博客

感谢作者:1160636144

查看原文:Golang学习(1)——fmt 包

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2411 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传