언어 값, 포인터, 참조 형 이동

원본 : https://www.jianshu.com/p/af42cb368cef

-------------------------------------------------- -

C 또는 C ++ 포인터 포인터는 언어가 유사하지만, 따라서 C 또는 C ++ 프로그램에서 잠재적 인 문제의 일부를 제거, 언어는 포인터 포인터 연산을 이동 지원하지 않습니다 이동합니다. 이동 언어는 자신의 가비지 컬렉터를 가지고 있으며, 당신은 무료로 사용하거나 운영자를 삭제로 C 또는 C ++ 함수와 같은 이동 언어를 필요가 없습니다 자동으로 메모리를 관리하기 때문에.

참고 문헌은 창조의 이동 언어 후 자바와 파이썬 개체 포인터처럼 사용할 수 있습니다.

함수 또는 메소드에 전달 된 값의 사본이 기능 또는 중복 된 값을 사용하는 방법이 될 것이다 : 그러나, 이동에서, 또는 부울 변수 또는 숫자 형 또는 문자열 유형 배열에 대한 값에 의해 전달된다 그것은 원래의 값에 영향을주지 않습니다. 일반적으로, 매우 저렴한 값에 의해 전달 부울 변수 또는 숫자 형 또는 문자열 유형, 전송 과정에서 안전을 최적화하기 위해 언어 컴파일러를 이동합니다.

그러나 들어가, 문자열은 불변이고, 따라서 이동의 변형 문자열 (예를 들면, + = 연산자) 동안 새로운 캐릭터를 작성해야하고 원래의 문자열을 복사하고, 새로운 추가 문자열 후에 큰 문자열 동작의 비용은 상대적으로 클 수있다.

큰 문자열뿐만 아니라, 어레이로 전달되는 값이다. 언어를 이동하는 대신 조각 배열의 배열을 사용하여 발생할 수있는 엄청난 비용을 해결하기 위해. 에 관계없이 슬라이스의 길이 또는 얼마나 많은 용량의 동일한의 문자열 섹션 라인에 전송을 전송하는 단계를 포함한다. 슬라이스가 변수이기 때문에 부분은 수정 된 복사 작업이 문자열 등의 새로운 조각을 만들 필요가 없습니다, 참조 형식입니다.

func main() {
   a := 3 b := 4 c := "abc" d := [3]int{1,2,3} fmt.Printf("main方法:a的值为 %v,b的值为 %v,c的值为 %v,d的值为 %v \n",a,b,c,d) demo(a,b,c,d) fmt.Printf("main方法:a的值为 %v,b的值为 %v,c的值为 %v,d的值为 %v \n",a,b,c,d) } func demo(a,b int,c string,d [3]int) { a = 5 b = 6 c = "efg" d[0] = 0 fmt.Printf("demo函数:a的值为 %v,b的值为 %v,c的值为 %v,d的值为 %v\n",a,b,c,d) } ----output---- main方法: a的值为 3,b的值为 4,c的值为 abc,d的值为 [1 2 3] demo函数: a的值为 5,b的值为 6,c的值为 efg,d的值为 [0 2 3] main方法: a的值为 3,b的值为 4,c的值为 abc,d的值为 [1 2 3] 

이동 언어 참조 유형은 :지도 (MAP), 어레이 슬라이스 (슬라이스), 채널 (채널) 및 방법의 기능.

쓰레기가 그 범위에서, 다음 로컬 변수 수명을 수집 될 로컬 변수가 더 이상 사용될 때 인해 이동 가비지 수집기의 존재 때문에로 (더 이상 언급되지 않거나 범위에 작용하지 않음) 결정. 우리는 지역 변수 그것의 수명주기를 관리하려면 어떻게해야할까요? 그런 다음 변수에 적어도 포인터가있는만큼, 지역 변수를 관리하는 포인터를 사용할 필요가 다음 변수의 라이프 사이클은 범위의 독립적이 될 수 있습니다.

변수는 우리가 라이프 사이클을 제어 할 수있는 포인터를 사용하여 다른 가변 비용의 범위에 영향을받지 배달 중에 최소화하고, 내용이 쉽게 오히려 복사 작업의 값보다는 변수를 변경할 수 있습니다. 포인터가 실제로 다른 변수의 메모리 어드레스를 유지하는 변수이며, 모든 변수는 콘텐츠 포인터에 의해 변경 될 수있는 메모리 어드레스를 저장하는 포인터이다. 전달 포인터는 매우 저렴합니다.

포인터를 사용하기 전에, 우리는 두 개의 연산자의 의미를 이해할 필요가
① 연산자 &를 : 같은 때 이항 연산자, 비트 AND 연산, 단항 연산자, 변수 메모리의 반환 주소로 사용하는 경우.
② 연산자 * 이진 연산자 곱셈 연산을 그대로 사용할 경우, 같은 경우 단항 연산자 (참조 연산자), 포인터 변수의 리턴 값, 사실, 분리 포인터 참조 변수 변수의 값을 반환합니다.

작성 및 포인터를 사용하여 코드는 다음 예에서 볼 수있다

func main() {
   a := 3 p := &a //这里是获取变量a的内存地址,并将其赋值给变量p fmt.Printf("a的值为 %v, a的指针是 %v ,p指向的变量的值为 %v\n",a,p,*p) } -----output----- a的值为 3, a的指针是 0xc042060080 ,p指向的变量的值为 3 

사실, P와 변수 A의 값이 동일한 * 두이 둘은 동일한 메모리 어드레스와 연관된 교환에 사용될 수있는 동작을 변경하는 변수 중 하나는 다른 변수의 값에 영향을 주지만, 변수 p는이면 다른 변수 포인터 할당 죽을.

포인터의 통합 사용에 대해서는, 다음 코드 예제를 살펴

func main() {
   a := 3 b := 4 p1 := &a //获取变量a的内存地址,并将其赋值给变量p1 p2 := &b //获取变量b的内存地址,并将其赋值给变量p2 fmt.Printf("a的值为 %v, a的指针是 %v ,p1指向的变量的值为 %v\n",a,p1,*p1) fmt.Printf("b的值为 %v, b的指针是 %v ,p2指向的变量的值为 %v\n",b,p2,*p2) fmt.Println(demo(p1,p2)) fmt.Printf("a的值为 %v, a的指针是 %v ,p1指向的变量的值为 %v\n",a,p1,*p1) fmt.Printf("b的值为 %v, b的指针是 %v ,p2指向的变量的值为 %v\n",b,p2,*p2) } func demo(a,b *int)int { *a = 5 *b = 6 return *a * *b //这里出现连续的两个*,Go编译器会根据上下文自动识别乘法与两个引用 } -----output----- a的值为 3, a的指针是 0xc042060080 ,p1指向的变量的值为 3 b的值为 4, b的指针是 0xc042060088 ,p2指向的变量的值为 4 30 a的值为 5, a的指针是 0xc042060080 ,p1指向的变量的值为 5 b的值为 6, b的指针是 0xc042060088 ,p2指向的变量的值为 6 

코드는 상기에있어서, 우리는 포인터를 확인할 수 후, 정수형의 값은 원래 기능이나 방법의 값에 영향을주는 원래 변수 변경을 통과시켰다.

널 포인터
포인터가 정의 변수 중 하나에 할당되지 않으며, 그 값은 전무하다.
nil이 포인터는 널 포인터라고합니다.
개념으로 NULL 널 (null) 전무와 다른 언어, 없음, 전무는 모두 0 값이나 null 값을 참조하십시오.
다음 예제를 검토

package main

import "fmt"
func main() { var ptr *int fmt.Printf("ptr 的值为 : %x\n", ptr ) } 

상기 출력의 예이다 :

ptr 的值为 : 0

널 포인터를 분석 :

if(ptr != nil)     /* ptr 不是空指针 */
if(ptr == nil) /* ptr 是空指针 */ 

다중 간접 참조
의 예로서, 상기 코드, A : = 3, P1 = & A 매체는, 점 P1은 점 P1, P2 메모리 어드레스가 있으면 간접 참조를 호출 메모리 어드레스, 포인트 P1이다 변수 중 하나가 작업의 내용을 수정하는 경우 메모리 주소,이 모든 변수의 다른 내용에 영향을 미칠 것입니다, 참고 문헌의 종류에 상관없이 여러 간접라고하지 않습니다.

func main() {
   a := 3 p1 := &a //p1是指向变量a内存地址的指针 p2 := &p1 //p2是指向变量p1内存地址的指针 fmt.Printf("a:%v, p1:%v, *p1:%v, p2:%v, **p2:%v\n",a,p1,*p1,p2,**p2) a = 4 fmt.Printf("a:%v, p1:%v, *p1:%v, p2:%v, **p2:%v\n",a,p1,*p1,p2,**p2) } -----output----- a:3, p1:0xc0420080b8, *p1:3, p2:0xc042004028, **p2:3 a:4, p1:0xc0420080b8, *p1:4, p2:0xc042004028, **p2:4 

운영자 &와 새로운 기능
새로운 기능 및 운영자 : 이동 언어는 두 가지 변수를 만들 수있는, 그들에 대한 포인터를 얻을 수를 제공합니다. 이 두 코드의 사용은 다음과 같이

type Person struct {
   name string
   sex  string
   age int } func main() { person1 := Person{"zhangsan","man",25} //创建一个person1对象 person2 := new(Person)//使用new创建一个person2对象,同时获得person的指针 person2.name,person2.sex,person2.age = "wangwu","man",25 person3 := &Person{"lisi","man",25}//使用&创建一个person3对象,同时获得person的指针 fmt.Printf("person1:%v, person2:%v, person3:%v\n",person1,person2,person3) } -----output----- person1:{zhangsan man 25}, person2:&{wangwu man 25}, person3:&{lisi man 25} 

두 개의 매우 다른 방법으로, 사업자의 결과, 출력 및 새로운 새로운 함수 및 연산자에서 더 컴팩트 만들려면 항상 속성의 초기 값을 지정할 수 있습니다. 이동 포인터 사람, 인쇄의 구체적인 내용은 속성 직접 인쇄 및 접두사에 추가 할 때 & 변수를 보여주는 것은 포인터이다.

다음으로 우리는 구조의 포인터를 전달하고 구조의 속성을 수정, 언어의 작동 방식을 참조 이동합니다.

type Person struct {
   name string
   sex  string
   age int } func main() { person1 := Person{"zhangsan","man",25} //创建一个person1对象 fmt.Printf("person1:%v\n",person1) demo(&person1) fmt.Printf("person1:%v\n",person1) } func demo(person *Person) { (*person).age = 18 //显示的解引用 person.name = "GoLang" //隐式的解引用 } 

Pserson1 객체를 사용하면 방법, 최초의 (즉, 원래의 객체에 대한 포인터)이 개 데모 기능 역 참조가 볼 수있는 기능을 시연하기 위해 포인터 후 초기화 속성을 설정, 메인 함수를 만드는 방법 (* 사람) .age 용액 번째 조작자가 자동으로 역 참조 것이다 사용 참조 차이없이 사용 모두를 도시하지만, 제 간단하다. "."



저자 : 해피 아워 질에
링크 : HTTPS : //www.jianshu.com/p/af42cb368cef
출처 : 제인 책
저자가 보유 제인 책의 저작권은, 어떤 형태로도 복제되어, 승인을 얻기 위해 작성자에게 문의하고 소스를 표시하시기 바랍니다.

추천

출처www.cnblogs.com/oxspirt/p/10941480.html