首页 文章资讯内容详情

Golang学习 - fmt 包

2026-06-01 4 花语

本文内容纲要:

------------------------------------------------------------ //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{ casem,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)) } cases,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{ caseS: s,err=state.Token(true,func(crune)bool{returnA<=c&&c<=Z}) iferr!=nil{ return } cases,v: s,err=state.Token(true,func(crune)bool{returna<=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