가서 복사

카피 컨셉은 저에게 항상 이상했습니다. GO를 배웠을 때 왜 그랬을까요? 왜! GO가 가장 좋아하는 옵션이 사본 작업인 이유는 무엇입니까?
오늘 저는 공유하고 싶은 발견을 합니다.

나는 "소프트웨어 구성"이라는 책을 읽고 있었고 공유 상태에 대한 예를 보았습니다.
"공유 상태 동시성은 동시 계산이 메모리의 공유 위치를 읽고 업데이트하여 통신함을 의미합니다."- source

제목이 GO라는 것을 알고 있지만 GO에서 복사의 중요성을 이해하게 해주는 예제는 JavaScript라는 책의 예제이므로 예제는 JavaScript에 있습니다.

책에서 가져온 이 예를 살펴보겠습니다.

// Shared state
const x = {
    val: 2
};

// Mutates shared state
const x1 = () => x.val += 1;

// Mutates shared state
const x2 = () => x.val *= 2;

x1();
x2();

console.log(x.val); // 6

// This example is exactly equivalent to the above, except...
const y = {
    val: 2
};

const y1 = () => y.val += 1;

const y2 = () => y.val *= 2;

// ...the order of the function calls is reversed...
y2();
y1();

// ... which changes the resulting value:
console.log(y.val); // 5


이 코드는 논리적으로 보이지만 같은 시간에 동일한 객체 x에 액세스하는 2개의 스레드(또는 루틴)가 있다고 가정해 보겠습니다.
둘 다 동일한 객체를 수정하므로 출력은 경쟁 조건에 따라 다릅니다.

그래서 이것을 피하기 위해 우리는 사본을 사용합니다.

const x = {
    val: 2
};

const inc = x => ({...x, val: x.val + 1});
const double = x => ({...x, val: x.val * 2});

console.log(inc(double(x)).val); // 5

const y = {
    val: 2
};

/*
Because the functions don't mutate, you can call
these functions as many times as you want, in any order,
without changing the result of other function calls.
*/

// These calls do nothing:
inc(y);
double(y);

console.log(inc(double(y)).val); // 5


세 개의 점 ...은 스프레드 연산자입니다. 기본적으로 객체의 속성을 복사하고 함수는 수정된 값으로 새 복사본을 반환합니다. 이 코드를 읽고 나면 GO가 바로 떠올랐습니다. 모든 것이 사본이라는 GO의 아이디어는 저에게 이상했습니다. 그리고 우리가 알고 있듯이 go의 주요 기능은 동시성이므로 모든 것이 go 디자이너에게 매우 훌륭하고 안전한 선택으로 보였습니다.
따라서 복사본 작업의 장점은 안전성, 격리성, 다중 스레딩이지만 결함과 같은 단점도 있습니다.

그래서 우리는 GO에서 pass를 포인터로 사용하는 것을 최대한 피하는 것을 좋아합니다.

그것이 오늘 커뮤니티와 공유하고 싶었던 나의 발견이었습니다. 우리를 도울 수 있는 더 많은 정보가 있으면 우리와 공유하십시오!

좋은 웹페이지 즐겨찾기