Go에서 포인터는 변수 작업에 필수적입니다. 그러나 다양한 포인터 유형 간의 미묘한 차이를 이해하는 것은 어려울 수 있습니다. 이 기사에서는 포인터 간의 차이점과 fmt 패키지의 기본 형식을 사용할 때 포인터가 출력에 어떤 영향을 미치는지 보여주는 특정 시나리오를 살펴봅니다.
다음 코드 조각은 포인터의 차이점을 보여줍니다. 문제:
type Test struct { Test string } var Models = map[string]interface{}{ "test": newTest(), } func main() { test1 := Test{} fmt.Println("Test 1: ") fmt.Printf("%v", test1) fmt.Println() fmt.Println("Test 1 as pointer: ") fmt.Printf("%v", &test1) fmt.Println() test2 := Models["test"] fmt.Println("Test 2: ") fmt.Printf("%v", test2) fmt.Println() fmt.Println("Test 2 as pointer: ") fmt.Printf("%v", &test2) } func newTest() Test { var model Test return model }
코드를 실행하면 차이점을 알 수 있습니다. test2와 test1을 포인터로 인쇄할 때 출력에 표시됩니다. 포인터로서 test1의 출력은 빈 문자열인 반면, 포인터로서 test2의 출력은 주소의 16진수 표현입니다.
fmt.Printf 함수는 %v를 사용합니다. 인쇄되는 값의 유형에 따라 특정 형식을 선택하는 기본 형식 지정 동사입니다. 포인터의 경우 기본 형식은 주소의 16진수 표현입니다.
첫 번째 경우(포인터인 test1), 인쇄되는 값은 테스트 구조체에 대한 포인터입니다. 그러나 구조체가 0 값으로 초기화되었기 때문에 출력은 비어 있습니다.
두 번째 경우(포인터인 test2)에서 인쇄되는 값은 인터페이스{}에 대한 포인터입니다. %v 동사에 도달하기 전에 값은 다른 인터페이스{} 내에서 추가 래핑을 거쳐 Models["test"]를 가리킵니다. 최종적으로 인쇄되는 값은 인터페이스에 대한 포인터이므로{} 포인터의 기본 형식이 적용되며 주소의 16진수 표현을 얻게 됩니다.
이 문제를 해결하려면, test2에서 실제 테스트 구조체를 추출하려면 유형 어설션을 사용해야 합니다. 이는 다음을 통해 달성할 수 있습니다.
t2 := Models["test"] test2 := t2.(Test) // test2 is now of type Test
유형 어설션을 사용하면 test2 변수가 이제 Test 구조체를 가리키며 test1처럼 인쇄할 수 있습니다.
또는 다음을 사용하여 작업할 수 있습니다. *Test 값을 맵에 저장하여 직접 Test에 대한 포인터:
var Models = map[string]*Test{ "test": newTest(), }
이 접근 방식은 유형 어설션의 필요성을 제거하고 인터페이스{}로 래핑하여 주소의 16진수 표현을 방지합니다.
위 내용은 Go의 `fmt.Printf`와 포인터 유형은 어떻게 상호 작용하며, 포인터 유형에 따라 다른 출력을 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!