가서 복사
6247 단어 functionalconcurrencygo
오늘 저는 공유하고 싶은 발견을 합니다.
나는 "소프트웨어 구성"이라는 책을 읽고 있었고 공유 상태에 대한 예를 보았습니다.
"공유 상태 동시성은 동시 계산이 메모리의 공유 위치를 읽고 업데이트하여 통신함을 의미합니다."- 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를 포인터로 사용하는 것을 최대한 피하는 것을 좋아합니다.
그것이 오늘 커뮤니티와 공유하고 싶었던 나의 발견이었습니다. 우리를 도울 수 있는 더 많은 정보가 있으면 우리와 공유하십시오!
Reference
이 문제에 관하여(가서 복사), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/elkhatibomar/go-and-copies-50dg텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)