From 30fae35383003b33e20e26f2605bf5aec44d6a41 Mon Sep 17 00:00:00 2001 From: krust Date: Wed, 19 Mar 2025 21:50:20 +0800 Subject: [PATCH] =?UTF-8?q?Toml=E5=BA=8F=E7=AF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Go入门速成/Day2/Class3 Gorm的使用.md | 111 ++++++++++++++++-- Go入门速成/Day2/ExampleCode/Gorm/config.toml | 9 ++ Go入门速成/Day2/ExampleCode/Gorm/go.mod | 20 +++- Go入门速成/Day2/ExampleCode/Gorm/go.sum | 36 ++++++ Go入门速成/Day2/ExampleCode/Gorm/main.go | 101 ++++++++++++++-- Go入门速成/Day2/ExampleCode/Toml/config.toml | 9 ++ Go入门速成/Day2/ExampleCode/Toml/go.mod | 22 ++++ Go入门速成/Day2/ExampleCode/Toml/go.sum | 52 +++++++++ Go入门速成/Day2/ExampleCode/Toml/main.go | 25 ++++ Go入门速成/Day2/序篇 Toml文件.md | 114 +++++++++++++++++++ 10 files changed, 477 insertions(+), 22 deletions(-) create mode 100644 Go入门速成/Day2/ExampleCode/Gorm/config.toml create mode 100644 Go入门速成/Day2/ExampleCode/Toml/config.toml create mode 100644 Go入门速成/Day2/ExampleCode/Toml/go.mod create mode 100644 Go入门速成/Day2/ExampleCode/Toml/go.sum create mode 100644 Go入门速成/Day2/ExampleCode/Toml/main.go create mode 100644 Go入门速成/Day2/序篇 Toml文件.md diff --git a/Go入门速成/Day2/Class3 Gorm的使用.md b/Go入门速成/Day2/Class3 Gorm的使用.md index 86c5bdf..613767a 100644 --- a/Go入门速成/Day2/Class3 Gorm的使用.md +++ b/Go入门速成/Day2/Class3 Gorm的使用.md @@ -8,19 +8,41 @@ import ( "gorm.io/driver/mysql" ) ``` -### 基本操作 -- 1、连接数据库 +### 连接数据库 ```go -const ( -USERNAME = "root" -PASSWD = "oppofindx2" -DATABASENAME = "Class" -) -dsn := fmt.Sprintf("%s:%s@tcp(127.0.0.1:3306)/%s?charset=utf8mb4&parseTime=True&loc=Local", USERNAME, PASSWD, DATABASENAME) -db := mysql.Open(dsn) +func main() { +// 初始化 Viper +viper.SetConfigName("config") // 配置文件名称(不带扩展名) +viper.SetConfigType("toml") // 配置文件类型 +viper.AddConfigPath(".") // 配置文件路径 +if err := viper.ReadInConfig(); err != nil { +log.Fatalf("Error reading config file: %v", err) +} +// 获取 database 配置 +database := map[string]string{ +"user": viper.GetString("mysql.user"), +"password": viper.GetString("mysql.password"), +"host": viper.GetString("mysql.host"), +"port": viper.GetString("mysql.port"), +"database": viper.GetString("mysql.database"), +} +// 打印 database 配置 +fmt.Println("Database Config:", database) +// 构建 DSN(数据源名称) +dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", +database["user"], +database["password"], +database["host"], +database["port"], +database["database"],) +// 连接数据库 +db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) +if err != nil { +log.Fatalf("Failed to connect to database: %v", err) +} ````` -- 2、数据库中表的定义 - - 在Gorm中,定义一张表使用的是结构体 +### 数据库定义模型(表格) +- 在Gorm中,定义一张表使用的是结构体 ```go type User struct { gorm.Model @@ -28,4 +50,69 @@ type User struct { Age int } ``` -- 自动迁移表结构(方便我们修改表,给表添加参数) \ No newline at end of file +### 自动迁移表结构与创建表格 +- 自动迁移表结构(方便我们修改表,给表添加参数),同时,如果没有该名字的表,Gorm则会创建他 +```go +if err := db.AutoMigrate(&User{}); err != nil { +log.Fatalf("Failed to auto migrate: %v", err) +} +``` +### CRUD操作 +#### 创建数据 +```go +//创建 +user:=User{ + Name: "John", + Age: 30, +} +if err := db.Create(&user).Error; err != nil { + log.Fatalf("Failed to create user: %v", err) +} +fmt.Println("User created successfully!") +``` +#### 查询数据 +```go +//搜索数 +//单一搜索 +var user1,user2,user3 User +if err := db.First(&user1, 1).Error; err != nil { + log.Fatalf("Failed to find user: %v", err) +} +user2.Name = "Jane" +if err=db.First(&user2).Error;err!=nil{ + log.Fatalf("Failed to find user: %v", err) +} +if err:=db.Where("name = ?", "Alice").First(&user3);err!=nil{ + log.Fatalf("Failed to find user: %v", err) +} +//查询多条记录 +var users []User +if err:=db.Where("age > ?", 20).Find(&users);err!=nil{ + log.Fatalf("Failed to find users: %v", err) +} +// 查询时避免RecordNotFound错误 +err := db.Where("name = ?", "Bob").First(&user).Error +if errors.Is(err, gorm.ErrRecordNotFound) { + fmt.Println("User not found") +} +``` +#### 更新记录 +- update方式 +```go +// 更新单个字段 +db.Model(&user).Update("Age", 30) +// 更新多个字段(零值需使用map) +db.Model(&user).Updates(map[string]interface{}{"Age": 30, "Name": ""}) +// 使用结构体更新(忽略零值) +db.Model(&user).Updates(User{Name: "Alice", Age: 0}) // Age不会被更新 +``` +- save方式 +``` +db.Save(&user) //更新所有字段 +db.Save(&user).Omit("Name") //更新除Name字段外的所有字段 +``` +#### 删除记录 +```go +db.Delete(&user) //软删除 +db.Unscoped().Delete(&user) //直接强制删除 +``` \ No newline at end of file diff --git a/Go入门速成/Day2/ExampleCode/Gorm/config.toml b/Go入门速成/Day2/ExampleCode/Gorm/config.toml new file mode 100644 index 0000000..891903d --- /dev/null +++ b/Go入门速成/Day2/ExampleCode/Gorm/config.toml @@ -0,0 +1,9 @@ +app_name = "Class" +port = 8080 + +[mysql] +host = "localhost" +port = 3306 +user = "yzk_study" +password = "yzk722923" +dbname="Class" \ No newline at end of file diff --git a/Go入门速成/Day2/ExampleCode/Gorm/go.mod b/Go入门速成/Day2/ExampleCode/Gorm/go.mod index ab8ee47..b67601b 100644 --- a/Go入门速成/Day2/ExampleCode/Gorm/go.mod +++ b/Go入门速成/Day2/ExampleCode/Gorm/go.mod @@ -4,9 +4,27 @@ go 1.24.1 require gorm.io/driver/mysql v1.5.7 +require ( + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/sagikazarmark/locafero v0.7.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.12.0 // indirect + github.com/spf13/cast v1.7.1 // indirect + github.com/spf13/pflag v1.0.6 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + go.uber.org/atomic v1.9.0 // indirect + go.uber.org/multierr v1.9.0 // indirect + golang.org/x/sys v0.29.0 // indirect + golang.org/x/text v0.21.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + require ( github.com/go-sql-driver/mysql v1.7.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect - gorm.io/gorm v1.25.7 // indirect + github.com/spf13/viper v1.20.0 + gorm.io/gorm v1.25.7 ) diff --git a/Go入门速成/Day2/ExampleCode/Gorm/go.sum b/Go入门速成/Day2/ExampleCode/Gorm/go.sum index f0385d3..533dcc7 100644 --- a/Go入门速成/Day2/ExampleCode/Gorm/go.sum +++ b/Go入门速成/Day2/ExampleCode/Gorm/go.sum @@ -1,9 +1,45 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo= +github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= +github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4= +github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= +github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.20.0 h1:zrxIyR3RQIOsarIrgL8+sAvALXul9jeEPa06Y0Ph6vY= +github.com/spf13/viper v1.20.0/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= +go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo= gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= gorm.io/gorm v1.25.7 h1:VsD6acwRjz2zFxGO50gPO6AkNs7KKnvfzUjHQhZDz/A= diff --git a/Go入门速成/Day2/ExampleCode/Gorm/main.go b/Go入门速成/Day2/ExampleCode/Gorm/main.go index b4ead13..de9ce26 100644 --- a/Go入门速成/Day2/ExampleCode/Gorm/main.go +++ b/Go入门速成/Day2/ExampleCode/Gorm/main.go @@ -1,24 +1,107 @@ package main import ( + "errors" "fmt" + "log" + "github.com/spf13/viper" "gorm.io/driver/mysql" "gorm.io/gorm" ) -const ( - USERNAME = "root" - PASSWD = "oppofindx2" - DATABASENAME = "Class" -) - func main() { - dsn := fmt.Sprintf("%s:%s@tcp(127.0.0.1:3306)/%s?charset=utf8mb4&parseTime=True&loc=Local", USERNAME, PASSWD, DATABASENAME) - db := mysql.Open(dsn) - print(db) + // 初始化 Viper + viper.SetConfigName("config") // 配置文件名称(不带扩展名) + viper.SetConfigType("toml") // 配置文件类型 + viper.AddConfigPath(".") // 配置文件路径 + if err := viper.ReadInConfig(); err != nil { + log.Fatalf("Error reading config file: %v", err) + } + + // 获取 database 配置 + database := map[string]string{ + "user": viper.GetString("mysql.user"), + "password": viper.GetString("mysql.password"), + "host": viper.GetString("mysql.host"), + "port": viper.GetString("mysql.port"), + "database": viper.GetString("mysql.database"), + } + + // 打印 database 配置 + fmt.Println("Database Config:", database) + + // 构建 DSN(数据源名称) + dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", + database["user"], + database["password"], + database["host"], + database["port"], + database["database"], + ) + + // 连接数据库 + db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) + if err != nil { + log.Fatalf("Failed to connect to database: %v", err) + } + + // 打印 db 对象 + fmt.Println("Database connection successful:", db) + + //自动迁移表结构 + if err := db.AutoMigrate(&User{}); err != nil { + fmt.Println("Auto migration failed:", err) + } + + fmt.Println("Auto migration successful!") + //创建 + user := User{ + Name: "John", + Age: 30, + } + if err := db.Create(&user).Error; err != nil { + log.Fatalf("Failed to create user: %v", err) + } + fmt.Println("User created successfully!") + //搜索数据 + //单一搜索 + var user1, user2, user3 User + if err := db.First(&user1, 1).Error; err != nil { + log.Fatalf("Failed to find user: %v", err) + } + user2.Name = "Jane" + if err = db.First(&user2).Error; err != nil { + log.Fatalf("Failed to find user: %v", err) + } + if err := db.Where("name = ?", "Alice").First(&user3); err != nil { + log.Fatalf("Failed to find user: %v", err) + } + //查询多条记录 + var users []User + if err := db.Where("age > ?", 20).Find(&users); err != nil { + log.Fatalf("Failed to find users: %v", err) + } + // 查询时避免RecordNotFound错误 + err = db.Where("name = ?", "Bob").First(&user).Error + if errors.Is(err, gorm.ErrRecordNotFound) { + fmt.Println("User not found") + } + //更新(UPDATE) + db.Model(&user).Update("Age", 40) + // 更新多个字段(零值需使用map) + db.Model(&user).Updates(map[string]interface{}{"Age": 30, "Name": ""}) + // 使用结构体更新(忽略零值) + db.Model(&user).Updates(User{Name: "Alice", Age: 0}) // Age不会被更新 + //更新(SAVE) + db.Save(&user) //更新所有字段 + db.Save(&user).Omit("Name") //更新除Name字段外的所有字段 + //删除 + db.Delete(&user) //软删除 + db.Unscoped().Delete(&user) //直接强制删除 } +// 定义 User 模型 type User struct { gorm.Model Name string diff --git a/Go入门速成/Day2/ExampleCode/Toml/config.toml b/Go入门速成/Day2/ExampleCode/Toml/config.toml new file mode 100644 index 0000000..91ceb93 --- /dev/null +++ b/Go入门速成/Day2/ExampleCode/Toml/config.toml @@ -0,0 +1,9 @@ +app_name = "Class" +port = 8080 + +[database] +host = "localhost" +port = 3306 +user = "yzk_study" +password = "yzk722923" +dbname="Class" \ No newline at end of file diff --git a/Go入门速成/Day2/ExampleCode/Toml/go.mod b/Go入门速成/Day2/ExampleCode/Toml/go.mod new file mode 100644 index 0000000..6f6fd76 --- /dev/null +++ b/Go入门速成/Day2/ExampleCode/Toml/go.mod @@ -0,0 +1,22 @@ +module Toml + +go 1.24.1 + +require github.com/spf13/viper v1.20.0 + +require ( + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/sagikazarmark/locafero v0.7.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.12.0 // indirect + github.com/spf13/cast v1.7.1 // indirect + github.com/spf13/pflag v1.0.6 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + go.uber.org/atomic v1.9.0 // indirect + go.uber.org/multierr v1.9.0 // indirect + golang.org/x/sys v0.29.0 // indirect + golang.org/x/text v0.21.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/Go入门速成/Day2/ExampleCode/Toml/go.sum b/Go入门速成/Day2/ExampleCode/Toml/go.sum new file mode 100644 index 0000000..83ffae6 --- /dev/null +++ b/Go入门速成/Day2/ExampleCode/Toml/go.sum @@ -0,0 +1,52 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo= +github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= +github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4= +github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= +github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.20.0 h1:zrxIyR3RQIOsarIrgL8+sAvALXul9jeEPa06Y0Ph6vY= +github.com/spf13/viper v1.20.0/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= +go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/Go入门速成/Day2/ExampleCode/Toml/main.go b/Go入门速成/Day2/ExampleCode/Toml/main.go new file mode 100644 index 0000000..3ef4c79 --- /dev/null +++ b/Go入门速成/Day2/ExampleCode/Toml/main.go @@ -0,0 +1,25 @@ +package main + +import ( + "fmt" + + "github.com/spf13/viper" +) + +func main() { + viper.SetConfigName("config") // 配置文件名称(不需要带后缀) + viper.SetConfigType("toml") // 配置文件类型 + viper.AddConfigPath(".") // 配置文件路径 + + err := viper.ReadInConfig() // 读取配置文件 + if err != nil { + fmt.Printf("配置文件读取失败: %v\n", err) + return + } + fmt.Println(viper.GetString("app_name")) + fmt.Println(viper.GetInt("port")) + fmt.Println(viper.GetString("database.host")) + fmt.Println(viper.GetInt("database.port")) + fmt.Println(viper.GetString("database.user")) + fmt.Println(viper.GetString("database.password")) +} diff --git a/Go入门速成/Day2/序篇 Toml文件.md b/Go入门速成/Day2/序篇 Toml文件.md new file mode 100644 index 0000000..f5de7b7 --- /dev/null +++ b/Go入门速成/Day2/序篇 Toml文件.md @@ -0,0 +1,114 @@ +### TOML 简介 + +TOML(Tom's Obvious, Minimal Language)是一种配置文件格式,旨在易于阅读和编写。它的语法类似于INI文件,但更强大和灵活。 + +#### 基本语法 + +1. **键值对**: + ```toml + key = "value" + ``` + +2. **字符串**: + ```toml + string = "Hello, World!" + multi_line_string = """ + This is a + multi-line string. + """ + ``` + +3. **数字**: + ```toml + integer = 42 + float = 3.14 + ``` + +4. **布尔值**: + ```toml + boolean = true + ``` + +5. **数组**: + ```toml + array = [1, 2, 3] + ``` + +6. **表(嵌套结构)**: + ```toml + [table] + key = "value" + ``` + +7. **数组表**: + ```toml + [[array_table]] + name = "Alice" + [[array_table]] + name = "Bob" + ``` + +### 使用 Go 的 Viper 解析 TOML + +在go中,有很多的库可以解析Toml,在这里我推荐使用Viper来进行处理。Viper 是一个强大的 Go 库,用于处理配置文件,支持多种格式,不仅仅是TOML。 +#### 示例代码 + +1. **创建 TOML 文件**(`config.toml`): + ```toml + app_name = "Class" + port = 8080 + + [database] + host = "localhost" + port = 3306 + user = "yzk_study" + password = "yzk722923" + ``` + +2. **使用 Viper 解析 TOML**: + ```go + package main + + import ( + "fmt" + "github.com/spf13/viper" + ) + + func main() { + // 设置配置文件名和路径 + viper.SetConfigName("config") // 文件名(不带扩展名) + viper.SetConfigType("toml") // 文件类型 + viper.AddConfigPath(".") // 查找路径 + + // 读取配置文件 + if err := viper.ReadInConfig(); err != nil { + panic(fmt.Errorf("Fatal error config file: %s \n", err)) + } + + // 获取配置值 + appName := viper.GetString("app_name") + port := viper.GetInt("port") + dbHost := viper.GetString("database.host") + dbPort := viper.GetInt("database.port") + + fmt.Printf("App Name: %s\n", appName) + fmt.Printf("Port: %d\n", port) + fmt.Printf("Database Host: %s\n", dbHost) + fmt.Printf("Database Port: %d\n", dbPort) + } + ``` + +#### 运行结果 + +```bash +App Name: MyApp +Port: 8080 +Database Host: localhost +Database Port: 5432 +``` + +### 总结 + +- **TOML** 是一种易于阅读和编写的配置文件格式。 +- **Viper** 是一个强大的 Go 库,支持多种配置文件格式,包括 TOML。 +- 通过 Viper,可以轻松读取和解析 TOML 文件中的配置项。