首页 > 编程语言 > 详细

Go语言基础值反射-runtime模块

时间:2021-05-14 09:52:37      阅读:23      评论:0      收藏:0      [点我收藏+]

runtime.Caller()  

func 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语言中的变量是分为两部分的:

  • 类型信息:预先定义好的元信息。
  • 值信息:程序运行过程中可动态变化的。

 

Go语言基础值反射-runtime模块

原文:https://www.cnblogs.com/alrenn/p/14766717.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!