open, err := os.Open(filePath)
os.Open() 打开filePath路径的文件,返回一个*File和err
10年积累的网站设计制作、网站设计经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站制作后付款的网站建设流程,更有乌当免费网站建设让你可以放心的选择与我们合作。scanner := bufio.NewScanner(open)
bufio.NewScanner() open即为*File,返回scanner,
for scanner.Scan() {
text := scanner.Text()
var topic Topic
if err := json.Unmarshal([]byte(text), &topic); err != nil {
return err
}
for scanner.Scan(){}可以遍历文件的每一行,即每次调用scanner,Scan()可以读入下一行,读取的内容可以调用scanner.Text()得到,Scan函数在读到一行时返回true,不再有输入时返回false。json.Unmarshal(传入[]byte(byte数组), 传入一个结构体指针)
Go中的bytevar a byte = 'a' 其实就是一个字符。
byte数组 []byte,可以与string之间互相转换
[]byte转string
var a byte = 'a'
fmt.Println(a)
var b [10]byte
b[0] = 'a'
b[1] = 'b'
b[2] = 'c'
var str string
str = string(b[:])
fmt.Println(str)
运行结果
97
abc
string转[]byte
str := "abc"
var data []byte = []byte(str)
fmt.Println(data)
运行结果
[97 98 99]
二.读写输入package repository
import (
"bufio"
"encoding/json"
"fmt"
"os"
)
type Topic struct {
Id int `json:"id"`
Title string `json:"title"`
Content string `json:"content"`
CreateTime int64 `json:"create_time"`
}
type Post struct {
Id int64 `json:"id"`
ParentId int64 `json:"parent_id"`
Content string `json:"content"`
CreatTime int64 `json:"creat_time"`
}
var (
topicIndexMap map[int64]*Topic
postIndexMap map[int64][]*Post
)
func InitTopicIndexMap() error {
open, err := os.Open("./data/topic")
if err != nil {
return err
}
scanner := bufio.NewScanner(open)
topicTmpMap := make(map[int64]*Topic)
for scanner.Scan() {
text := scanner.Text()
var topic Topic
if err := json.Unmarshal([]byte(text), &topic); err != nil {
return err
}
topicTmpMap[int64(topic.Id)] = &topic
}
topicIndexMap = topicTmpMap
for k, v := range topicIndexMap {
fmt.Println(k, *v)
//fmt.Printf("%#v")
}
return nil
}
func InitPostIndexMap() error {
open, err := os.Open("./data/post")
if err != nil {
return err
}
scanner := bufio.NewScanner(open)
postTmpMap := make(map[int64][]*Post)
for scanner.Scan() {
text := scanner.Text()
var post Post
err := json.Unmarshal([]byte(text), &post)
if err != nil {
return err
}
// 判断该帖子是否存在在postTmpMap中
// 如果存在则posts接受的是一个结构体指针切片,若不存在,则是空,则需要给他这个key创建一
个结构体指针切片
// value, true/false := map[key]
//用来判断此key在map中有没有value
posts, ok := postTmpMap[post.ParentId]
// 如果不存在,则添加一个[]*Post结构体指针切片,结构体指针切片指的是只能在切片中存放结构
体指针
if !ok {
postTmpMap[post.ParentId] = []*Post{&post}
continue
}
// 切片append,因为是结构体指针切片,所以要放结构体指针
posts = append(posts, &post)
postTmpMap[post.ParentId] = posts
}
postIndexMap = postTmpMap
for k, v := range postIndexMap {
fmt.Println(k)
for i := 0; i< len(v); i++ {
fmt.Println(*v[i])
}
}
return nil
}
package main
import (
"Gin_project/repository"
"fmt"
)
func main() {
if err := repository.InitTopicIndexMap(); err != nil {
fmt.Println(err)
}
if err := repository.InitPostIndexMap(); err != nil {
fmt.Println(err)
}
}
指针类型的变量,直接输出的是地址,要输出内容,则在前面加*即可。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧