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")
fmt.Println("a", "b", 1, 2, 3, "c", "d")
fmt.Printf("ab %d %d %d cd\n", 1, 2, 3)
if err := percent(30, 70, 90, 160); err != nil {
fmt.Println(err)
}
}
func percent(i ...int) error {
for _, n := range i {
if n > 100 {
return fmt.Errorf("数值 %d 超出范围(100)", n)
}
fmt.Print(n, "%\n")
}
return nil
}
type Formatter interface {
Format(f State, c rune)
}
type State interface {
Write(b []byte) (ret int, err error)
Width() (wid int, ok bool)
Precision() (prec int, ok bool)
Flag(c int) bool
}
type Stringer interface {
String() 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':
if c == 'v' && f.Flag('#') {
write(u.GoString())
} else {
write(u.String())
}
default:
write("无效格式:" + string(c))
}
}
func main() {
u := Ustr("Hello World!")
fmt.Printf("%-+ 0#8.5m\n", u)
fmt.Printf("%+ 0#8.5M\n", u)
fmt.Println(u)
fmt.Printf("%s\n", u)
fmt.Printf("%#v\n", u)
fmt.Printf("%d\n", u)
}
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)
}
func main() {
a, b, c := "", 0, false
fmt.Scanln(&a, &b, &c)
fmt.Println(a, b, c)
}
func main() {
a, b, c := "", 0, false
fmt.Scanf("%4s%d%t", &a, &b, &c)
fmt.Println(a, b, c)
}
type Scanner interface {
Scan(state ScanState, verb rune) error
}
type ScanState interface {
ReadRune() (r rune, size int, err error)
UnreadRune() error
SkipSpace()
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)
}