Go 언어의 nil 상세 설명

1853 단어 Go 언어 기초
Go 언어의 nil 은 자바 의 null 보다 훨씬 이해 하고 파악 하기 어렵다.
1.일반적인 struct(비 포인터 형식)의 대상 은 nil 로 할당 할 수 없고 nil 과 판단 할 수 없습니다(==).즉,다음 코드 입 니 다.*s==nil(컴 파일 오류)을 판단 할 수 없고 쓸 수 없습니다:var s Student=nil.
s := new(Student)  //  new     *Student     
	fmt.Println("s == nil", s == nil) //false
	//fmt.Println(*s == nil) //    :cannot convert nil to type Student
	fmt.Printf("%T
", s) //*test.Student fmt.Printf("%T
", *s) //test.Student

type Student struct{}

func (s *Student) speak() {
	fmt.Println("I am a student.")
}

type IStudent interface {
	speak()
}

그러나 struct 의 지침 대상 은 nil 로 할당 하거나 nil 과 판단 할 수 있다.그러나*Student 유형의 s3==nil 에 도 s3 를 출력 할 수 있 는 유형:*Student
//var s3 Student = nil //    :cannot use nil as type Student in assignment
	var s3 *Student = nil
	fmt.Println("s3 == nil", s3 == nil) //true
	fmt.Printf("%T
", s3) //*test.Student

2.인터페이스 대상 과 인터페이스 대상 의 지침 은 모두 nil 또는 nil 판 등(==)으로 할당 할 수 있 습 니 다.여기 서 말 하 는 인 터 페 이 스 는 interface{}일 수도 있 고 위 코드 의 ISTudent 와 같은 사용자 정의 인터페이스 일 수도 있 습 니 다.new 를 사용 하여*interface{}형식의 s2 를 만 든 후 이 포인터 대상 s2!=nil,하지만 이 포인터 대상 이 가리 키 는 내용*s2==nil 
사용자 정의 인 터 페 이 스 는 다음 과 같다.이때 s4!=nil,그러나*s4==nil,따라서 s4.speak()방법 을 호출 할 때 컴 파일 오류 가 발생 할 수 있 습 니 다.
4.567913.3.포인터 대상 을 nil 로 할당 한 다음 에 이 포인터 대상 을 인터페이스 에 할당 합 니 다(물론 이 포인터 유형 은 이 인 터 페 이 스 를 실현 해 야 합 니 다).이때 이 인터페이스 대상 은 nil 이 아 닙 니 다.
s2 := new(interface{})
	fmt.Println("s2 == nil", s2 == nil)   //false
	fmt.Println("*s2 == nil", *s2 == nil) //true
	fmt.Printf("%T
", s2) //*interface {} fmt.Printf("%T
", *s2) //

왜 닐 하나 가 이렇게 복잡 할 까?대신 과 함께 소통 하고 토론 해 보 길~

좋은 웹페이지 즐겨찾기