如何在平行结构里处理树形结构的数据
var t xml.Token
var inItemGroup bool
for t, err = decoder.Token(); err == nil; t, err = decoder.Token(){
switch token := t(type){
case xml.StarElement:
name := token.Name.Local
if inItemGroup{
if name == "Compile"{
// 第二步,处理标记事件
fmt.Println(name)
}
}else{
if name == "ItemGroup"{
// 第一步,找到就开启标记
inItemGroup = true
}
}
}
case xml.EndElement:
// 结束标签 </EndElement> 标记
if inItemGroup{
if token.Name.Local == "ItemGroup"{
// 第三步, 关闭标记
inItemGroup = false
}
}
}
经验和建议
字符串处理切勿造轮子
字符串转化注意错误处理
flag.Parse 记得调
新需求尽量用 json
实战!
从 VS 工程文件获取文件列表
模拟命令行拷贝文件
基础知识
字符串基本操作,和其他类型的互相转化
XML 编码处理
命令行解析
package main
import (
"bufio"
"flag"
"fmt"
"io"
"os"
"strings"
)
func fileExists(filename string) bool {
_, err := os.Stat(filename)
return err == nil || os.IsExist(err)
}
// 拷贝文件的行文
func copyFileAction(src, dst string, showProgress, force bool) {
if !force {
if fileExists(dst) {
fmt.Printf("%s exists, override? y/n\n", dst)
reader := bufio.NewReader(os.Stdin)
data, _, _ := reader.ReadLine()
if strings.TrimSpace(string(data)) != "y" {
return
}
}
}
copyFile(src, dst)
if showProgress {
fmt.Printf("'%s' -> '%s'\n", src, dst)
}
}
func copyFile(src string, dst string) (w int64, err error) {
srcFile, err := os.Open(src)
if err != nil {
fmt.Println(err.Error())
return
}
defer srcFile.Close()
dstFile, err := os.Create(dst)
if err != nil {
fmt.Println(err.Error())
return
}
defer dstFile.Close()
return io.Copy(dstFile, srcFile)
}
func main() {
var showProgress, force bool
flag.BoolVar(&force, "f", false, "force copy when existing")
flag.BoolVar(&showProgress, "v", false, "explain what is being done")
flag.Parse()
if flag.NArg() < 2 {
flag.Usage()
return
}
copyFileAction(flag.Arg(0), flag.Arg(1), showProgress, force)
}
-f:强制执行
-v:输出拷贝动作
命令行解析 GO
模拟 Linux 中的 CP 指令
模拟命令行拷贝
package main
import (
"bytes"
"encoding/xml"
"fmt"
"io/ioutil"
)
func main() {
content, err := ioutil.ReadFile("vsproj.csproj")
decoder := xml.NewDecoder(bytes.NewBuffer(content))
var t xml.Token
var inItemGroup bool
for t, err = decoder.Token(); err == nil; t, err = decoder.Token() {
switch token := t.(type) {
case xml.StartElement:
name := token.Name.Local
if inItemGroup {
if name == "Compile" {
fmt.Println(getAttributeValue(token.Attr, "Include"))
}
} else {
if name == "ItemGroup" {
inItemGroup = true
}
}
case xml.EndElement:
}
}
}
func getAttributeValue(attr []xml.Attr, name string) string {
for _, a := range attr{
if a.Name.Local == name {
return a.Value
}
}
return ""
}
package main
import (
"flag"
"fmt"
)
func style() {
// 格式化定义
methodPtr := flag.String("method", "default", "method of sample")
valuePtr := flag.Int("value", -1, "value of sample")
// 解析
flag.Parse()
fmt.Println(*methodPtr, *valuePtr)
}
func style2() {
var method string
var value int
flag.StringVar(&method, "method", "default", "method of sample")
flag.IntVar(&value, "value", -1, "value of sample")
flag.Parse()
fmt.Println(method, value)
}
func main() {
style2()
}
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println(os.Args)
}
package main
import (
"encoding/xml"
"fmt"
)
// 人物档案
type person struct {
Name string `xml:"name,attr"`
Age int `xml:"年龄"`
}
func main() {
p := person{
Name: "Davy",
Age: 18,
}
data, err := xml.MarshalIndent(p, "", " ")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(data))
var p2 person
err = xml.Unmarshal(data, &p2)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(p2)
}
// 基本数值转换
fmt.Println(strconv.Itoa(10))
fmt.Println(strconv.Atoi("711"))
// 解析
fmt.Println(strconv.ParseBool("false"))
fmt.Println(strconv.ParseFloat("3.14", 64))
// 格式化
fmt.Println(strconv.FormatBool(true))
fmt.Println(strconv.FormatInt(123, 2))
s := "hello world" // 是否包含 fmt.Println(strings.Contains(s, "hello"), strings.Contains(s, "?")) // 索引,base 0 fmt.Println(strings.Index(s, "o")) ss := "1#2#345" // 切割字符串 splitedStr := strings.Split(ss, "#") fmt.Println(splitedStr) // 合并字符串 fmt.Println(strings.Join(splitedStr, "#")) fmt.Println(strings.HasPrefix(s, "he"), strings.HasSuffix(s, "ld"))
字符串基本操作
实战
从 VS 工程文件获取文件列表
模拟命令行拷贝文件
字符串相关操作
字符串切割,合并,查找
字符串和其他类型的转化
整型布尔型浮点型
Galang 之文本编码处理
package main
import (
"bufio"
"flag"
"fmt"
"io"
"os"
"strings"
)
func fileExists(filename string) bool {
_, err := os.Stat(filename)
return err == nil || os.IsExist(err)
}
func copyFileAction(src, dst string, showProgress, force bool) {
if !force {
if fileExists(dst) {
fmt.Println("%s exists override ? y/n\n", dst)
reader := bufio.NewReader(os.Stdin)
data, _, _ := reader.ReadLine()
if strings.TrimSpace(string(data)) != "y" {
return
}
}
}
copyFile(src, dst)
if showProgress {
fmt.Println("'%s' -> '%s'\n", src, dst)
}
}
func copyFile(src, dst string) (w int64, err error) {
srcFile, err := os.Open(src)
if err != nil {
fmt.Println(err.Error())
return
}
defer srcFile.Close()
dstFile, err := os.Create(dst)
if err != nil {
fmt.Println(err.Error())
return
}
defer dstFile.Close()
return io.Copy(dstFile, srcFile)
}
func main() {
var showProgress, force bool
// 定义命令行参数
flag.BoolVar(&force, "f", false, "force copy when existing")
flag.BoolVar(&showProgress, "v", false, "explain what is being done")
flag.Parse()
// 非法命令行数量检测
if flag.NArg() < 2 {
flag.Usage()
return
}
copyFileAction(flag.Arg(0), flag.Arg(1), showProgress, force)
}
栗子吱吱吱吱
拷贝文件:从src读,写到dst
NArg 命令行参数数量的检查
获取节点属性
获取节点
字符串转换与格式化
整型和字符串转换
判断前缀和后缀是否存在