Golang学习 - fmt 包
本文内容纲要:
------------------------------------------------------------
//Print将参数列表a中的各个参数转换为字符串并写入到标准输出中。
//非字符串参数之间会添加空格,返回写入的字节数。
funcPrint(a...interface{})(nint,errerror)
//Println功能类似Print,只不过最后会添加一个换行符。
//所有参数之间会添加空格,返回写入的字节数。
funcPrintln(a...interface{})(nint,errerror)
//Printf将参数列表a填写到格式字符串format的占位符中。
//填写后的结果写入到标准输出中,返回写入的字节数。
funcPrintf(formatstring,a...interface{})(nint,errerror)
------------------------------
//功能同上面三个函数,只不过将转换结果写入到w中。
funcFprint(wio.Writer,a...interface{})(nint,errerror)
funcFprintln(wio.Writer,a...interface{})(nint,errerror)
funcFprintf(wio.Writer,formatstring,a...interface{})(nint,errerror)
------------------------------
//功能同上面三个函数,只不过将转换结果以字符串形式返回。
funcSprint(a...interface{})string
funcSprintln(a...interface{})string
funcSprintf(formatstring,a...interface{})string
------------------------------
//功能同Sprintf,只不过结果字符串被包装成了error类型。
funcErrorf(formatstring,a...interface{})error
------------------------------
//示例
funcmain(){
fmt.Print("a","b",1,2,3,"c","d","\n")
fmt.Println("a","b",1,2,3,"c","d")
fmt.Printf("ab%d%d%dcd\n",1,2,3)
//ab123cd
//ab123cd
//ab123cd
iferr:=percent(30,70,90,160);err!=nil{
fmt.Println(err)
}
//30%
//70%
//90%
//数值160超出范围(100)
}
funcpercent(i...int)error{
for_,n:=rangei{
ifn>100{
returnfmt.Errorf("数值%d超出范围(100)",n)
}
fmt.Print(n,"%\n")
}
returnnil
}
------------------------------------------------------------
//Formatter由自定义类型实现,用于实现该类型的自定义格式化过程。
//当格式化器需要格式化该类型的变量时,会调用其Format方法。
typeFormatterinterface{
//f用于获取占位符的旗标、宽度、精度等信息,也用于输出格式化的结果
//c是占位符中的动词
Format(fState,crune)
}
//由格式化器(Print之类的函数)实现,用于给自定义格式化过程提供信息
typeStateinterface{
//Formatter通过Write方法将格式化结果写入格式化器中,以便输出。
Write(b[]byte)(retint,errerror)
//Formatter通过Width方法获取占位符中的宽度信息及其是否被设置。
Width()(widint,okbool)
//Formatter通过Precision方法获取占位符中的精度信息及其是否被设置。
Precision()(precint,okbool)
//Formatter通过Flag方法获取占位符中的旗标[+-0#]是否被设置。
Flag(cint)bool
}
//Stringer由自定义类型实现,用于实现该类型的自定义格式化过程。
//当格式化器需要输出该类型的字符串格式时就会调用其String方法。
typeStringerinterface{
String()string
}
//Stringer由自定义类型实现,用于实现该类型的自定义格式化过程。
//当格式化器需要输出该类型的Go语法字符串(%#v)时就会调用其String方法。
typeGoStringerinterface{
GoString()string
}
------------------------------
//示例
typeUstrstring
func(usUstr)String()string{
returnstrings.ToUpper(string(us))
}
func(usUstr)GoString()string{
return`"`+strings.ToUpper(string(us))+`"`
}
func(uUstr)Format(ffmt.State,crune){
write:=func(sstring){
f.Write([]byte(s))
}
switchc{
case'm','M':
write("旗标:[")
fors:="+-0#";len(s)>0;s=s[1:]{
iff.Flag(int(s[0])){
write(s[:1])
}
}
write("]")
ifv,ok:=f.Width();ok{
write("|宽度:"+strconv.FormatInt(int64(v),10))
}
ifv,ok:=f.Precision();ok{
write("|精度:"+strconv.FormatInt(int64(v),10))
}
case's','v'://如果使用Format函数,则必须自己处理所有格式,包括%#v
ifc=='v'&&f.Flag('#'){
write(u.GoString())
}else{
write(u.String())
}
default://如果使用Format函数,则必须自己处理默认输出
write("无效格式:"+string(c))
}
}
funcmain(){
u:=Ustr("HelloWorld!")
//"-"标记和"0"标记不能同时存在
fmt.Printf("%-+0#8.5m\n",u)//旗标:[+-#]|宽度:8|精度:5
fmt.Printf("%+0#8.5M\n",u)//旗标:[+0#]|宽度:8|精度:5
fmt.Println(u)//HELLOWORLD!
fmt.Printf("%s\n",u)//HELLOWORLD!
fmt.Printf("%#v\n",u)//"HELLOWORLD!"
fmt.Printf("%d\n",u)//无效格式:d
}
------------------------------------------------------------
//Scan从标准输入中读取数据,并将数据用空白分割并解析后存入a提供
//的变量中(换行符会被当作空白处理),变量必须以指针传入。
//当读到EOF或所有变量都填写完毕则停止扫描。
//返回成功解析的参数数量。
funcScan(a...interface{})(nint,errerror)
//Scanln和Scan类似,只不过遇到换行符就停止扫描。
funcScanln(a...interface{})(nint,errerror)
//Scanf从标准输入中读取数据,并根据格式字符串format对数据进行解析,
//将解析结果存入参数a所提供的变量中,变量必须以指针传入。
//输入端的换行符必须和format中的换行符相对应(如果格式字符串中有换行
//符,则输入端必须输入相应的换行符)。
//占位符%c总是匹配下一个字符,包括空白,比如空格符、制表符、换行符。
//返回成功解析的参数数量。
funcScanf(formatstring,a...interface{})(nint,errerror)
//功能同上面三个函数,只不过从r中读取数据。
funcFscan(rio.Reader,a...interface{})(nint,errerror)
funcFscanln(rio.Reader,a...interface{})(nint,errerror)
funcFscanf(rio.Reader,formatstring,a...interface{})(nint,errerror)
//功能同上面三个函数,只不过从str中读取数据。
funcSscan(strstring,a...interface{})(nint,errerror)
funcSscanln(strstring,a...interface{})(nint,errerror)
funcSscanf(strstring,formatstring,a...interface{})(nint,errerror)
------------------------------
//示例
//对于Scan而言,回车视为空白
funcmain(){
a,b,c:="",0,false
fmt.Scan(&a,&b,&c)
fmt.Println(a,b,c)
//在终端执行后,输入abc1回车true回车
//结果abc1true
}
//对于Scanln而言,回车结束扫描
funcmain(){
a,b,c:="",0,false
fmt.Scanln(&a,&b,&c)
fmt.Println(a,b,c)
//在终端执行后,输入abc1true回车
//结果abc1true
}
//格式字符串可以指定宽度
funcmain(){
a,b,c:="",0,false
fmt.Scanf("%4s%d%t",&a,&b,&c)
fmt.Println(a,b,c)
//在终端执行后,输入1234567true回车
//结果1234567true
}
------------------------------------------------------------
//Scanner由自定义类型实现,用于实现该类型的自定义扫描过程。
//当扫描器需要解析该类型的数据时,会调用其Scan方法。
typeScannerinterface{
//state用于获取占位符中的宽度信息,也用于从扫描器中读取数据进行解析。
//verb是占位符中的动词
Scan(stateScanState,verbrune)error
}
//由扫描器(Scan之类的函数)实现,用于给自定义扫描过程提供数据和信息。
typeScanStateinterface{
//ReadRune从扫描器中读取一个字符,如果用在Scanln类的扫描器中,
//则该方法会在读到第一个换行符之后或读到指定宽度之后返回EOF。
//返回“读取的字符”和“字符编码所占用的字节数”
ReadRune()(rrune,sizeint,errerror)
//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(skipSpacebool,ffunc(rune)bool)(token[]byte,errerror)
//Width返回占位符中的宽度值以及宽度值是否被设置
Width()(widint,okbool)
//因为上面实现了ReadRune方法,所以Read方法永远不应该被调用。
//一个好的ScanState应该让Read直接返回相应的错误信息。
Read(buf[]byte)(nint,errerror)
}
------------------------------
//示例
typeUstrstring
func(u*Ustr)Scan(statefmt.ScanState,verbrune)(errerror){
vars[]byte
switchverb{
case'S':
s,err=state.Token(true,func(crune)bool{return'A'<=c&&c<='Z'})
iferr!=nil{
return
}
case's','v':
s,err=state.Token(true,func(crune)bool{return'a'<=c&&c<='z'})
iferr!=nil{
return
}
default:
returnfmt.Errorf("无效格式:%c",verb)
}
*u=Ustr(s)
returnnil
}
funcmain(){
vara,b,c,d,eUstr
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回车
//结果:
//ABCDEFGabcde
//4无效格式:x
}
------------------------------------------------------------
本文内容总结:
原文链接:https://www.cnblogs.com/golove/p/3286303.html