중첩 구조체 문자열() 메서드의 재귀 인쇄 오류
이 질문은 다음을 사용하여 중첩 구조체를 인쇄하려고 할 때 스택 오버플로 문제를 탐구합니다. % v 형식 지정자를 사용하는 String() 메서드.
문제:
사용자가 다음 코드를 사용하여 String() 메서드에서 중첩된 구조체 요소를 반환하려고 합니다. :
<code class="go">func (c ConfigOne) String() string { return fmt.Sprintf("%+v\n", c) }</code>
사용자가 Logger.Infoln(c.String())을 사용하여 구조체를 인쇄하려고 하면 오류가 발생합니다.
runtime: goroutine stack exceeds 1000000000-byte limit fatal error: stack overflow
설명:
%v 및 %v 형식은 해당 유형이 이를 구현하는 경우 String() 값을 사용합니다. 따라서 해당 유형에 대한 String() 함수 내의 유형에 % v를 사용하면 무한 재귀가 발생합니다.
이 경우 String() 메서드는 fmt.Sprintf("% v", c)를 호출합니다. 포함된 데몬 구조체에서 String() 메서드를 재귀적으로 호출하는 등의 작업이 수행됩니다. 이로 인해 무한 루프 및 스택 오버플로가 발생합니다.
해결 방법:
이 문제를 해결하려면 사용자는 String() 함수에서 % v를 사용하면 안 됩니다. 대신, 자신이 적합하다고 생각하는 방식으로 구조의 내용을 표시하는 자체 문자열을 구성해야 합니다. 예:
<code class="go">func (c ConfigOne) String() string { return fmt.Sprintf("Loglevel: %d, Logfile: %s\n", c.Daemon.Loglevel, c.Daemon.Logfile) }</code>
위 내용은 중첩된 구조체의 `String()` 메서드에서 `% v`를 사용하면 스택 오버플로가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!