runtime.Caller()
func Caller(skip int) (pc uintptr, file string, line int, ok bool)
Caller报告当前go程调用栈所执行的函数的文件和行号信息。实参skip为上溯的栈帧数,0表示Caller的调用者(Caller所在的调用栈)。(由于历史原因,skip的意思在Caller和Callers中并不相同。)函数的返回值为调用栈标识符、文件名、该调用在文件中的行号。如果无法获得信息,ok会被设为false。
package main import ( "fmt" "path" "runtime" ) // runtime.Caller() func f() { pc, file, line, ok := runtime.Caller(1) if !ok { fmt.Printf("runtime.Caller() failed\n") return } funcName := runtime.FuncForPC(pc).Name() fmt.Println(funcName) // 函数调用的函数名 fmt.Println(file) // 目前运行的函数全路径名 fmt.Println(path.Base(file)) // 取的是基名 fmt.Println(line) // 打印行号,哪一行在执行调用。 } func f1() { f() } func main() { f1() }
打开一个文件,获取一个文件的stat信息,例如文件名、文件大小。
Stat返回一个描述name指定的文件对象的FileInfo。如果指定的文件对象是一个符号链接,返回的FileInfo描述该符号链接指向的文件的信息,本函数会尝试跳转该链接。如果出错,返回的错误值为*PathError类型。
package main import ( "fmt" "os" "reflect" ) func fileStat() { fileObj, err := os.Open("./xx.log") if err != nil { fmt.Printf("open file failed err:%v", err) return } // 1.文件对象的类型 fmt.Println(reflect.TypeOf(fileObj)) // 2.获取文件对象的详细信息 fileInfo, err := fileObj.Stat() if err != nil { fmt.Printf("get file info failed, err:%v", err) return } fmt.Printf("文件的文件大小是:%dB\n", fileInfo.Size()) fmt.Printf("文件名是:%s\n", fileInfo.Name()) } func main() { fileStat() }
序列化与反序列化
package main import ( "encoding/json" "fmt" ) type person struct { Name string `json:"name"` Age int `json:"age"` } func main() { // json 反序列化, 将json格式的数据转换成结构体类型。 str := `{"name":"allen", "age":30000}` var p person json.Unmarshal([]byte(str), &p) fmt.Println(p.Name, p.Age) // json序列化, 将结构体转换成json格式 p1 := person{ Name: "chen", Age: 20, } b, err := json.Marshal(p1) if err != nil { fmt.Printf("序列化失败,错误原因是:%s", err) return } fmt.Println(string(b)) }
package main import ( "encoding/json" "fmt" ) type person struct { Name string `json:"name"` Age int `json:"age"` } //Student 学生 type Student struct { ID int Gender string Name string } //Class 班级 type Class struct { Title string Students []*Student } func jsonSerilaztion() { c := &Class{ Title: "101", Students: make([]*Student, 0, 200), } for i := 0; i < 10; i++ { stu := &Student{ Name: fmt.Sprintf("stu%02d", i), Gender: "男", ID: i, } c.Students = append(c.Students, stu) } //JSON序列化:结构体-->JSON格式的字符串 data, err := json.Marshal(c) if err != nil { fmt.Println("json marshal failed") return } fmt.Printf("json:%s\n",data, ) //fmt.Print(reflect.TypeOf(data)) //JSON反序列化:JSON格式的字符串-->结构体 str := `{"Title":"101","Students":[{"ID":0,"Gender":"男","Name":"stu00"},{"ID":1,"Gender":"男","Name":"stu01"},{"ID":2,"Gender":"男","Name":"stu02"},{"ID":3,"Gender":"男","Name":"stu03"},{"ID":4,"Gender":"男","Name":"stu04"},{"ID":5,"Gender":"男","Name":"stu05"},{"ID":6,"Gender":"男","Name":"stu06"},{"ID":7,"Gender":"男","Name":"stu07"},{"ID":8,"Gender":"男","Name":"stu08"},{"ID":9,"Gender":"男","Name":"stu09"}]}` c1 := &Class{} err = json.Unmarshal([]byte(str), c1) if err != nil { fmt.Println("json unmarshal failed!") return } //fmt.Printf("%#v\n", c1) fmt.Println(c1.Students) for _, v := range c1.Students { fmt.Println(v.Name) } } func main() { jsonSerilaztion() // json 反序列化, 将json格式的数据转换成结构体类型。 str := `{"name":"allen", "age":30000}` var p person json.Unmarshal([]byte(str), &p) fmt.Println(p.Name, p.Age) // json序列化, 将结构体转换成json格式 p1 := person{ Name: "chen", Age: 20, } b, err := json.Marshal(p1) if err != nil { fmt.Printf("序列化失败,错误原因是:%s", err) return } fmt.Println(string(b)) }
Go语言中的变量是分为两部分的:
原文:https://www.cnblogs.com/alrenn/p/14766717.html