GO语言随笔

一、引用其他包中的方法

代码结构,main.go在工程根目录下,tool.go在tool目录下,目录结构如下:
main.go
tool
|__ tool.go
other
|__ othertools.go

代码文件如下:
tool.go代码:

package tool

func Add(l int, r int) int {
    return l + r
}

othertools.go代码
注意:此代码在other目录下,代码文件名是othertools.go,包名是othertool

package othertool

import (
    "fmt"
    "../tool" //引入tool包
)

func Sub(l int, r int) int {
    fmt.Println("in Sub", tool.Add(3,4)) // 调用tool包中的方法
    return l - r
}

main.go代码:

package main

import (
    "fmt"
    "./tool"
    "./other"
)
// 引用时输入的是目录名
func main(){
    fmt.Println("main",tool.Add(1,2))
    fmt.Println("main",othertool.Sub(3,2)) // othertool为包名
}

总结:

  1. 引入其他包时,引用的是目录名,同时要注意文件相对路径的关系
  2. 调用其他包的方法时,需要用packagename.function格式,如main.go中调用othertool.Sub
    代码输出如下:
go_test]$ go run main.go 
main 3
in Sub 7
main 1

二、json序列号与反序列化

json序列化是将对象转换称字符串,反序列化是将字符串转换称对象,下面利用系统自带的json包

import (
    "fmt"
    "encoding/json"
)

定义两个结构体,学科与学生,学生对象上包含学科列表,可以存放各科目的成绩,结构体定义如下:

type Subject struct{
	Name string `json:"subname"`
	Score int `json:"score"`
}

type Student struct {
	Name string `json:"name"`
	Age int `json:"age"`
	SubList []Subject `json:"sublist"`
}

序列化与反序列化的代码如下:

    // 定义两个学科
	var sub1 Subject
	sub1.Name = "math"
	sub1.Score = 90
	
	var sub2 Subject
	sub2.Name = "history"
	sub2.Score = 95

	// 定义学生
    var stu Student
	stu.Name = "wang"
	stu.Age = 20
	stu.SubList = make([]Subject, 0)
	stu.SubList = append(stu.SubList, sub1)
	stu.SubList = append(stu.SubList, sub2)
	
	// 序列化
	json_str, err := json.Marshal(stu)
	if err != nil {
		fmt.Println(err)
		return
	}
	
	fmt.Printf("Marshal: %s\n",json_str)
	
	// 反序列化
	var stu2 Student
	err2 := json.Unmarshal(json_str, &stu2)
	if err2 != nil {
		fmt.Println(err2)
		return
	}
	
	fmt.Println("Unmarshal:", stu2)
    
    // 打印学生的成绩
	fmt.Println("print stu2.SubList")
	for i, item := range stu2.SubList {
		fmt.Printf("  %d: %s, %d\n",i, item.Name, item.Score)
	}

执行结果:

wang@wang:~/codes/go$ go run test.go 
Marshal: {"name":"wang","age":20,"sublist":[{"subname":"math","score":90},{"subname":"history","score":95}]}
Unmarshal: {wang 20 [{math 90} {history 95}]}
print stu2.SubList
  0: math, 90
  1: history, 95

利用以上方法,进行反序列化时,需要定义相应的结构体,接收反序列化的结果。如果json字符串格式特别复杂,又不想定义结构体,可以使用下面的方法来解析

var json_str string = `{"name":"wang","age":20,"sublist":[{"subname":"math","score":90},{"subname":"history","score":95}]}`

var dat map[string]interface{}
err := json.Unmarshal([]byte(json_str), &dat)

if (nil != err){
    fmt.Println(err)
    return
}

// 打印姓名和年龄
fmt.Printf("Name:%s\n", dat["name"])
fmt.Printf("Age:%g\n", dat["age"])

// 获取学科数量
list_count := len(dat["sublist"].([]interface {}))

// 打印各科的成绩
for i := 0; i < list_count; i++ {
    sub := (dat["sublist"].([]interface {}))[i].(map[string]interface {})
    fmt.Printf("    sublist: %d, %s, %g\n",i, sub["subname"], sub["score"])
}

执行结果如下:

wang@wang:~/codes/go$ go run test.go 
Name:wang
Age:20
    sublist: 0, math, 90
    sublist: 1, history, 95

猜你喜欢

转载自blog.csdn.net/weixin_46381158/article/details/113172228