내가 물어하는 이유는 큰 문자열을 인쇄 할 때 복사가 될 것이라고 생각하기 때문에 당신이, 메모리 및 성능 문제에 대해 우려하고 있다는 것을 이해하고 fmt.Printf 함수에 전달됩니다.
문자열 데이터를 포함하는 바이트 배열 복사본이 함수에 전달되는 것이 아니기 때문에이 경우 걱정할 필요가 없습니다.
Go에서는 문자열이 읽기 전용 바이트 슬라이스이므로 함수에 전달되는 것은 읽기 전용 바이트 슬라이스입니다.
슬라이스는 배열의 요소 (slice [0]의 요소)에 대한 참조를 포함하는 값이며, 슬라이스의 길이와 용량 (아래 링크를 참조하십시오. 더 자세한 슬라이스 설명).
슬라이스에는 데이터 (문자열의 실제 바이트)가 저장되지 않는다는 것을 이해하는 것이 중요합니다. 슬라이스는 해당 데이터에 대한 참조 만 보유합니다.
문자열의 경우 슬라이스는 읽기 전용이며 기본 배열에 직접 액세스 할 수 없습니다.
문자열 변수에 슬라이스가 있고 기본 배열이 아니라 슬라이스가 해당 배열에 대한 참조 일 뿐이므로 fmt.Printf 함수를 호출하면 참조가 전달됩니다.
Go의 모든 항목은 값에 의해 전달되지만 도착한 항목은 배열에 대한 참조를 포함하는 값이므로 기본 배열의 복사본이 만들어지지 않습니다. 단지 기본 배열에 대한 참조를 유지 값의 복사본이 저렴하다, 제작됩니다, 그래서 당신은 사용할 수 있습니다 : 당신의 큰 문자열의 복사본이없는
fmt.Printf("%s", mystruct.somelargestring)
이 만들어지고.
당신이 읽는 것이 도움이 될 것입니다, 위의 내용을 명확히하기 위해 :
http://blog.golang.org/go-slices-usage-and-internals
및
http://blog.golang.org/slices
이동] 언어 사양
도 조금 도움이 될 것이다.
나는 당신과 같은 빠른 대답이 있어야하는 간단한 질문을하고 있지만, 몇 분이 지나야 받아 들일 수 있도록 허용하지 않을 것입니다. – erjoalgo
@erjoalgo 문제 없습니다. 아이디어는 : 포인터를 사용하는 경우 큰 * 사본이 없습니다. – VonC
주소에 % v를 사용하면 fmt.Printf ("A : % v, B : % v \ n", & mystruct.A, & mystruct.B) A : 0xf840704098, B : 0xf8407040a8 – erjoalgo