本文整理汇总了Golang中github.com/bronze1man/kmg/kmgGoSource/kmgGoReader.Reader.UnreadRune方法的典型用法代码示例。如果您正苦于以下问题:Golang Reader.UnreadRune方法的具体用法?Golang Reader.UnreadRune怎么用?Golang Reader.UnreadRune使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类github.com/bronze1man/kmg/kmgGoSource/kmgGoReader.Reader
的用法示例。
在下文中一共展示了Reader.UnreadRune方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: readIdentifier
func readIdentifier(r *kmgGoReader.Reader) []byte {
buf := &bytes.Buffer{}
if r.IsEof() {
panic(r.GetFileLineInfo() + " unexcept EOF")
}
b := r.ReadRune()
if b == '_' || unicode.IsLetter(b) {
buf.WriteRune(b)
} else {
r.UnreadRune()
return nil
}
for {
if r.IsEof() {
return buf.Bytes()
}
b := r.ReadRune()
if b == '_' || unicode.IsLetter(b) || unicode.IsDigit(b) {
buf.WriteRune(b)
} else {
r.UnreadRune()
return buf.Bytes() // 不是Identifier的东西留个调用者处理
}
}
}
示例2: readType
/*
第一个字符可能为
letter -> identifier(单独的类型名,带package的类型的package部分)
"struct" struct类型开头
"func" func类型开头
"interface" interface类型开头
"*" 指针开头
"[" (数组,slice) 开头
"map[" map开头
"chan " chan开头
"chan<- " chan<- 开头
"<-chan" chan<- 开头
*/
func (gofile *File) readType(r *kmgGoReader.Reader) Type {
id := readIdentifier(r)
if len(id) == 0 {
if r.IsMatchAfter([]byte("<-chan")) {
r.MustReadMatch([]byte("<-chan"))
r.ReadAllSpace()
return ChanType{
Dir: RecvDir,
Elem: gofile.readType(r),
}
}
b := r.ReadByte()
if b == '*' {
return PointerType{
Elem: gofile.readType(r),
}
} else if b == '[' {
content := readMatchMiddleParantheses(r)
if len(content) == 1 {
return SliceType{
Elem: gofile.readType(r),
}
} else {
// 仅跳过
return ArrayType{
Elem: gofile.readType(r),
}
}
} else if b == '(' {
typ := gofile.readType(r)
r.MustReadMatch([]byte(")"))
return typ
} else {
panic(fmt.Errorf("%s unexcept %s", r.GetFileLineInfo(), string(rune(b))))
}
}
if bytes.Equal(id, []byte("struct")) {
return gofile.readStruct(r)
} else if bytes.Equal(id, []byte("interface")) {
// 仅跳过
r.ReadAllSpace()
b := r.ReadByte()
if b != '{' {
panic(fmt.Errorf("%s unexcept %s", r.GetFileLineInfo(), string(rune(b))))
}
readMatchBigParantheses(r)
return InterfaceType{}
} else if bytes.Equal(id, []byte("map")) {
b := r.ReadByte()
m := MapType{}
if b != '[' {
panic(fmt.Errorf("%s unexcept %s", r.GetFileLineInfo(), string(rune(b))))
}
m.Key = gofile.readType(r)
r.MustReadMatch([]byte("]"))
m.Value = gofile.readType(r)
return m
} else if bytes.Equal(id, []byte("func")) {
// 仅跳过
r.ReadAllSpace()
b := r.ReadByte()
if b != '(' {
panic(fmt.Errorf("%s unexcept %s", r.GetFileLineInfo(), string(rune(b))))
}
readMatchSmallParantheses(r) //跳过输入参数
r.ReadAllSpaceWithoutLineBreak()
run := r.ReadRune() //跳过输出参数
if run == '(' {
readMatchSmallParantheses(r)
} else if run == '\n' { //换行符可以标识这个函数定义结束了.
return FuncType{}
} else if unicode.IsLetter(run) || run == '[' || run == '*' || run == '<' {
r.UnreadRune() //输出参数只有一个类型
gofile.readType(r)
} else {
r.UnreadRune() //读到了其他东西,退回.
}
return FuncType{}
} else if bytes.Equal(id, []byte("chan")) {
if r.IsMatchAfter([]byte("<-")) {
r.MustReadMatch([]byte("<-"))
r.ReadAllSpace()
return ChanType{
Dir: SendDir,
Elem: gofile.readType(r),
}
} else {
//.........这里部分代码省略.........