목차
^ 操作符" >^ 操作符
位运算的配置用法" >位运算的配置用法
백엔드 개발 Golang Golang의 비트 연산에 대한 자세한 설명

Golang의 비트 연산에 대한 자세한 설명

Sep 21, 2022 am 11:09 AM
go golang

이 글은 Golang의 비트 연산에 대한 심층적인 이해를 제공하고, 각 연산자에 대한 자세한 사례와 사용 방법을 소개합니다. 모두에게 도움이 되기를 바랍니다!

Golang의 비트 연산에 대한 자세한 설명

컴퓨터 메모리가 비싸고 처리 능력이 제한되었던 옛날에는 해커 스타일의 비트 연산을 사용하여 정보를 처리하는 것이 선호되는 방법이었습니다(어떤 경우에는 유일한 방법이었습니다). 오늘날까지도 비트 연산의 직접적인 사용은 하위 수준 시스템 프로그래밍, 그래픽 처리, 암호화 등과 같은 많은 컴퓨팅 분야에서 여전히 필수적인 부분입니다. [관련 권장 사항: Go 비디오 튜토리얼]

Go 프로그래밍 언어는 다음 비트 연산자를 지원합니다.

&   bitwise AND
 |   bitwise OR
 ^   bitwise XOR
&^   AND NOT
<<   left shift
>>   right shift
로그인 후 복사

이 문서의 나머지 부분에서는 각 연산자와 사용 방법에 대한 예를 자세히 설명합니다.

& 연산자

Go에서 & 연산자는 두 개의 정수 피연산자에 대해 비트 단위 AND 연산을 수행합니다. AND 연산에는 다음과 같은 속성이 있습니다: & 运算符在两个整型操作数中执行按位 AND 操作。AND 操作具有以下属性:

Given operands a, b
AND(a, b) = 1; only if a = b = 1
               else = 0
로그인 후 복사

AND 运算符具有选择性的把整型数据的位清除为 0 的好的效果。 例如,我们可以使用  & 运算符去清除(设置)最后 4 个最低有效位(LSB)全部为 0 。

func main() {
    var x uint8 = 0xAC    // x = 10101100
    x = x & 0xF0          // x = 10100000
}
로그인 후 복사

所有的位运算都支持简写的赋值形式。 例如,前面的例子可以重写为如下。

func main() {
    var x uint8 = 0xAC    // x = 10101100
    x &= 0xF0             // x = 10100000
}
로그인 후 복사

另外一个巧妙的技巧是:你可以用 & 操作去测试一个数字是奇数还是偶数。原因是当一个数字的二进制的最低位是 1 的时候,那他就是奇数。我们可以用一个数字和 1 进行 & 操作,然后在和 1 做 AND 运算,如果的到的结果是 1 ,那么这个原始的数字就是奇数

import (
    "fmt"
    "math/rand"
)
func main() {
    for x := 0; x < 100; x++ {
        num := rand.Int()
        if num&1 == 1 {
            fmt.Printf("%d is odd\n", num)
        } else {
            fmt.Printf("%d is even\n", num)
        }
    }
}
로그인 후 복사

Playground 上运行上面的例子

| 对其整型操作数执行按位操作。回想一下操作符具备以下性质:

Given operands a, b
OR(a, b) = 1; when a = 1 or b = 1
              else = 0
로그인 후 복사

我们可以利用按位操作符为给定的整数有选择地设置单个位。例如,在如下示例中我们使用按位将示例数(从低位到高位(MSB))中的第 3 ,第 7 和第 8 位置为 1 。

func main() {
    var a uint8 = 0
    a |= 196
    fmt.Printf("%b", a)
}

// 打印结果  11000100
            ^^   ^
로그인 후 복사

练习场中可运行范例。

在使用位掩码技术为给定的整型数字设置任意位时,运算非常有用。例如,我们可以扩展之前的程序为变量 a 存储的值设置更多的位。

func main() {
    var a uint8 = 0
    a |= 196
    a |= 3
    fmt.Printf("%b", a)
}

// 打印结果 11000111
로그인 후 복사

练习场中可以运行范例。

在前面的程序里,不仅要按位设置十进制的 196,而且要设置低位上的十进制 3。我们还可以继续(上更多的值)设置完所有的位。

现在,回顾一下 AND(a, 1) = a 当且仅当 a = 1。 我们可以利用这个特性去查询其设置位的值。例如,在上述代码中 a & 196 会返回 196 是因为这几位的值在 a 中确实都存在。所以我们可以结合使用 ORAND 运算的方式来分别设置和读取某位的配置值。.

接下来的源码片段演示了这个操作。函数 procstr 会转换字符串的内容。它需要两个参数:第一个, str,是将要被转换的字符串,第二个, conf,是一个使用位掩码的方式指定多重转换配置的整数。

const (
    UPPER  = 1 // 大写字符串
    LOWER  = 2 // 小写字符串
    CAP    = 4 // 字符串单词首字母大写
    REV    = 8 // 反转字符串
)

func main() {
    fmt.Println(procstr("HELLO PEOPLE!", LOWER|REV|CAP))
}

func procstr(str string, conf byte) string {
    // 反转字符串
    rev := func(s string) string {
        runes := []rune(s)
        n := len(runes)
        for i := 0; i < n/2; i++ {
            runes[i], runes[n-1-i] = runes[n-1-i], runes[i]
        }
        return string(runes)
    }

    // 查询配置中的位操作
    if (conf & UPPER) != 0 {
        str = strings.ToUpper(str)
    }
    if (conf & LOWER) != 0 {
        str = strings.ToLower(str)
    }
    if (conf & CAP) != 0 {
        str = strings.Title(str)
    }
    if (conf & REV) != 0 {
        str = rev(str)
    }
    return str
}
로그인 후 복사

在 Playground上面运行代码.

上面的 procstr("HELLO PEOPLE!", LOWER|REV|CAP) 方法会把字符串变成小写,然后反转字符串,最后把字符串里面的单词首字母变成大写。这个功能是通过设置 conf 里的第二,三,四位的值为 14 来完成的。然后代码使用连续的 if 语句块来获取这些位操作进行对应的字符串转换。

在 Go 中 按位 异或 操作是用 ^ 来表示的。 异或运算符有如下的特点:

Given operands a, b
XOR(a, b) = 1; only if a != b
     else = 0
로그인 후 복사

异或

func main() {
    var a uint16 = 0xCEFF
    a ^= 0xFF00 // same a = a ^ 0xFF00
}

// a = 0xCEFF   (11001110 11111111)
// a ^=0xFF00   (00110001 11111111)
로그인 후 복사

AND 연산자는 정수 데이터의 비트를 선택적으로 0으로 지우는 좋은 효과를 갖습니다. 예를 들어 & 연산자를 사용하여 마지막 4개의 최하위 비트(LSB)를 모두 0으로 지울 수 있습니다. 🎜
func main() {
    a, b := -12, 25
    fmt.Println("a and b have same sign?", (a ^ b) >= 0)
}
로그인 후 복사
🎜모든 비트 연산은 축약된 할당 형식을 지원합니다. 예를 들어 이전 예제를 다음과 같이 다시 작성할 수 있습니다. 🎜
func main() {
    var a byte = 0x0F
    fmt.Printf("%08b\n", a)
    fmt.Printf("%08b\n", ^a)
}

// 打印结果
00001111     // var a
11110000     // ^a
로그인 후 복사
🎜또 다른 멋진 요령은 & 연산을 사용하여 숫자가 홀수인지 짝수인지 테스트할 수 있다는 것입니다. 그 이유는 숫자의 최하위 비트가 1이면 홀수이기 때문입니다. 숫자와 1을 사용하여 & 연산을 수행한 다음 1을 사용하여 AND 연산을 수행할 수 있습니다. 결과가 1이면 원래 숫자는 홀수입니다. 🎜
Given operands a, b
AND_NOT(a, b) = AND(a, NOT(b))
로그인 후 복사
로그인 후 복사
🎜 Playground🎜🎜🎜🎜🎜🎜| Operator🎜🎜🎜|는 정수 피연산자에 대해 비트 <code> 또는 연산을 수행합니다. 또는 연산자에는 다음과 같은 속성이 있다는 점을 기억하세요. 🎜
AND_NOT(a, 1) = 0; clears a
AND_NOT(a, 0) = a;
로그인 후 복사
로그인 후 복사
🎜 비트 단위 또는 연산자를 사용하여 주어진 정수에 대해 개별 비트를 선택적으로 설정할 수 있습니다. 예를 들어, 다음 예에서는 비트별 또는 를 사용하여 샘플 번호의 3번째, 7번째, 8번째 비트(낮은 비트부터 높은 비트(MSB)까지)를 1로 설정합니다. 🎜
func main() {
    var a byte = 0xAB
     fmt.Printf("%08b\n", a)
     a &^= 0x0F
     fmt.Printf("%08b\n", a)
}

// 打印:
10101011
10100000
로그인 후 복사
로그인 후 복사
🎜
예제는 연습장에서 달릴 수 있습니다 🎜. 🎜🎜 또는 연산은 비트 마스킹 기술을 사용하여 주어진 정수에 대해 임의의 비트를 설정할 때 매우 유용합니다. 예를 들어, 이전 프로그램을 확장하여 a 변수에 저장된 값에 대해 더 많은 비트를 설정할 수 있습니다. 🎜
Given integer operands a and n,
a << n; shifts all bits in a to the left n times
a >> n; shifts all bits in a to the right n times
로그인 후 복사
로그인 후 복사
🎜예제는
Playing Ground🎜에서 실행하실 수 있습니다. 🎜🎜이전 프로그램에서는 비트 단위로 10진수 196을 설정해야 할 뿐만 아니라, 하위 비트에 10진수 3도 설정해야 했습니다. 계속해서( 또는 에 더 많은 값) 모든 비트를 설정할 수 있습니다. 🎜🎜🎜🎜🎜 비트 연산의 구성 사용법🎜🎜🎜이제 AND(a, 1) = a a = 1인 경우에만을 검토하세요. 이 기능을 사용하여 설정 비트 값을 쿼리할 수 있습니다. 예를 들어 위 코드에서 a & 196은 이 비트의 값이 a에 존재하기 때문에 196을 반환합니다. 따라서 ORAND 연산을 조합하여 사용하여 각각 특정 비트의 구성 값을 설정하고 읽을 수 있습니다. .🎜🎜다음 소스 코드 조각은 이 작업을 보여줍니다. procstr 함수는 문자열의 내용을 변환합니다. 여기에는 두 개의 매개변수가 필요합니다. 첫 번째 매개변수 str는 변환할 문자열이고 두 번째 매개변수 conf는 구성을 변환하기 위한 여러 정수를 지정하는 비트마스크입니다. 🎜
func main() {
    var a int8 = 3
    fmt.Printf("%08b\n", a)
    fmt.Printf("%08b\n", a<<1)
    fmt.Printf("%08b\n", a<<2)
    fmt.Printf("%08b\n", a<<3)
}

// 输出的结果:
00000011
00000110
00001100
00011000
로그인 후 복사
로그인 후 복사
🎜플레이그라운드에서 코드를 실행하세요.🎜🎜위의 procstr("HELLO PEOPLE!", LOWER|REV|CAP) 메서드는 문자열을 소문자로 변환한 다음 문자열을 반전시키고 마지막으로 문자열에 있는 단어의 첫 글자를 대문자로 표시합니다. 이 기능은 conf의 두 번째, 세 번째, 네 번째 비트를 14 값으로 설정하여 수행됩니다. 그런 다음 코드는 연속적인 if 문 블록을 사용하여 이러한 비트 연산을 얻고 해당 문자열 변환을 수행합니다. 🎜🎜🎜🎜🎜^ 연산자 🎜🎜🎜Go에서 비트별 XOR 연산은 ^로 표현됩니다. XOR 연산자에는 다음과 같은 특징이 있습니다. 🎜
func main() {
 var a uint8 = 120
 fmt.Printf("%08b\n", a)
 fmt.Printf("%08b\n", a>>1)
 fmt.Printf("%08b\n", a>>2)
}

// 打印:
01111000
00111100
00011110
로그인 후 복사
로그인 후 복사
🎜 XOR 연산자의 이 기능은 이진 비트의 한 값을 다른 값으로 변경하는 데 사용할 수 있습니다. 예를 들어, 16진수 값이 주어지면 다음 코드를 사용하여 값의 처음 8비트(MSB에서 시작)를 전환할 수 있습니다. 🎜
func main() {
    var a uint16 = 0xCEFF
    a ^= 0xFF00 // same a = a ^ 0xFF00
}

// a = 0xCEFF   (11001110 11111111)
// a ^=0xFF00   (00110001 11111111)
로그인 후 복사

在前面的代码片段中,与 1 进行异或的位被翻转(从 0 到 1 或从 1 到  0)。异或 运算的一个实际用途,例如,可以利用 异或运算去比较两个数字的符号是否一样。当 (a ^ b) ≥ 0 (或相反符号的 (a ^ b) < 0 )为 true 的时候,两个整数 a,b 具有相同的符号,如下面的程序所示:

func main() {
    a, b := -12, 25
    fmt.Println("a and b have same sign?", (a ^ b) >= 0)
}

在 Go 的 Playground运行代码。

当执行上面这个程序的时候,将会打印出:a and b have same sign? false。在 Go Playground 上修改程序里 a ,b 的符号,以便看到不同的结果。

^ 作为取反位运算符 (非)

不像其他语言 (c/c++,Java,Python,Javascript,等), Go 没有专门的一元取反位运算符。取而代之的是,XOR 运算符 ^,也可作为一元取反运算符作用于一个数字。对于给定位 x,在 Go 中 x = 1 ^ x 可以翻转该位。在以下的代码段中我们可以看到使用 ^a 获取变量 a 的取反值的操作。

func main() {
    var a byte = 0x0F
    fmt.Printf("%08b\n", a)
    fmt.Printf("%08b\n", ^a)
}

// 打印结果
00001111     // var a
11110000     // ^a
로그인 후 복사

练习场中可以运行范例。

&^ 操作符

&^ 操作符意为 与非,是 操作符的简写形式,它们定义如下。

Given operands a, b
AND_NOT(a, b) = AND(a, NOT(b))
로그인 후 복사
로그인 후 복사

如果第二个操作数为 1 那么它则具有清除第一个操作数中的位的趣味特性。

AND_NOT(a, 1) = 0; clears a
AND_NOT(a, 0) = a;
로그인 후 복사
로그인 후 복사

接下来的代码片段使用 AND NOT 操作符,将变量值1010 1011变为 1010 0000,清除了操作数上的低四位。

func main() {
    var a byte = 0xAB
     fmt.Printf("%08b\n", a)
     a &^= 0x0F
     fmt.Printf("%08b\n", a)
}

// 打印:
10101011
10100000
로그인 후 복사
로그인 후 복사

练习场中运行范例。

<< 和 >> 操作符

与其他 C 的衍生语言类似, Go 使用 << 来表示左移运算符和右移运算符,如下所示:

Given integer operands a and n,
a << n; shifts all bits in a to the left n times
a >> n; shifts all bits in a to the right n times
로그인 후 복사
로그인 후 복사

例如,在下面的代码片段中变量 a00000011)的值将会左移位运算符分别移动三次。每次输出结果都是为了说明左移的目的。

func main() {
    var a int8 = 3
    fmt.Printf("%08b\n", a)
    fmt.Printf("%08b\n", a<<1)
    fmt.Printf("%08b\n", a<<2)
    fmt.Printf("%08b\n", a<<3)
}

// 输出的结果:
00000011
00000110
00001100
00011000
로그인 후 복사
로그인 후 복사

Playground 运行代码

注意每次移动都会将低位右侧补零。相对应,使用右移位操作符进行运算时,每个位均向右方移动,空出的高位补零,如下示例 (有符号数除外,参考下面的算术移位注释)。

func main() {
 var a uint8 = 120
 fmt.Printf("%08b\n", a)
 fmt.Printf("%08b\n", a>>1)
 fmt.Printf("%08b\n", a>>2)
}

// 打印:
01111000
00111100
00011110
로그인 후 복사
로그인 후 복사

练习场中可以运行范例。

可以利用左移和右移运算中,每次移动都表示一个数的 2 次幂这个特性,来作为某些乘法和除法运算的小技巧。例如,如下代码中,我们可以使用右移运算将 200(存储在变量 a 中)除以 2 。

func main() {
    a := 200
    fmt.Printf("%d\n", a>>1)
}

// 打印:
100
로그인 후 복사

练习场 中可以运行范例。

或是通过左移 2 位,将一个数乘以4:

func main() {
    a := 12
    fmt.Printf("%d\n", a<<2)
}
// 打印:

48
로그인 후 복사

练习场 中可以运行范例。

位移运算符提供了有趣的方式处理二进制值中特定位置的值。例如,下列的代码中,|<< 用于设置变量 a 的第三个 bit 位。

func main() {
    var a int8 = 8
    fmt.Printf("%08b\n", a)
    a = a | (1<<2)
    fmt.Printf("%08b\n", a)
}
// prints:
00001000
00001100
로그인 후 복사

可以在 练习场 中运行代码示例。

或者,您可以组合位移运算符和 & 测试是否设置了第n位,如下面示例所示:

func main() {
    var a int8 = 12
    if a&(1<<2) != 0 {
        fmt.Println("take action")
    }
}

// 打印:
take action
로그인 후 복사

练习场中运行代码。

使用  &^ 和位移运算符,我们可以取消设置一个值的某个位。例如,下面的示例将变量 a 的第三位置为 0 :

func main() {
    var a int8 = 13 
    fmt.Printf("%04b\n", a)
    a = a &^ (1 << 2)
    fmt.Printf("%04b\n", a)
}

// 打印:
1101
1001
로그인 후 복사

练习场 中运行代码。

关于算术位移运算的笔记

当要位移的值(左操作数)是有符号值时,Go 自动应用算术位移。在右移操作期间,复制(或扩展)二进制补码符号位以填充位移的空隙。

요약

다른 최신 연산자와 마찬가지로 Go는 모든 이진 비트 조작 연산자를 지원합니다. 이 문서에서는 이러한 연산자를 사용하여 수행할 수 있는 다양한 해킹의 예를 제공할 뿐입니다. 웹에서 많은 기사, 특히 Sean Eron Anderson의 Bit Twiddling Hacks을 찾을 수 있습니다.

트위터에서 Vladim @vladimirvivien을 팔로우하세요.

Go를 배우고 있다면 Vladimir Vivien의 Go에 관한 책 Learning Go 프로그래밍을 읽어보세요.

이 기사는 원래 Vladimir Vivien 작가가 Bit Hacking with Go라는 제목으로 Medium에 게시한 것입니다.

영어 원본 주소: https://dev.to/vladimirvivien/bit-hacking-with-go

더 많은 프로그래밍 관련 지식을 보려면 프로그래밍 비디오를 방문하세요! !

위 내용은 Golang의 비트 연산에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

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

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Golang을 사용하여 파일을 안전하게 읽고 쓰는 방법은 무엇입니까? Golang을 사용하여 파일을 안전하게 읽고 쓰는 방법은 무엇입니까? Jun 06, 2024 pm 05:14 PM

Go에서는 안전하게 파일을 읽고 쓰는 것이 중요합니다. 지침은 다음과 같습니다. 파일 권한 확인 지연을 사용하여 파일 닫기 파일 경로 유효성 검사 컨텍스트 시간 초과 사용 다음 지침을 따르면 데이터 보안과 애플리케이션의 견고성이 보장됩니다.

Golang 데이터베이스 연결을 위한 연결 풀을 구성하는 방법은 무엇입니까? Golang 데이터베이스 연결을 위한 연결 풀을 구성하는 방법은 무엇입니까? Jun 06, 2024 am 11:21 AM

Go 데이터베이스 연결을 위한 연결 풀링을 구성하는 방법은 무엇입니까? 데이터베이스 연결을 생성하려면 데이터베이스/sql 패키지의 DB 유형을 사용하고, 최대 동시 연결 수를 제어하려면 MaxIdleConns를 설정하고, 연결의 최대 수명 주기를 제어하려면 ConnMaxLifetime을 설정하세요.

Golang 단위 테스트에서 어설션에 gomega를 사용하는 방법은 무엇입니까? Golang 단위 테스트에서 어설션에 gomega를 사용하는 방법은 무엇입니까? Jun 05, 2024 pm 10:48 PM

Golang 단위 테스트에서 어설션에 Gomega를 사용하는 방법 Golang 단위 테스트에서 Gomega는 개발자가 테스트 결과를 쉽게 확인할 수 있도록 풍부한 어설션 방법을 제공하는 인기 있고 강력한 어설션 라이브러리입니다. Gomegagoget-ugithub.com/onsi/gomega 설치 어설션에 Gomega 사용 다음은 어설션에 Gomega를 사용하는 몇 가지 일반적인 예입니다. 1. 동등 어설션 import "github.com/onsi/gomega" funcTest_MyFunction(t*testing.T){

Golang 프레임워크 vs. Go 프레임워크: 내부 아키텍처와 외부 기능 비교 Golang 프레임워크 vs. Go 프레임워크: 내부 아키텍처와 외부 기능 비교 Jun 06, 2024 pm 12:37 PM

GoLang 프레임워크와 Go 프레임워크의 차이점은 내부 아키텍처와 외부 기능에 반영됩니다. GoLang 프레임워크는 Go 표준 라이브러리를 기반으로 하며 기능을 확장하는 반면, Go 프레임워크는 특정 목적을 달성하기 위해 독립적인 라이브러리로 구성됩니다. GoLang 프레임워크는 더 유연하고 Go 프레임워크는 사용하기 더 쉽습니다. GoLang 프레임워크는 성능 면에서 약간의 이점이 있고 Go 프레임워크는 확장성이 더 좋습니다. 사례: gin-gonic(Go 프레임워크)은 REST API를 구축하는 데 사용되고 Echo(GoLang 프레임워크)는 웹 애플리케이션을 구축하는 데 사용됩니다.

JSON 데이터를 Golang의 데이터베이스에 저장하는 방법은 무엇입니까? JSON 데이터를 Golang의 데이터베이스에 저장하는 방법은 무엇입니까? Jun 06, 2024 am 11:24 AM

JSON 데이터는 gjson 라이브러리 또는 json.Unmarshal 함수를 사용하여 MySQL 데이터베이스에 저장할 수 있습니다. gjson 라이브러리는 JSON 필드를 구문 분석하는 편리한 방법을 제공하며, json.Unmarshal 함수에는 JSON 데이터를 비정렬화하기 위한 대상 유형 포인터가 필요합니다. 두 방법 모두 SQL 문을 준비하고 삽입 작업을 수행하여 데이터를 데이터베이스에 유지해야 합니다.

Golang 프레임워크의 오류 처리에 대한 모범 사례는 무엇입니까? Golang 프레임워크의 오류 처리에 대한 모범 사례는 무엇입니까? Jun 05, 2024 pm 10:39 PM

모범 사례: 잘 정의된 오류 유형(오류 패키지)을 사용하여 사용자 정의 오류 생성 자세한 내용 제공 오류를 적절하게 기록 오류를 올바르게 전파하고 컨텍스트를 추가하기 위해 필요에 따라 오류를 숨기거나 억제하지 않음

Golang 정규 표현식과 일치하는 첫 번째 하위 문자열을 찾는 방법은 무엇입니까? Golang 정규 표현식과 일치하는 첫 번째 하위 문자열을 찾는 방법은 무엇입니까? Jun 06, 2024 am 10:51 AM

FindStringSubmatch 함수는 정규 표현식과 일치하는 첫 번째 하위 문자열을 찾습니다. 이 함수는 일치하는 하위 문자열이 포함된 조각을 반환합니다. 첫 번째 요소는 전체 일치 문자열이고 후속 요소는 개별 하위 문자열입니다. 코드 예: regexp.FindStringSubmatch(text,pattern)는 일치하는 하위 문자열의 조각을 반환합니다. 실제 사례: 이메일 주소의 도메인 이름을 일치시키는 데 사용할 수 있습니다. 예를 들어 이메일:="user@example.com", 패턴:=@([^\s]+)$를 사용하여 도메인 이름 일치를 가져옵니다. [1].

golang 프레임워크의 일반적인 보안 문제를 해결하는 방법은 무엇입니까? golang 프레임워크의 일반적인 보안 문제를 해결하는 방법은 무엇입니까? Jun 05, 2024 pm 10:38 PM

Go 프레임워크에서 일반적인 보안 문제를 해결하는 방법 웹 개발에서 Go 프레임워크가 널리 채택됨에 따라 보안을 보장하는 것이 중요해졌습니다. 다음은 샘플 코드를 통해 일반적인 보안 문제를 해결하기 위한 실용적인 가이드입니다. 1. SQL 주입 SQL 주입 공격을 방지하려면 준비된 문이나 매개변수화된 쿼리를 사용하세요. 예: constquery="SELECT*FROMusersWHEREusername=?"stmt,err:=db.Prepare(query)iferr!=nil{//Handleerror}err=stmt.QueryR

See all articles