개요
ginvalidator는 다른 오픈 소스 패키지 validatorgo에서 제공하는 광범위한 유효성 검사기 및 살균제 컬렉션을 포함하는 Gin 미들웨어 세트입니다. 또한 JSON 필드 구문에 인기 있는 오픈 소스 패키지 gjson을 사용하여 JSON 개체에서 데이터를 효율적으로 쿼리하고 추출합니다.
Gin 요청을 검증하고 정리할 수 있도록 다양한 방법으로 이를 결합할 수 있으며 요청이 유효한지 여부, 검증자에 따라 어떤 데이터가 일치했는지 확인하는 도구를 제공합니다.
인기 있는 js/express 라이브러리 express-validator를 기반으로 합니다
지원하다
이 버전의 ginvalidator를 사용하려면 애플리케이션이 Go 1.16에서 실행되어야 합니다.
Gin 1.x.x에서도 작동하는 것으로 확인되었습니다.
이론적 해석
왜 사용하지 않으시나요?
- 수기 유효성 검사기: 자신만의 유효성 검사 논리를 수동으로 작성할 수도 있지만 그렇게 하면 반복적이고 지저분해집니다. 새로운 유효성 검사가 필요할 때마다 동일한 종류의 코드를 계속해서 작성하게 됩니다. 실수하기 쉽고 유지 관리도 어렵습니다.
- Gin의 내장 모델 바인딩 및 검증: Gin에는 검증 기능이 내장되어 있지만 모든 사람에게 이상적인 것은 아닙니다. 구조체 태그는 제한적이며 코드를 읽기 어렵게 만듭니다. 특히 복잡한 규칙이 필요한 경우 더욱 그렇습니다. 게다가 유효성 검사가 모델에 너무 밀접하게 연결되어 있어 유연성이 좋지 않습니다.
- 기타 라이브러리(예: Galidator): 다른 라이브러리도 있지만 자신이 하는 일에 비해 너무 복잡하다고 느끼는 경우가 많습니다. 특히 간단하고 직접적인 검증 솔루션을 원하는 경우 예상보다 더 많은 설정과 작업이 필요합니다.
설치
컴퓨터에 Go가 설치되어 있는지 확인하세요.
1단계: 새로운 Go 모듈 생성
- 원하는 이름으로 빈 폴더를 만듭니다.
- 터미널을 열고 해당 폴더로 이동(cd)한 후 새 Go 모듈을 초기화합니다.
go mod init example.com/learning
2단계: 필수 패키지 설치
go get을 사용하여 필요한 패키지를 설치하세요.
- Gin 설치:
go get -u github.com/gin-gonic/gin
- ginvalidator 설치:
go get -u github.com/bube054/ginvalidator
시작하기
무언가를 배우는 가장 좋은 방법 중 하나는 모범을 보이는 것입니다! 이제 소매를 걷어 올리고 코딩을 시작해 보겠습니다.
설정
가장 먼저 필요한 것은 Gin 서버를 실행하는 것입니다. 누군가에게 인사하는 것을 구현해 봅시다. 이를 위해 main.go를 생성한 후 다음 코드를 추가하세요:
package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/hello", func(ctx *gin.Context) { person := ctx.Query("person") ctx.String(http.StatusOK, "Hello, %s!", person) }) r.Run() // listen and serve on 0.0.0.0:8080 }
이제 터미널에서 go run main.go를 실행하여 이 파일을 실행하세요.
go mod init example.com/learning
HTTP 서버가 실행 중이어야 하며 http://localhost:8080/hello?person=John을 열어 John에게 경의를 표할 수 있습니다!
? 팁:
Go 및 Gin과 함께 Air를 사용하여 실시간 재로드를 구현할 수 있습니다. 파일이 변경될 때마다 자동으로 서버를 다시 시작하므로 직접 수행할 필요가 없습니다!
유효성 검사기 추가
서버는 작동하고 있는데 문제가 있는 것 같네요. 특히 이름이 설정되지 않은 사람에게는 인사하고 싶지 않습니다.
예를 들어 http://localhost:8080/hello로 이동하면 "Hello"가 인쇄됩니다.
여기서 ginvalidator가 유용하게 사용됩니다. 요청을 검증하는 데 사용되는 검증기, 살균제 및 수정자를 제공합니다.
이름이 비어 있는 유효성 검사기와 Not이라는 수정자를 사용하여 개인 쿼리 문자열이 비어 있을 수 없는지 확인하는 유효성 검사기와 수정자를 추가해 보겠습니다.
go get -u github.com/gin-gonic/gin
? 참고:
간결성을 위해 코드 예제에서는 gv가 ginvalidator의 별칭으로 사용되었습니다.
이제 서버를 다시 시작하고 다시 http://localhost:8080/hello로 이동하세요. 흠, 여전히 "Hello, !"가 인쇄됩니다... 왜일까요?
유효성 검사 오류 처리
ginvalidator 유효성 검사 체인은 유효성 검사 오류를 사용자에게 자동으로 보고하지 않습니다.
그 이유는 간단합니다. 더 많은 유효성 검사기를 추가하거나 더 많은 필드에 대해 오류를 어떻게 수집하시겠습니까? 모든 오류 목록을 필드당 하나씩, 전체적으로 하나씩만 원하십니까...
따라서 다음 단계는 위의 코드를 다시 변경하는 것입니다. 이번에는 ValidationResult 함수를 사용하여 유효성 검사 결과를 확인합니다.
go get -u github.com/bube054/ginvalidator
이제 http://localhost:8080/hello에 다시 액세스하면 명확성을 위해 형식이 지정된 다음 JSON 콘텐츠가 표시됩니다.
package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/hello", func(ctx *gin.Context) { person := ctx.Query("person") ctx.String(http.StatusOK, "Hello, %s!", person) }) r.Run() // listen and serve on 0.0.0.0:8080 }
이것이 우리에게 말하는 것은
- 이 요청에는 정확히 한 가지 오류가 있습니다.
- 이 필드를 person이라고 합니다.
- 쿼리 문자열(위치: "queries")에 있습니다.
- 표시된 오류 메시지는 "잘못된 값"이었습니다.
이것은 더 나은 시나리오이지만 여전히 개선될 수 있습니다. 계속해보겠습니다.
더 나은 오류 메시지 만들기
모든 요청 위치 유효성 검사기는 오류 메시지 형식을 지정하는 데 사용되는 함수인 선택적 두 번째 인수를 허용합니다. nil이 제공되면 위의 예와 같이 기본 일반 오류 메시지가 사용됩니다.
go run main.go
이제 http://localhost:8080/hello에 다시 액세스하면 새로운 오류 메시지와 함께 다음 JSON 콘텐츠가 표시됩니다.
package main import ( "net/http" gv "github.com/bube054/ginvalidator" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/hello", gv.NewQuery("person", nil). Chain(). Not(). Empty(nil). Validate(), func(ctx *gin.Context) { person := ctx.Query("person") ctx.String(http.StatusOK, "Hello, %s!", person) }) r.Run() }
검증/삭제된 데이터에 액세스
Ginvalidator가 검증 및/또는 삭제한 모든 데이터를 자동으로 수집하는 GetMatchedData를 사용할 수 있습니다. 그런 다음 MatchedData의 Get 메서드를 사용하여 이 데이터에 액세스할 수 있습니다.
go mod init example.com/learning
http://localhost:8080/hello?person=John을 열어 John에게 경의를 표하세요!
사용 가능한 위치는 BodyLocation, CookieLocation QueryLocation, ParamLocation 및 HeaderLocation입니다.
이러한 각 위치에는 검증/삭제된 데이터가 저장되는 위치를 반환하는 문자열 메서드가 포함되어 있습니다.
입력을 정리하는 중
사용자는 더 이상 빈 사람 이름을 보낼 수 없지만 페이지에 HTML을 삽입할 수는 있습니다! 이를 XSS(Cross-Site Scripting) 취약점이라고 합니다.
그것이 어떻게 작동하는지 봅시다. http://localhost:8080/hello?person=John로 이동하면 "안녕하세요, John!"이 표시됩니다.
이 예는 괜찮지만 공격자는 개인 쿼리 문자열을 <script> 유해할 수 있는 자체 JavaScript를 로드하는 태그입니다.<br>
이 시나리오에서 ginvalidator 문제를 완화하는 한 가지 방법은 특수 HTML 문자를 텍스트로 표시할 수 있는 다른 문자로 변환하는 새니타이저, 특히 Escape를 사용하는 것입니다.<br>
</script>
go get -u github.com/gin-gonic/gin
이제 서버를 다시 시작하고 페이지를 새로 고치면 "Hello, John!"가 표시됩니다. 우리의 예시 페이지는 더 이상 XSS에 취약하지 않습니다!
⚠️ 주의:
ginvalidator는 삭제 중에 http.Request 값을 수정하지 않습니다. 정리된 데이터에 접근하려면 항상 GetMatchedData 함수를 사용하세요.
검증 체인
검증 체인은 ginvalidator의 주요 개념 중 하나이므로, 효과적으로 사용하려면 알아두는 것이 좋습니다.
하지만 걱정하지 마세요. 시작하기 가이드를 읽었다면 눈치채지도 못한 채 이미 검증 체인을 사용한 것입니다!
검증 체인이란 무엇입니까?
검증 체인은 다음 함수를 사용하여 생성되며 각각은 HTTP 요청의 특정 위치를 대상으로 합니다.
- NewBody: http.Request 본문에서 데이터의 유효성을 검사합니다. 해당 위치는 BodyLocation입니다.
- NewCookie: http.Request 쿠키의 데이터를 검증합니다. 해당 위치는 CookieLocation입니다.
- NewHeader: http.Request 헤더의 데이터 유효성을 검사합니다. 해당 위치는 HeaderLocation입니다.
- NewParam: Gin 경로 매개변수의 데이터를 검증합니다. 해당 위치는 ParamLocation입니다.
- NewQuery: http.Request 쿼리 매개변수의 데이터를 검증합니다. 해당 위치는 QueryLocation입니다.
필드 값을 유효성 검사(또는 삭제)로 래핑하고 각 메서드가 자체적으로 반환되기 때문에 이 이름이 붙었습니다.
이 패턴을 일반적으로 메서드 체이닝이라고 부르므로 유효성 검사 체인이라는 이름이 붙은 이유도 있습니다.
검증 체인에는 검증, 삭제 및 수정을 정의하는 데 유용한 여러 메서드가 있을 뿐만 아니라 Gin 미들웨어 처리기 함수를 반환하는 Validate 메서드도 있습니다.
다음은 일반적으로 검증 체인이 사용되는 방식과 이를 읽는 방법에 대한 예입니다.
go mod init example.com/learning
특징
검증 체인에는 검증기, 새니타이저, 수정자의 세 가지 메서드가 있습니다.
검사기는 요청 필드의 값이 유효한지 확인합니다. 이는 필드가 예상한 형식인지 확인하는 것을 의미합니다. 예를 들어 가입 양식을 작성하는 경우 사용자 이름은 이메일 주소여야 하고 비밀번호는 8자 이상이어야 한다는 요구 사항이 있을 수 있습니다.
값이 유효하지 않으면 일부 오류 메시지를 사용하여 해당 필드에 오류가 기록됩니다. 이 유효성 검사 오류는 나중에 Gin 경로 핸들러에서 검색하여 사용자에게 반환할 수 있습니다.
다음과 같습니다.
- CustomValidator
- 포함
- 같음
- 아바라우팅
- 이후
- 알파
- 영숫자
- 아스키
- Base32
- Base58
- Base64
- 이전
- 빅
- 부울
- BTC주소
- 바이트 길이
- 신용카드
- 통화
- 데이터URI
- 날짜
- 십진수
- DivisibleBy
- 안
- 이메일
- 비어있음
- 이더리움주소
- 플로트
- FQDN
- 화물컨테이너ID
- 전체 너비
- 반너비
- 해시
- 16진수
- 헥스컬러
- HSL
- 이반
- 신분증
- IMEI
- 에서
- 인트
- IP
- IPRange
- 아이신
- ISO4217
- ISO6346
- ISO6391
- ISO8601
- ISO31661Alpha2
- ISO31661Alpha3
- ISO31661숫자
- ISRC
- ISSN
- JSON
- 위도경
- 번호판
- 로케일
- 소문자
- 룬번호
- 맥어드레스
- 마그넷URI
- MailtoURI
- MD5
- 마임 유형
- 휴대폰
- 몽고아이디
- 멀티바이트
- 숫자
- 8진수
- 여권번호
- 항구
- 우편번호
- RFC3339
- Rgb색상
- SemVer
- 슬러그
- 강력한 비밀번호
- 납세 ID
- SurrogatePair
- 시간
- ULID
- 대문자
- URL
- UUID
- 가변 너비
- 부가가치세
- 허용됨
- 경기
Sanitizer는 필드 값을 변환합니다. 이는 값에서 노이즈를 제거하고 위협에 대한 기본적인 방어선을 제공하는 데 유용합니다.
Sanitizer는 업데이트된 필드 값을 Gin 컨텍스트에 다시 유지하므로 다른 ginvalidator 기능, 자체 경로 핸들러 코드 및 기타 미들웨어에서도 사용할 수 있습니다.
다음과 같습니다:
- CustomSanitizer
- 블랙리스트
- 탈출
- LTrim
- 이메일 표준화
- RTrim
- 스트립로우
- ToBoolean
- 오늘까지
- 플로트
- 투인트
- 트림
- 탈출
- 화이트리스트
수정자는 검증 체인이 실행될 때 작동하는 방식을 정의합니다.
다음과 같습니다:
- 보석
- 만약
- 아닙니다
- 건너뛰기
- 선택
? 참고:
이러한 방법은 pkg.go.dev ginvalidator 문서 내에서 GoDoc을 사용하여 철저하게 문서화되어 있습니다. 자세한 내용이 불분명한 경우 자세한 내용을 확인하기 위해 validatorgo 패키지 내의 관련 기능을 참조할 수도 있습니다. 이에 대해서는 아래에서 설명하겠습니다.
표준 유효성 검사기/새니타이저
검증 체인에 의해 노출되는 모든 기능은 실제로 문자열 검증/위생을 전문으로 하는 다른 오픈 소스 Go 패키지 중 하나인 validatorgo에서 제공됩니다. 꼭 보시고 별표표시하고 공유해주세요??? 감사합니다.
여기에는 일반적으로 사용되는 IsEmail, IsLength 및 Trim부터 좀 더 틈새 시장인 IsISBN, IsMultibyte 및 StripLow에 이르기까지 모든 유효성 검사기 및 검사기 및 살균제가 포함됩니다!
진밸리데이터에서는 이를 표준 유효성 검사기(Standard Validator)와 표준 살균제(Standard Sanitizer)라고 합니다. 그러나 validatorgo의 Is 접두사는 없습니다.
연결 순서
일반적으로 유효성 검사 체인에서 메서드를 호출하는 순서가 중요합니다.
거의 항상 지정된 순서대로 실행되므로 첫 번째 체인 메서드부터 마지막 메서드까지 정의만 읽어도 유효성 검사 체인이 수행하는 작업을 알 수 있습니다.
다음 스니펫을 예로 들어보세요.
go mod init example.com/learning
이 경우 사용자가 공백으로만 구성된 "search_query" 값을 전달하면 비어 있지 않으므로 유효성 검사가 통과됩니다. 하지만 .Trim() sanitizer가 있으므로 공백이 제거되고 필드가 비어 있게 되므로 실제로는 거짓 긍정이 발생하게 됩니다.
이제 아래 스니펫과 비교해 보세요.
go get -u github.com/gin-gonic/gin
이 체인은 공백을 더 현명하게 제거한 다음 값이 비어 있지 않은지 확인합니다.
이 규칙의 한 가지 예외는 .Optional()입니다. 체인의 어느 지점에나 배치할 수 있으며 체인을 선택 사항으로 표시합니다.
검증 체인 재사용
동일한 체인을 재사용하려면 함수에서 반환하는 것이 좋습니다.
go get -u github.com/bube054/ginvalidator
필드 선택
ginvalidator에서 필드는 검증되거나 삭제된 값이며 문자열입니다.
Ginvalidator 참조 필드에서 어떤 방식으로든 반환되는 거의 모든 함수 또는 값입니다. 이러한 이유로 유효성 검사를 위한 필드를 선택할 때와 유효성 검사 오류 또는 유효성이 검사된 데이터에 액세스할 때 필드 경로 구문을 이해하는 것이 중요합니다.
통사론
-
본문 필드는 다음 콘텐츠 유형에만 유효합니다.
- application/json: 값을 추출하기 위해 GJSON 경로 구문을 사용합니다. 자세한 내용은 링크된 문서를 참고해주세요.
- 예:
go mod init example.com/learning
user.name 경로를 사용하면 추출된 값은 "John"이 됩니다.
- application/x-www-form-urlencoded: 일반적으로 HTML 양식 제출에 사용됩니다. 필드는 본문에 키-값 쌍으로 제출됩니다.
- 예:
go get -u github.com/gin-gonic/gin
본문:
go get -u github.com/bube054/ginvalidator
"name" 필드의 값은 "John"이고 "email"의 값은 "john.doe@example.com"입니다.
- multipart/form-data: 일반적으로 파일 업로드 또는 파일과 함께 양식 데이터를 제출할 때 사용됩니다.
- 예:
package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/hello", func(ctx *gin.Context) { person := ctx.Query("person") ctx.String(http.StatusOK, "Hello, %s!", person) }) r.Run() // listen and serve on 0.0.0.0:8080 }
본문:
go run main.go
필드 "name"의 값은 "John"이고 "file"은 업로드된 파일입니다.
-
쿼리 필드는 URL 검색 매개변수에 해당하며 해당 값은 자동으로 Gin에 의해 이스케이프되지 않은 URL입니다.
예:- 필드: "이름", 값: "John"
package main import ( "net/http" gv "github.com/bube054/ginvalidator" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/hello", gv.NewQuery("person", nil). Chain(). Not(). Empty(nil). Validate(), func(ctx *gin.Context) { person := ctx.Query("person") ctx.String(http.StatusOK, "Hello, %s!", person) }) r.Run() }
- 필드: "full_name", 값: "John Doe"
package main import ( "net/http" gv "github.com/bube054/ginvalidator" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/hello", gv.NewQuery("person", nil). Chain(). Not(). Empty(nil). Validate(), func(ctx *gin.Context) { result, err := gv.ValidationResult(ctx) if err != nil { ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{ "message": "The server encountered an unexpected error.", }) return } if len(result) != 0 { ctx.AbortWithStatusJSON(http.StatusUnprocessableEntity, gin.H{ "errors": result, }) return } person := ctx.Query("person") ctx.String(http.StatusOK, "Hello, %s!", person) }) r.Run() }
-
매개변수 필드는 URL 경로 매개변수를 나타내며 해당 값은 ginvalidator에 의해 자동으로 이스케이프 해제됩니다.
예:- 필드: "id", 값: "123"
{ "errors": [ { "location": "queries", "message": "Invalid value", "field": "person", "value": "" } ] }
-
헤더 필드는 HTTP 요청 헤더이며 해당 값은 이스케이프되지 않습니다. 비표준 헤더 키를 제공하면 로그 경고가 나타납니다.
예:- 필드: "사용자 에이전트", 값: "Mozilla/5.0"
package main import ( "net/http" gv "github.com/bube054/ginvalidator" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/hello", gv.NewQuery("person", func(initialValue, sanitizedValue, validatorName string) string { return "Please enter your name." }, ).Chain(). Not(). Empty(nil). Validate(), func(ctx *gin.Context) { result, err := gv.ValidationResult(ctx) if err != nil { ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{ "message": "The server encountered an unexpected error.", }) return } if len(result) != 0 { ctx.AbortWithStatusJSON(http.StatusUnprocessableEntity, gin.H{ "errors": result, }) return } person := ctx.Query("person") ctx.String(http.StatusOK, "Hello, %s!", person) }) r.Run() }
-
쿠키 필드는 HTTP 쿠키이며 해당 값은 Gin에서 자동으로 이스케이프되지 않은 URL입니다.
예:- 필드: "session_id", 값: "abc 123"
{ "errors": [ { "location": "queries", "message": "Please enter your name.", "field": "person", "value": "" } ] }
Express 유효성 검사기 사용자 정의
구축 중인 서버가 매우 단순한 서버가 아닌 경우 조만간 ginvalidator에 내장된 것 이상의 유효성 검사기, 살균제 및 오류 메시지가 필요할 것입니다.
사용자 정의 유효성 검사기 및 살균기
ginvalidator가 충족할 수 없고 발생할 수 있는 전형적인 요구 사항은 사용자가 가입할 때 이메일 주소가 사용 중인지 여부를 확인하는 것입니다.
맞춤 유효성 검사기를 구현하여 ginvalidator에서 이 작업을 수행할 수 있습니다.
CustomValidator는 유효성 검사 체인에서 사용할 수 있는 메서드로, 특수 함수 CustomValidatorFunc를 수신하고 필드가 유효한지 여부를 결정하는 부울을 반환해야 합니다.
CustomSanitizer는 특수 함수 CustomSanitizerFunc를 수신하고 삭제된 새 값을 반환해야 하는 유효성 검사 체인에서 사용할 수 있는 메서드이기도 합니다.
사용자 정의 유효성 검사기 구현
CustomValidator는 동시 작업을 처리하기 위해 고루틴과 sync.WaitGroup을 사용하여 비동기식일 수 있습니다. 유효성 검사기 내에서 각 비동기 작업에 대한 고루틴을 실행하여 각 작업을 WaitGroup에 추가할 수 있습니다. 모든 작업이 완료되면 유효성 검사기는 부울을 반환해야 합니다.
예를 들어 이메일이 사용되지 않는지 확인하려면 다음과 같이 하세요.
go mod init example.com/learning
또는 비밀번호가 반복되는 비밀번호와 일치하는지 확인할 수도 있습니다.
go get -u github.com/gin-gonic/gin
⚠️ 주의사항:
동일한 유효성 검사 체인, 동일한 요청 컨텍스트에 대한 다른 유효성 검사 체인 또는 후속 핸들러에서 요청 본문에 여러 번 액세스하는 경우 각 읽기 후에 요청 본문을 재설정해야 합니다. 그렇지 않으면 본문을 다시 읽을 때 오류나 데이터 누락이 발생할 수 있습니다.
사용자 정의 새니타이저 구현
CustomSanitizer에는 규칙이 많지 않습니다. 반환되는 값이 무엇이든 필드가 획득하게 될 새로운 값입니다.
사용자 정의 새니타이저는 고루틴과 sync.WaitGroup을 사용하여 동시 작업을 처리함으로써 비동기식일 수도 있습니다.
go get -u github.com/bube054/ginvalidator
오류 메시지
필드 값이 유효하지 않을 때마다 오류 메시지가 기록됩니다.
기본 오류 메시지는 "잘못된 값"입니다. 이는 오류가 무엇인지 전혀 설명하지 않으므로 사용자 정의해야 할 수도 있습니다.
으로 맞춤설정할 수 있습니다.
package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() r.GET("/hello", func(ctx *gin.Context) { person := ctx.Query("person") ctx.String(http.StatusOK, "Hello, %s!", person) }) r.Run() // listen and serve on 0.0.0.0:8080 }
- initialValue는 요청에서 추출된 원래 값입니다(삭제 전).
- sanitizedValue는 (해당되는 경우) 정리된 후의 값입니다.
- validatorName은 실패한 유효성 검사기의 이름으로, 통과하지 못한 유효성 검사 규칙을 식별하는 데 도움이 됩니다.
검증기 이름의 전체 목록을 보려면 ginvalidator 상수를 참조하세요.
유지관리자
- bube054 - Attah Gbubemi David (저자)
위 내용은 ginvalidator를 사용하여 Go에서 Gin 입력 검증 단순화의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

Golang은 실제 응용 분야에서 탁월하며 단순성, 효율성 및 동시성으로 유명합니다. 1) 동시 프로그래밍은 Goroutines 및 채널을 통해 구현됩니다. 2) Flexible Code는 인터페이스 및 다형성을 사용하여 작성됩니다. 3) NET/HTTP 패키지로 네트워크 프로그래밍 단순화, 4) 효율적인 동시 크롤러 구축, 5) 도구 및 모범 사례를 통해 디버깅 및 최적화.

GO의 핵심 기능에는 쓰레기 수집, 정적 연결 및 동시성 지원이 포함됩니다. 1. Go Language의 동시성 모델은 고루틴 및 채널을 통한 효율적인 동시 프로그래밍을 실현합니다. 2. 인터페이스 및 다형성은 인터페이스 방법을 통해 구현되므로 서로 다른 유형을 통일 된 방식으로 처리 할 수 있습니다. 3. 기본 사용법은 기능 정의 및 호출의 효율성을 보여줍니다. 4. 고급 사용에서 슬라이스는 동적 크기 조정의 강력한 기능을 제공합니다. 5. 레이스 조건과 같은 일반적인 오류는 Getest-race를 통해 감지 및 해결할 수 있습니다. 6. 성능 최적화는 sync.pool을 통해 개체를 재사용하여 쓰레기 수집 압력을 줄입니다.

Go Language는 효율적이고 확장 가능한 시스템을 구축하는 데 잘 작동합니다. 장점은 다음과 같습니다. 1. 고성능 : 기계 코드로 컴파일, 빠른 달리기 속도; 2. 동시 프로그래밍 : 고어 라틴 및 채널을 통한 멀티 태스킹 단순화; 3. 단순성 : 간결한 구문, 학습 및 유지 보수 비용 절감; 4. 크로스 플랫폼 : 크로스 플랫폼 컴파일, 쉬운 배포를 지원합니다.

SQL 쿼리 결과의 정렬에 대해 혼란스러워합니다. SQL을 학습하는 과정에서 종종 혼란스러운 문제가 발생합니다. 최근 저자는 "Mick-SQL 기본 사항"을 읽고 있습니다.

기술 스택 컨버전스와 기술 선택의 관계, 소프트웨어 개발에서 기술 스택의 선택 및 관리는 매우 중요한 문제입니다. 최근에 일부 독자들은 ...

골란 ...

GO 언어로 세 가지 구조를 비교하고 처리하는 방법. GO 프로그래밍에서는 때때로 두 구조의 차이점을 비교하고 이러한 차이점을 ...에 적용해야합니다.

GO에서 전 세계적으로 설치된 패키지를 보는 방법? Go Language로 발전하는 과정에서 Go는 종종 사용합니다 ...


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

SecList
SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음
