2014-09-09 3 views
0

인수를 값 (사본)으로 전달하지 않고 go에서 인쇄하려면 어떻게해야합니까?fmt를 참조하여 인수 전달

아마도이 (가상 * 깃발)과 같은 것일 수 있습니까? 현재

fmt.Printf("Value of pointer %*s", &mystruct.somelargestring) 

:

fmt.Printf("val is %v, %v\n", &mystruct.val, mystruct.Val) 
val is 0xf84061d170, somestring 

답변

0

당신이 포인터를 사용하는 경우는, fmt.Printf 포인터 (이하 "포인터 값"의 복사)의 사본을 사용, 개체 자체의 복사본이 아닌.
참조 Calls : 함수 호출에

은 함수 값과 인수는 일반적인 순서대로 평가됩니다.
호출 된 매개 변수는 값으로 에 전달되고 호출 된 함수는 실행을 시작합니다.

내가 일반적으로 사용

myobject *MyObject 
fmt.Printf("%v", myObject) 
+0

나는 당신과 같은 빠른 대답이 있어야하는 간단한 질문을하고 있지만, 몇 분이 지나야 받아 들일 수 있도록 허용하지 않을 것입니다. – erjoalgo

+0

@erjoalgo 문제 없습니다. 아이디어는 : 포인터를 사용하는 경우 큰 * 사본이 없습니다. – VonC

+0

주소에 % v를 사용하면 fmt.Printf ("A : % v, B : % v \ n", & mystruct.A, & mystruct.B) A : 0xf840704098, B : 0xf8407040a8 – erjoalgo

1

내가 물어하는 이유는 큰 문자열을 인쇄 할 때 복사가 될 것이라고 생각하기 때문에 당신이, 메모리 및 성능 문제에 대해 우려하고 있다는 것을 이해하고 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

이동] 언어 사양

도 조금 도움이 될 것이다.