#go #go-gorm #golang-migrate
#Вперед #go-gorm #golang-миграция
Вопрос:
Я новичок в Golang и разработал базовый REST API с использованием GIN и gorm. API работает нормально, и в коде нет ошибок. Файл main.go находится ниже:
package main
import (
"fmt"
"os"
"github.com/gin-gonic/gin"
"github.com/joho/godotenv"
"github.com/usman2661/Todo-Crud-Go/controllers"
"github.com/usman2661/Todo-Crud-Go/models"
// "github.com/gin-contrib/cors"
"net/http"
)
func GoDotEnvVariable(key string) string {
// load .env file
err := godotenv.Load(".env")
if err != nil {
fmt.Println("Error loading .env file")
}
return os.Getenv(key)
}
// CORS Middleware
func CORS(c *gin.Context) {
// First, we add the headers with need to enable CORS
// Make sure to adjust these headers to your needs
c.Header("Access-Control-Allow-Origin", "http://localhost:4200")
c.Header("Access-Control-Allow-Methods", "*")
c.Header("Access-Control-Allow-Headers", "*")
c.Header("Content-Type", "application/json")
// Second, we handle the OPTIONS problem
if c.Request.Method != "OPTIONS" {
c.Next()
} else {
// Everytime we receive an OPTIONS request,
// we just return an HTTP 200 Status Code
// Like this, Angular can now do the real
// request using any other method than OPTIONS
c.AbortWithStatus(http.StatusOK)
}
}
func main() {
router := gin.Default()
host := GoDotEnvVariable("host")
port := GoDotEnvVariable("dbport")
user := GoDotEnvVariable("user")
dbname := GoDotEnvVariable("dbname")
password := GoDotEnvVariable("password")
sslmode := GoDotEnvVariable("sslmode")
models.ConnectDataBase(host, port, user, dbname, password, sslmode)
router.Use(CORS)
router.GET("/todos", controllers.GetTodos) // Get all the todos
router.POST("/todos", controllers.CreateTodo) // Create a new todo
router.GET("/todos/:id", controllers.GetTodo) // Fetch a single todo using id
router.PUT("/todos/:id", controllers.UpdateTodo) // Update and existing todo id has to be passed
router.DELETE("/todos/:id", controllers.DeleteTodo) // Delete a todo using the id
router.GET("/catagory/:username", controllers.GetCatagories) // Get the Different catagories
router.Run()
}
Но иногда он продолжает сбой при запуске, после чего он никогда не работает, и я должен перезагрузить свой компьютер, чтобы исправить это, тогда он работает. Он выдает следующее исключение
Exception 0xc0000005 0x0 0x7fff91b70fff 0x1a34e3f0000
PC=0x1a34e3f0000
runtime: unknown pc 0x1a34e3f0000
Я много искал в Интернете, но не смог найти ответа, чтобы решить эту проблему. Есть ли какое-либо решение, чтобы исправить это навсегда, а не перезагружать компьютер.
Полное исключение:
Exception 0xc0000005 0x0 0x7fff91b72fff 0x16f74c80000
PC=0x16f74c80000
syscall.Syscall6(0x7fff91794c70, 0x4, 0xc0002545c0, 0x0, 0xc000485f18, 0xc000485e90, 0x0, 0x0, 0x0, 0x0, ...)
c:/go/src/runtime/syscall_windows.go:201 0xf2
syscall.GetAddrInfoW(0xc0002545c0, 0x0, 0xc000485f18, 0xc000485e90, 0xa, 0x0)
c:/go/src/syscall/zsyscall_windows.go:1718 0xe5
net.(*Resolver).lookupIP.func1(0x0, 0x0, 0x0, 0x0, 0x0)
c:/go/src/net/lookup_windows.go:109 0x259
net.(*Resolver).lookupIP.func2(0xc00046afa0, 0xc0003f7f80)
c:/go/src/net/lookup_windows.go:146 0x32
created by net.(*Resolver).lookupIP
c:/go/src/net/lookup_windows.go:145 0x41b
goroutine 1 [select]:
net.(*Resolver).lookupIPAddr(0x168f080, 0x13839c0, 0xc0000200e0, 0x12b530e, 0x3, 0xc0004509a0, 0x9, 0x1538, 0x0, 0x0, ...)
c:/go/src/net/lookup.go:299 0x685
net.(*Resolver).internetAddrList(0x168f080, 0x13839c0, 0xc0000200e0, 0x12b530e, 0x3, 0xc0004509a0, 0xe, 0x0, 0x0, 0x0, ...)
c:/go/src/net/ipsock.go:280 0x4d4
net.(*Resolver).resolveAddrList(0x168f080, 0x13839c0, 0xc0000200e0, 0x12b5910, 0x4, 0x12b530e, 0x3, 0xc0004509a0, 0xe, 0x0, ...)
c:/go/src/net/dial.go:221 0x49d
net.(*Dialer).DialContext(0xc00029f6e8, 0x13839c0, 0xc0000200e0, 0x12b530e, 0x3, 0xc0004509a0, 0xe, 0x0, 0x0, 0x0, ...)
c:/go/src/net/dial.go:403 0x23c
github.com/lib/pq.defaultDialer.DialContext(...)
C:/Users/Usman Ali/go/pkg/mod/github.com/lib/pq@v1.1.1/conn.go:112
github.com/lib/pq.dial(0x13839c0, 0xc0000200e0, 0x137ed00, 0xc0003f7e60, 0xc00045e240, 0x0, 0x0, 0x0, 0x0)
C:/Users/Usman Ali/go/pkg/mod/github.com/lib/pq@v1.1.1/conn.go:361 0x52f
github.com/lib/pq.(*Connector).open(0xc00046af60, 0x13839c0, 0xc0000200e0, 0xc0000c5340, 0x0, 0x0)
C:/Users/Usman Ali/go/pkg/mod/github.com/lib/pq@v1.1.1/conn.go:297 0x193
github.com/lib/pq.DialOpen(0x137ed00, 0xc0003f7e60, 0xc000444600, 0x5f, 0x30001, 0x400, 0x255554aaaa, 0x39)
C:/Users/Usman Ali/go/pkg/mod/github.com/lib/pq@v1.1.1/conn.go:275 0x99
github.com/lib/pq.Open(...)
C:/Users/Usman Ali/go/pkg/mod/github.com/lib/pq@v1.1.1/conn.go:265
github.com/lib/pq.(*Driver).Open(0x16c3050, 0xc000444600, 0x5f, 0x0, 0x0, 0x0, 0x0)
C:/Users/Usman Ali/go/pkg/mod/github.com/lib/pq@v1.1.1/conn.go:48 0xa5
database/sql.dsnConnector.Connect(...)
c:/go/src/database/sql/sql.go:707
database/sql.(*DB).conn(0xc000380ea0, 0x13839c0, 0xc0000200e0, 0xc00038d401, 0x167c770, 0x10, 0xa)
c:/go/src/database/sql/sql.go:1294 0x214
database/sql.(*DB).PingContext(0xc000380ea0, 0x13839c0, 0xc0000200e0, 0xc00038d490, 0x138d920)
c:/go/src/database/sql/sql.go:799 0x9f
database/sql.(*DB).Ping(...)
c:/go/src/database/sql/sql.go:817
github.com/jinzhu/gorm.Open(0x12b9e13, 0x8, 0xc00029fdd8, 0x1, 0x1, 0x5f, 0xc000450750, 0xc00029fe00)
C:/Users/Usman Ali/go/pkg/mod/github.com/jinzhu/gorm@v1.9.16/main.go:97 0x28a
github.com/usman2661/Todo-Crud-Go/models.ConnectDataBase(0xc000365370, 0x9, 0xc000365de0, 0x4, 0xc0003fc840, 0x8, 0xc0003fd2a0, 0xb, 0xc0003fdcf0, 0xc, ...)
C:/Users/Usman Ali/go/src/github.com/usman2661/Golang-CRUD-API/models/setup.go:18 0x268
main.main()
C:/Users/Usman Ali/go/src/github.com/usman2661/Golang-CRUD-API/main.go:64 0x1e6
goroutine 18 [select]:
database/sql.(*DB).connectionOpener(0xc000380ea0, 0x1383980, 0xc00043eb80)
c:/go/src/database/sql/sql.go:1126 0xf5
created by database/sql.OpenDB
c:/go/src/database/sql/sql.go:740 0x132
goroutine 19 [select]:
net.(*Resolver).lookupIP(0x168f080, 0x1383980, 0xc00043ebc0, 0x12b530e, 0x3, 0xc0004509a0, 0x9, 0x0, 0x0, 0x0, ...)
c:/go/src/net/lookup_windows.go:151 0x1b9
net.glob..func1(0x1383980, 0xc00043ebc0, 0xc00038d4a0, 0x12b530e, 0x3, 0xc0004509a0, 0x9, 0x0, 0x0, 0x0, ...)
c:/go/src/net/hook.go:23 0x79
net.(*Resolver).lookupIPAddr.func1(0x0, 0x0, 0x0, 0x0)
c:/go/src/net/lookup.go:293 0xc2
internal/singleflight.(*Group).doCall(0x168f090, 0xc00041d6d0, 0xc0004509b0, 0xd, 0xc00043ec00)
c:/go/src/internal/singleflight/singleflight.go:95 0x35
created by internal/singleflight.(*Group).DoChan
c:/go/src/internal/singleflight/singleflight.go:88 0x2cc
rax 0x7fff8e09d84a
rbx 0x7fff8e09d848
rcx 0x77
rdi 0xffffffffffbadd11
rsi 0x0
rbp 0x16f4dec2f90
rsp 0x505affeaf0
r8 0x94b
r9 0x94b
r10 0x94b
r11 0x94b
r12 0x7fff91980000
r13 [gin] Building...
[gin] Build finished
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
<nil>
Connected to the Database!!!
[GIN-debug] GET /todos --> github.com/usman2661/Todo-Crud-Go/controllers.GetTodos (4 handlers)
[GIN-debug] POST /todos --> github.com/usman2661/Todo-Crud-Go/controllers.CreateTodo (4 handlers)
[GIN-debug] GET /todos/:id --> github.com/usman2661/Todo-Crud-Go/controllers.GetTodo (4 handlers)
Usman Ali@DRAX-LAP-UA MINGW64 ~/go/src/github.com/usman2661/Golang-CRUD-API (master)
$ gin --appPort 8080 --all -i run main.go
[gin] Listening on port 3000
[gin] Building...
[gin] Build finished
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
Exception 0xc0000005 0x0 0x7fff91b72fff 0x262e38e0000
PC=0x262e38e0000
syscall.Syscall6(0x7fff91794c70, 0x4, 0xc000444e20, 0x0, 0xc00048bf18, 0xc00048be90, 0x0, 0x0, 0x0, 0x0, ...)
c:/go/src/runtime/syscall_windows.go:201 0xf2
syscall.GetAddrInfoW(0xc000444e20, 0x0, 0xc00048bf18, 0xc00048be90, 0xa, 0x0)
c:/go/src/syscall/zsyscall_windows.go:1718 0xe5
net.(*Resolver).lookupIP.func1(0x0, 0x0, 0x0, 0x0, 0x0)
c:/go/src/net/lookup_windows.go:109 0x259
net.(*Resolver).lookupIP.func2(0xc00045dbe0, 0xc00041f260)
c:/go/src/net/lookup_windows.go:146 0x32
created by net.(*Resolver).lookupIP
c:/go/src/net/lookup_windows.go:145 0x41b
goroutine 1 [select]:
net.(*Resolver).lookupIPAddr(0x168f080, 0x13839c0, 0xc0000a2078, 0x12b530e, 0x3, 0xc000454ad0, 0x9, 0x1538, 0x0, 0x0, ...)
c:/go/src/net/lookup.go:299 0x685
net.(*Resolver).internetAddrList(0x168f080, 0x13839c0, 0xc0000a2078, 0x12b530e, 0x3, 0xc000454ad0, 0xe, 0x0, 0x0, 0x0, ...)
c:/go/src/net/ipsock.go:280 0x4d4
net.(*Resolver).resolveAddrList(0x168f080, 0x13839c0, 0xc0000a2078, 0x12b5910, 0x4, 0x12b530e, 0x3, 0xc000454ad0, 0xe, 0x0, ...)
c:/go/src/net/dial.go:221 0x49d
net.(*Dialer).DialContext(0xc00021f6e8, 0x13839c0, 0xc0000a2078, 0x12b530e, 0x3, 0xc000454ad0, 0xe, 0x0, 0x0, 0x0, ...)
c:/go/src/net/dial.go:403 0x23c
github.com/lib/pq.defaultDialer.DialContext(...)
C:/Users/Usman Ali/go/pkg/mod/github.com/lib/pq@v1.1.1/conn.go:112
github.com/lib/pq.dial(0x13839c0, 0xc0000a2078, 0x137ed00, 0xc00041f140, 0xc000425650, 0x0, 0x0, 0x0, 0x0)
C:/Users/Usman Ali/go/pkg/mod/github.com/lib/pq@v1.1.1/conn.go:361 0x52f
github.com/lib/pq.(*Connector).open(0xc00045dba0, 0x13839c0, 0xc0000a2078, 0xc0003122c0, 0x0, 0x0)
C:/Users/Usman Ali/go/pkg/mod/github.com/lib/pq@v1.1.1/conn.go:297 0x193
github.com/lib/pq.DialOpen(0x137ed00, 0xc00041f140, 0xc00042cae0, 0x5f, 0x30001, 0x262bcd6edb8, 0x255554aaaa, 0x39)
C:/Users/Usman Ali/go/pkg/mod/github.com/lib/pq@v1.1.1/conn.go:275 0x99
github.com/lib/pq.Open(...)
C:/Users/Usman Ali/go/pkg/mod/github.com/lib/pq@v1.1.1/conn.go:265
github.com/lib/pq.(*Driver).Open(0x16c3050, 0xc00042cae0, 0x5f, 0x0, 0x0, 0x0, 0x0)
C:/Users/Usman Ali/go/pkg/mod/github.com/lib/pq@v1.1.1/conn.go:48 0xa5
database/sql.dsnConnector.Connect(...)
c:/go/src/database/sql/sql.go:707
database/sql.(*DB).conn(0xc00038b380, 0x13839c0, 0xc0000a2078, 0xc000395901, 0x167c770, 0x10, 0xa)
c:/go/src/database/sql/sql.go:1294 0x214
database/sql.(*DB).PingContext(0xc00038b380, 0x13839c0, 0xc0000a2078, 0xc000395940, 0x138d920)
c:/go/src/database/sql/sql.go:799 0x9f
database/sql.(*DB).Ping(...)
c:/go/src/database/sql/sql.go:817
github.com/jinzhu/gorm.Open(0x12b9e13, 0x8, 0xc00021fdd8, 0x1, 0x1, 0x5f, 0xc000454880, 0xc00021fe00)
C:/Users/Usman Ali/go/pkg/mod/github.com/jinzhu/gorm@v1.9.16/main.go:97 0x28a
github.com/usman2661/Todo-Crud-Go/models.ConnectDataBase(0xc0003774a0, 0x9, 0xc000377f10, 0x4, 0xc0003f0970, 0x8, 0xc0003f13d0, 0xb, 0xc0003f1e20, 0xc, ...)
C:/Users/Usman Ali/go/src/github.com/usman2661/Golang-CRUD-API/models/setup.go:18 0x268
main.main()
C:/Users/Usman Ali/go/src/github.com/usman2661/Golang-CRUD-API/main.go:64 0x1e6
goroutine 20 [select]:
database/sql.(*DB).connectionOpener(0xc00038b380, 0x1383980, 0xc000415c80)
c:/go/src/database/sql/sql.go:1126 0xf5
created by database/sql.OpenDB
c:/go/src/database/sql/sql.go:740 0x132
goroutine 21 [select]:
net.(*Resolver).lookupIP(0x168f080, 0x1383980, 0xc000415cc0, 0x12b530e, 0x3, 0xc000454ad0, 0x9, 0x0, 0x0, 0x0, ...)
c:/go/src/net/lookup_windows.go:151 0x1b9
net.glob..func1(0x1383980, 0xc000415cc0, 0xc000395950, 0x12b530e, 0x3, 0xc000454ad0, 0x9, 0x0, 0x0, 0x0, ...)
c:/go/src/net/hook.go:23 0x79
net.(*Resolver).lookupIPAddr.func1(0x0, 0x0, 0x0, 0x0)
c:/go/src/net/lookup.go:293 0xc2
internal/singleflight.(*Group).doCall(0x168f090, 0xc000458640, 0xc000454ae0, 0xd, 0xc000415d00)
c:/go/src/internal/singleflight/singleflight.go:95 0x35
created by internal/singleflight.(*Group).DoChan
c:/go/src/internal/singleflight/singleflight.go:88 0x2cc
rax 0x7fff8e09d84a
rbx 0x7fff8e09d848
rcx 0x77
rdi 0xffffffffffbadd11
rsi 0x0
rbp 0x262bcb03f40
rsp 0xe0199fe670
r8 0x94b
r9 0x94b
r10 0x94b
r11 0x94b
r12 0x7fff91980000
r13 0x0
r14 0x7fff8e09d84a
r15 0xc000007a
rip 0x262e38e0000
rflags 0x10202
cs 0x33[gin] Building...
[gin] Build finished
Exception 0xc0000005 0x0 0x7fff91b70fff 0x1c8e0110000
PC=0x1c8e0110000
runtime: unknown pc 0x1c8e0110000
stack: frame={sp:0x455b3ff0c0, fp:0x0} stack=[0x0,0x455b3ff920)
000000455b3fefc0: 000001c8dffd8dc0 000000455b3ff030
000000455b3fefd0: 0000000000000000 000000455b3ff0c8
000000455b3fefe0: 000001c8dffc7820 000000455b3ff020
000000455b3feff0: 0000000000000000 00007fff8e850108
000000455b3ff000: 0000000000000000 000001c8dffc4570
000000455b3ff010: 000000455b3ff158 00007fff8ef2a8a1
000000455b3ff020: 00007fff8ef2a89b 00007fff9199ba6f
000000455b3ff030: 00007fff919800d8 000001c8dfff1b60
000000455b3ff040: 0000000000000005 000000455b3ff090
000000455b3ff050: 00007fff8ef28cd0 00007fff919b1810
000000455b3ff060: 000001c8dffc4570 0000000000000000
000000455b3ff070: 000001c800050005 00007fff8ef2a89b
000000455b3ff080: 000000000000001b 0000000000000000
000000455b3ff090: 0000000000000000 00007fff919800d8
000000455b3ff0a0: 0000000000000000 00007fff8ecd0000
000000455b3ff0b0: 0000000000000001 00007fff9199c734
000000455b3ff0c0: <000001c800000001 0000000000000000
000000455b3ff0d0: 00007fff0000ebb0 000000455b3ff1c8
000000455b3ff0e0: 000001c8dffc78f0 000000455b3ff148
000000455b3ff0f0: 0000000000250024 00007fff8e86b816
000000455b3ff100: 000001c8dffd7f80 00007fff91acc500
000000455b3ff110: 000001c8dffc4570 00007fff91acea5c
000000455b3ff120: 000001c80000094c 00007fff8e84b2d8
000000455b3ff130: 00007fff8e849138 00007fff91acc528
000000455b3ff140: 00007fff91adec6a 00007fff8e840000
000000455b3ff150: 00007fff91ad0f8c 00007fff91a00d80
000000455b3ff160: 000000451c1dc789 000001c8dffd8e18
000000455b3ff170: 000000455b3ff4d0 00000000c0000135
000000455b3ff180: 0000000000000000 0000000000000040
000000455b3ff190: 0000000000000004 00007fff91ae52f0
000000455b3ff1a0: 0000000000000001 000000455b3ff300
000000455b3ff1b0: 000001c8dfff1b60 00007fff919ae2a8
runtime: unknown pc 0x1c8e0110000
stack: frame={sp:0x455b3ff0c0, fp:0x0} stack=[0x0,0x455b3ff920)
000000455b3fefc0: 000001c8dffd8dc0 000000455b3ff030
000000455b3fefd0: 0000000000000000 000000455b3ff0c8
000000455b3fefe0: 000001c8dffc7820 000000455b3ff020
000000455b3feff0: 0000000000000000 00007fff8e850108
000000455b3ff000: 0000000000000000 000001c8dffc4570
000000455b3ff010: 000000455b3ff158 00007fff8ef2a8a1
000000455b3ff020: 00007fff8ef2a89b 00007fff9199ba6f
000000455b3ff030: 00007fff919800d8 000001c8dfff1b60
000000455b3ff040: 0000000000000005 000000455b3ff090
000000455b3ff050: 00007fff8ef28cd0 00007fff919b1810
000000455b3ff060: 000001c8dffc4570 0000000000000000
000000455b3ff070: 000001c800050005 00007fff8ef2a89b
000000455b3ff080: 000000000000001b 0000000000000000
000000455b3ff090: 0000000000000000 00007fff919800d8
000000455b3ff0a0: 0000000000000000 00007fff8ecd0000
000000455b3ff0b0: 0000000000000001 00007fff9199c734
000000455b3ff0c0: <000001c800000001 0000000000000000
000000455b3ff0d0: 00007fff0000ebb0 000000455b3ff1c8
000000455b3ff0e0: 000001c8dffc78f0 000000455b3ff148
000000455b3ff0f0: 0000000000250024 00007fff8e86b816
000000455b3ff100: 000001c8dffd7f80 00007fff91acc500
000000455b3ff110: 000001c8dffc4570 00007fff91acea5c
000000455b3ff120: 000001c80000094c 00007fff8e84b2d8
000000455b3ff130: 00007fff8e849138 00007fff91acc528
000000455b3ff140: 00007fff91adec6a 00007fff8e840000
000000455b3ff150: 00007fff91ad0f8c 00007fff91a00d80
000000455b3ff160: 000000451c1dc789 000001c8dffd8e18
000000455b3ff170: 000000455b3ff4d0 00000000c0000135
000000455b3ff180: 0000000000000000 0000000000000040
000000455b3ff190: 0000000000000004 00007fff91ae52f0
000000455b3ff1a0: 0000000000000001 000000455b3ff300
000000455b3ff1b0: 000001c8dfff1b60 00007fff919ae2a8
rax 0x7fff8e84be7c
rbx 0x7fff8e84be7a
rcx 0x41
rdi 0xffffffffffbadd11
rsi 0x0
rbp 0x455b3ff300
rsp 0x455b3ff0c0
r8 0x0
r9 0x0
r10 0x0
r11 0x94b
r12 0x7fff91980000
r13 0x0
r14 0x7fff8e84be7c
r15 0xc000007a
rip 0x1c8e0110000
rflags 0x10202
cs 0x33
fs 0x53
gs 0x2b
Комментарии:
1. Можете ли вы скопировать полную трассировку стека? если это паника, вы сможете определить строку, в которой произошла ошибка.
2. «Я должен перезагрузить свой компьютер, чтобы исправить это» это почти наверняка проблема с машиной. Приложение Go ничего не сохраняет между исполнениями; если проблема сохраняется между исполнениями, это что-то вне приложения, и если перезагрузка исправит ее, это, вероятно, на уровне ОС.
3. @ShintoPhilip Я отредактировал вопрос и теперь добавил полное исключение.
4. Сначала проверьте наличие других проблем в системе отслеживания проблем go. Поскольку это происходит из
lookupIP
, вы можете увидеть, позволяет ли настройкаGODEBUG=netdns=go
избежать проблемы.5. Это нарушение доступа. Я пока не могу точно сказать, почему. Это может быть ошибка в библиотеках go resolver. Я уже сообщал о проблемах с распознавателем go раньше. Думал, что они исправлены?
Ответ №1:
Это похоже на тупиковую ситуацию. В случае взаимоблокировки все программы, запущенные в программе, завершат работу и создадут трассировку стека, подобную той, на которую вы смотрите.
Программа будет завершена во время выполнения go. Даже если на вашем http-сервере может быть функция восстановления, восстановление из взаимоблокировок невозможно.
Комментарии:
1. это происходит очень часто со мной во время запуска, и мне приходится каждый раз перезагружать компьютер. Наверняка должна быть команда или способ сброса или устранения тупиковой ситуации?