다음 중첩 구조체를 고려하세요.
<code class="go">type ConfigOne struct { Daemon daemon } type daemon struct { Loglevel int Logfile string }</code>
String() 문자열 메서드는 구조체 요소를 문자열로 변환합니다.
<code class="go">func (c ConfigOne) String() string { return fmt.Sprintf("%+v\n", c) }</code>
c.String()을 사용하여 중첩 구조체를 인쇄할 때 다음은 다음과 같습니다. 오류 발생:
runtime: goroutine stack exceeds 1000000000-byte limit fatal error: stack overflow
이 오류는 재귀로 인한 과도한 스택 사용량을 나타냅니다. 재귀는 중첩된 데몬 구조에 대해 String()을 호출하는 % v 형식으로 인해 발생합니다. 이 프로세스가 무한정 반복되어 스택 오버플로가 발생합니다.
재귀를 해결하려면 String() 메서드에서 % v를 사용하지 마세요. 대신, 아래에 설명된 대로 문자열을 수동으로 구성하십시오.
<code class="go">func (c ConfigOne) String() string { //return fmt.Sprintf("%+v\n", c.Daemon.Loglevel) return fmt.Sprintf("%+v\n", c.Daemon) }</code>
데몬 구조를 명시적으로 형식화함으로써 무한 재귀를 피하고 의도한 데이터가 출력되도록 보장합니다.
위 내용은 중첩된 구조체를 인쇄하면 스택 오버플로가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!