> 백엔드 개발 > Golang > golang은 수정될 수 있습니다

golang은 수정될 수 있습니다

WBOY
풀어 주다: 2023-05-06 10:27:07
원래의
516명이 탐색했습니다.

Golang 수정 가능: Golang의 가변성 탐색

Golang(Go라고도 함)은 최근 몇 년 동안 점점 인기를 얻고 있는 프로그래밍 언어입니다. Golang의 주요 설계 목표는 높은 성능과 안정성을 유지하면서 개발 효율성과 코드 가독성을 향상시키는 것입니다. 다른 언어와 비교하여 Golang은 독특한 디자인과 데이터 가변성을 처리합니다. 이 기사에서는 Golang의 가변성을 살펴보고 이를 기반으로 Golang의 몇 가지 기본 디자인 아이디어와 발생할 수 있는 몇 가지 문제를 살펴봅니다.

Golang에서는 데이터 유형이 값 유형과 참조 유형으로 구분됩니다. 값 유형에는 정수, 부동 소수점 숫자, 불리언 값 등이 있으며, 해당 값은 스택 메모리에 저장됩니다. 참조 유형에는 슬라이스, 구조체, 함수 등이 포함됩니다. 해당 값은 힙 메모리에 저장되고 포인터를 통해 스택에서 참조됩니다.

먼저 값 유형의 가변성을 살펴보겠습니다. Golang에서는 값 유형을 변경할 수 있지만 이 변경은 현재 범위 내에서만 발생합니다. 예:

package main

import "fmt"

func main() {
    i := 1
    fmt.Println(i) // 输出 1

    modify(i)
    fmt.Println(i) // 仍然输出 1
}

func modify(i int) {
    i = 2
}
로그인 후 복사

이 예에서는 modify 함수에서 i 값을 수정하면 modify 함수는 <code>main 함수의 i에 영향을 주지 않고 변수입니다. 함수가 호출되면 값형이 복사되고, 복사된 값만 함수 내에서 수정되기 때문이다. modify函数中修改i的值只会影响到modify函数内部的变量,而不会影响到main函数中的i。这是因为,值类型在函数调用时会被复制,而在函数内部修改的只是这个复制的值。

与此相反,引用类型在函数调用时传递的是引用,也就是指向内存地址的指针。因此,在函数内部对引用类型的修改会影响到该引用类型所指向的地址中存储的值。例如:

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func main() {
    p := Person{"Tom", 18}
    fmt.Println(p) // 输出 {Tom 18}

    modify(&p)
    fmt.Println(p) // 输出 {Jerry 20}
}

func modify(p *Person) {
    p.Name = "Jerry"
    p.Age = 20
}
로그인 후 복사

在这个例子中,我们通过定义一个Person结构体,并在main函数中将其实例化。然后,我们将这个结构体的指针传递给modify函数,并在modify函数中修改了这个结构体实例的值。可以看到,在main函数中打印出的结构体已经被修改为{Jerry 20}

但值类型和引用类型之间的关系有时并不那么简单。例如,在Golang中还有一个叫做string的类型,它实际上是一个只读的引用类型。也就是说,对于一个string变量,我们不能直接修改其内部的值。例如:

package main

import "fmt"

func main() {
    s := "hello"
    fmt.Println(s) // 输出 hello

    modify(s)
    fmt.Println(s) // 仍然输出 hello
}

func modify(s string) {
    s = "world"
}
로그인 후 복사

在这个例子中,我们在modify函数中试图修改string类型的值,但是没有生效。这是因为,string类型是只读的,而在函数调用时会被复制,因此,对参数进行的任何修改都不会影响原始的string变量。如果要修改string类型的值,我们需要将其转换为一个可写的[]byte类型,例如:

package main

import "fmt"

func main() {
    s := "hello"
    fmt.Println(s) // 输出 hello

    modify(&s)
    fmt.Println(s) // 输出 world
}

func modify(s *string) {
    b := []byte(*s)
    b[0] = 'w'
    *s = string(b)
}
로그인 후 복사

在这个例子中,我们将string类型的指针传递给modify函数,并在函数内部将其转换为[]byte类型,然后修改最后一个字母并再次转换回string类型。这种方式虽然可以实现string类型的修改,但是增加了代码的复杂度。

Golang在设计时考虑了数据的可变性问题,并做出了相应的设计。在Golang中,尽量避免使用全局变量和不可预测的函数调用,同时,Golang的内置函数都是纯函数,不会进行任何修改操作。这些设计使Golang代码更加易于理解和维护,同时也降低了代码运行时的风险。

总结来说,Golang值类型的修改只会影响当前作用域,而引用类型的修改会改变指向的地址中存储的值。在对string类型进行修改时需要注意其只读特性,可以使用[]byte

반대로 참조 유형은 함수가 호출될 때 메모리 주소에 대한 포인터인 참조를 전달합니다. 따라서 함수 내의 참조 유형을 수정하면 참조 유형이 가리키는 주소에 저장된 값에 영향을 미칩니다. 예: 🎜rrreee🎜이 예에서는 Person 구조를 정의하고 main 함수에서 인스턴스화합니다. 그런 다음 이 구조체의 포인터를 modify 함수에 전달하고 modify 함수에서 구조체 인스턴스의 값을 수정합니다. 보시다시피 main 함수에 인쇄된 구조가 {Jerry 20}로 수정되었습니다. 🎜🎜그러나 값 유형과 참조 유형 간의 관계는 때로는 그렇게 간단하지 않습니다. 예를 들어 Golang에는 실제로 읽기 전용 참조 유형인 string이라는 유형이 있습니다. 즉, string 변수의 경우 내부 값을 직접 수정할 수 없습니다. 예: 🎜rrreee🎜이 예에서는 modify 함수에서 string 유형의 값을 수정하려고 시도했지만 적용되지 않았습니다. 이는 string 유형이 읽기 전용이고 함수가 호출될 때 복사되기 때문입니다. 따라서 매개변수를 수정해도 원래 string 변수에는 영향을 미치지 않습니다. string 유형의 값을 수정하려면 이를 쓰기 가능한 []byte 유형으로 변환해야 합니다. 예: 🎜rrreee🎜이 예에서는 다음을 수행합니다. 문자열 유형의 포인터가 수정 함수에 전달되고 함수 내에서 []byte 유형으로 변환된 다음 마지막 문자는 다음과 같습니다. 수정하고 다시 변환했습니다. string 유형을 반환합니다. 이 방법을 사용하면 string 유형을 수정할 수 있지만 코드가 더 복잡해집니다. 🎜🎜Golang은 디자인할 때 데이터의 가변성을 고려하고 그에 따라 디자인합니다. Golang에서는 전역 변수와 예측할 수 없는 함수 호출을 사용하지 마세요. 동시에 Golang의 내장 함수는 순수 함수이므로 어떤 식으로든 수정되지 않습니다. 이러한 디자인은 Golang 코드를 더 쉽게 이해하고 유지 관리하는 동시에 코드 실행 시 위험을 줄여줍니다. 🎜🎜요약하자면, Golang 값 유형을 수정하면 현재 범위에만 영향을 미치는 반면, 참조 유형을 수정하면 가리키는 주소에 저장된 값이 변경됩니다. string 유형을 수정할 때 읽기 전용 기능에 주의해야 합니다. []byte 유형을 사용하여 변환하고 수정할 수 있습니다. Golang의 디자인 아이디어와 처리 방법은 코드 가독성과 신뢰성에 대한 높은 강조를 반영합니다. Golang을 개발할 때 우리는 가변성 특성을 완전히 이해하고 점차적으로 디자인 아이디어와 처리 방법에 적응하여 코드 품질과 효율성을 향상시켜야 합니다. 🎜

위 내용은 golang은 수정될 수 있습니다의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿