>  기사  >  백엔드 개발  >  Go 포인터란 무엇입니까? 마스터해야 할 지식 포인트는 무엇입니까?

Go 포인터란 무엇입니까? 마스터해야 할 지식 포인트는 무엇입니까?

藏色散人
藏色散人앞으로
2021-09-17 16:28:322226검색

이 글은 go 언어 튜토리얼 칼럼에서 소개한 Go 포인터란 무엇입니까? 마스터해야 할 지식 포인트는 무엇입니까? 포인터에 대한 11가지 지식 포인트를 소개하는 글입니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!

Go 포인터란 무엇입니까? 마스터해야 할 지식 포인트는 무엇입니까?

1. 포인터란 무엇인가요?

포인터는 가리키는 주소를 저장하는 변수입니다. 특정 유형의 포인터는 해당 유형만 가리킬 수 있습니다(데이터 유형은 변경할 수 없습니다).

2. Go 포인터란 무엇입니까? 마스터해야 할 지식 포인트는 무엇입니까?Lang 포인터 구문

포인터 구문은 매우 간단합니다. 다음은 Go 포인터란 무엇입니까? 마스터해야 할 지식 포인트는 무엇입니까?의 포인터 선언 구문입니다.

var ptr *typevar ptrint *int     // 指向 int 的指针
포인터의 0 값은 nil

입니다.

3. Go 포인터란 무엇입니까? 마스터해야 할 지식 포인트는 무엇입니까?에서 포인터 초기화

유형 포인터는 &를 사용하여 초기화됩니다.

package mainimport (
    "fmt")func main() {
    var q int = 42
    var p *int     // declare the pointer
    p = &q         // initialize the pointer
    fmt.Println(p)  // 0x40e020}

4. Go 포인터란 무엇입니까? 마스터해야 할 지식 포인트는 무엇입니까? 포인터 값은 포인터를 가져오는 것을 의미합니다. 주소. 다음은 * 연산자를 사용하여 포인터 값 연산을 수행하는 예입니다.

package mainimport (
    "fmt")func main() {
    var q int = 42
    var p *int
    p = &q
    fmt.Println(p)  // 0x40e020
    fmt.Println(*p) // 42}
& 对其进行初始化:
package mainimport (
    "fmt")func main() {   
    i := 64
    j := &i  // j 是 int 类型的指针
    k := &j  // k 是存放指针地址的指针,也是 int 类型

    fmt.Println(i)  // 64

    fmt.Println(j)  // 0x40e020 

    fmt.Println(*j) // 64 (value inside that address)

    fmt.Println(k)  // 0x40c138

    fmt.Println(*k) // 0x40e020 (address of j)}

4. Go 포인터란 무엇입니까? 마스터해야 할 지식 포인트는 무엇입니까? 指针取值

指针取值意味着获取指针保存的地址内的值。下面是使用 * 运算符执行指针取值操作的示例:

package mainimport (
    "fmt")func main() {   
    var a interface{}
    b := &a
    fmt.Println(b)    // 0x40c138
    fmt.Println(*b)   // <nil>}</nil>

5. Go 포인터란 무엇입니까? 마스터해야 할 지식 포인트는 무엇입니까?Lang 中指针的指针

指针的地址为一个数值,此数值也可以被赋值给其他变量。因此,我们可以创建间接级别。这些间接级别有时会产生不必要的混淆,所以请谨慎使用。

package mainimport (
    "fmt")// 定义接口type Bird interface{
    fly()}type B struct{
    name string}// 实现它func (b B)fly() {
    fmt.Println("Flying...")}func main() {   
    var a Bird = B{"Peacock"}
    b := &a
    fmt.Println(b)    // 0x40c138
    fmt.Println(*b)   // {Peacock}}

6. 指向接口的指针

指针可以指向任何东西,甚至可以指向接口。当使用空接口时,返回的值为 nil

package mainimport (
    "fmt")//声明指针参数func f(a *int) {
    fmt.Println(*a)}func main() {   
    var a int = 42

    // 传递地址
    f(&a) // 42}

下面是一个使用带有指针接口的例子。

package mainimport (
    "fmt")type Human struct {
    name string
    age int
    place string}func f(h *Human) {
    fmt.Println("The user", (*h).name, "is", (*h).age, "years old and he is from", (*h).place)}func main() {   
    john := Human{"John", 36, "Las Vegas"}

    f(&john) // The user John is 36 years old and he is from Las Vegas}

这里 “a” 是一个 struct 类型的 Bird,然后用于接口类型,如您所见。这就是多态的使用。Go 포인터란 무엇입니까? 마스터해야 할 지식 포인트는 무엇입니까? 允许使用 接口来实现多态. 因此,您可以看到指向结构或接口的指针是 Go 포인터란 무엇입니까? 마스터해야 할 지식 포인트는 무엇입니까? 中必不可少的工具。

7. 指针作为函数参数

指针可以在 函数  中作为参数使用。与直接使用值相比,它有一些优势。使用指针作为参数是将大对象传递给函数的一种非常有效的方式。因此,使用它是一个巨大的优化。

package mainimport (
    "fmt")func main() {   
    ptri := new(int)
    *ptri = 67

    fmt.Println(ptri)  // 0x40e020
    fmt.Println(*ptri) // 67}

使用大型对象可以减缓执行时间,这是将指针传递给结构体的示例。这是处理大对象的有效方法。

package mainimport (
    "fmt")func p() *int {  // 将返回类型指定为指针
    v := 101

    // 返回地址
    return &v}func main() {   
    n := p()
    fmt.Println(n)  // 0x40e020
    fmt.Println(*n) // 101}

取消引用结构时要小心。如果您使用它像*structname.field1那么它会抛出错误。 正确的方法是(*structname).field1

5. Go 포인터란 무엇입니까? 마스터해야 할 지식 포인트는 무엇입니까?Lang에서 포인터의 포인터포인터의 주소는 숫자값이며, 이 값은 다른 변수에도 할당될 수 있습니다. 따라서 간접 수준을 만들 수 있습니다. 이러한 간접적인 수준은 때때로 불필요한 혼란을 야기할 수 있으므로 주의해서 사용하십시오.

package mainimport (
    "fmt")func main() {       
    f := func() {
        fmt.Println("a function")   
    }
    pf := f    pf() // 一个函数}

6. 인터페이스에 대한 포인터

포인터는 인터페이스를 포함한 모든 것을 가리킬 수 있습니다. 빈 인터페이스를 사용하는 경우 반환되는 값은 nil입니다.

rrreee

다음은 포인터를 이용한 인터페이스 사용 예시입니다. rrreee여기

"a"

는 보시다시피 인터페이스 유형에 사용되는 구조체 유형 Bird입니다. 이것이 다형성의 사용입니다. Go 포인터란 무엇입니까? 마스터해야 할 지식 포인트는 무엇입니까?에서는 인터페이스를 사용하여 다형성을 허용하므로 구조나 인터페이스에 대한 포인터가 Go 포인터란 무엇입니까? 마스터해야 할 지식 포인트는 무엇입니까?의 필수 도구라는 것을 알 수 있습니다.

7. 함수 매개변수로서의 포인터

포인터는 함수의 매개변수로 사용될 수 있습니다. 값을 직접 사용하는 것보다 몇 가지 장점이 있습니다. 포인터를 인수로 사용하는 것은 큰 개체를 함수에 전달하는 매우 효율적인 방법입니다. 그래서 그것을 사용하는 것은 엄청난 최적화입니다.

rrreee

큰 개체를 사용하면 실행 시간이 느려질 수 있습니다. 다음은 구조체에 포인터를 전달하는 예입니다. 이는 큰 개체를 처리하는 효율적인 방법입니다. rrreee구조를 역참조할 때는 주의하세요. *structname.field1과 같이 사용하면 오류가 발생합니다.

올바른

방법은 (*structname).field1입니다.

함수 내에서 포인터를 사용하면 매개변수가 const가 아닌 이상 "
mutable

" 값이 만들어지므로 값을 변경하고 싶을 때마다 해당 값에 대한 포인터를 함수 매개변수로 사용한 다음 필요한 수정을 해야 합니다.

8. Go 포인터란 무엇입니까? 마스터해야 할 지식 포인트는 무엇입니까?의 "new" 함수 🎜🎜Go 포인터란 무엇입니까? 마스터해야 할 지식 포인트는 무엇입니까?의 🎜new🎜 함수는 유형에 대한 포인터를 반환합니다. 🎜rrreee🎜🎜🎜9. 함수에서 포인터 반환 🎜🎜 다른 값과 마찬가지로 모든 유형의 포인터가 함수에서 반환될 수 있습니다. 정말 간단합니다. 값을 직접 반환하지 않고 값의 주소를 반환합니다. 🎜rrreee🎜🎜🎜10. 함수에 대한 포인터🎜🎜함수에 대한 포인터는 Go 포인터란 무엇입니까? 마스터해야 할 지식 포인트는 무엇입니까?에서 암시적으로 작동합니다. 즉, 포인터로 선언할 필요가 없습니다. 🎜rrreee🎜🎜🎜11. Go 포인터란 무엇입니까? 마스터해야 할 지식 포인트는 무엇입니까?에서 포인터를 사용할 때 기억해야 할 사항🎜🎜Go 포인터란 무엇입니까? 마스터해야 할 지식 포인트는 무엇입니까?에서는 포인터 연산이 허용되지 않습니다. 따라서 C/C++에서 할 수 있는 단항 증가 또는 감소와 같은 작업을 수행할 수 없습니다. 🎜배열에 대한 포인터를 사용하고 싶을 수도 있지만 슬라이스를 사용하는 것이 더 나은 옵션입니다. 슬라이스는 배열에 대한 포인터보다 훨씬 더 다양합니다. 코드는 매우 간결하며 작업을 더 쉽게 만듭니다. 따라서 가능하면 슬라이스를 사용하십시오. 🎜🎜🎜원본 주소: https://golangdocs.com/pointers-in-golang🎜🎜번역 주소: https://learnku.com/go/t/60880🎜🎜

위 내용은 Go 포인터란 무엇입니까? 마스터해야 할 지식 포인트는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제