Golang의 nil 및 0 값에 대한 간략한 분석
오랜 기간 Java 개발자로서 저는 null 검사 및 null 값 처리에 푹 빠져 있습니다. golang에서는 이야기가 조금 다릅니다. 이번 글에서는 golang에서 nil
과 zero value
를 사용하는 방법을 설명하겠습니다. nil
和零值
。
非空和空类型
在go中类型可以是空或非空。 非空类型永远不能为nil,并且永远不会使您导致 nil-panic
(等效于Java的nullpointerexception) 尽管不像java(或其他具有空类型的语言)中那么多,但在处理空类型时,我们仍须谨慎一点。
非空基本类型
在go中,基本类型不可为空。像这样的声明
var a int = nil
无法编译,因为int
永远不能为nil. 未分配的int
类型的默认值为0.
运行语句
var a int // int类型的默认值不能为nil fmt.Println(a) // 0
将输出int
的默认值 “0
”. 我们将此称为类型的零值.
同int
null이 아닌 유형과 빈 유형
Go에서는 유형이 비어 있거나 null이 아닐 수 있습니다. null이 아닌 유형은 nil이 될 수 없으며, Java(또는 null이 있는 다른 언어)만큼은 아니지만
nil-panic
(Java의 nullpointerException과 동일)을 발생시키지 않습니다. 유형), 하지만 빈 유형을 다룰 때는 여전히 약간 주의해야 합니다. Go에서는 기본 유형이 null일 수 없습니다. 이와 같은 선언은 | 컴파일에 실패합니다. 왜냐하면 int 는 nil이 될 수 없기 때문입니다. 할당되지 않은 int 유형의 기본값은 0입니다.문 실행 |
---|---|
0 | |
0 | |
0.0 | |
0 | |
0 | |
" " (빈 문자열) | |
(0,0i) | |
nilled 유형의 0값 배열 | nil값 배열 |
Non-nillable structs 组合的 设定一个 Person 结构体的代码, type Person struct { Name string Age int } var p Person // person 类型的默认 0 值 fmt.Printf("[%#v]\n", p) 로그인 후 복사 로그인 후 복사 当你在 main 方法里运行这段代码的时候,将会打印出 nillable 类型 还有一种更高级到 nillable 类型,如果对应的类型未初始化,将会报错,触发 panic 。 这些可以为 nillabel 类型的 函数,通道,切片,map,接口以及指针. 但是,nil-slice 和nil-maps 仍然可以使用,在我们开始使用它们之前不必进行初始化。 nil-maps 如果 map 的值为 nil,map 将始终返回值的零值,与返回不存在 map 中的 Key 的结果一样。代码 var p map[int]string // nil map fmt.Printf(" %#v length %d \n", p[99], len(p)) 로그인 후 복사 로그인 후 복사 让我们来打印下 将值分配给 nil-map, 会引起死机状况的出现: var p map[string]int // nil map p["nils"] = 19 // panic: 对nil-map中的条目赋值 로그인 후 복사 nil-slices 在外部引用切片 will 将导致死机,但是 var p []string // nil slice fmt.Printf("uninitialized -> %d, %d\n", len(p), cap(p)) p1 := append(p, "nils") // 从P创建一个新的切片p1 fmt.Printf("after append -> %d, %d %#v\n", len(p1), cap(p1), p1) 로그인 후 복사 会打印: uninitialized -> 0, 0 after append -> 1, 1 []string{"nils"} 로그인 후 복사 在 Go Playground 上试验。 可为 nil 值的指针、函数和接口类型会引起 panic Pointers and interface-types are however nillable. Whenever dealing with these types, we have to consider if they are nil or not to avoid panics. These code-snippets for instance, will cause a panic: 指针和接口类型是可为 nil 值的。每当处理这些类型时,我们都必须考虑它们是否为零,以免出现 Panic。例如,这些代码片段将引起 Panic: var p *int // 指向 int 的指针 *p++ // panic: runtime error: invalid memory address or nil pointer dereference // p是无内容的地址,因此为nil 로그인 후 복사 和 var p error // 类型 error 的 nil 值 error.Error() // panic: runtime error: invalid memory address or nil pointer dereference 로그인 후 복사 和 var f func(string) // nil 函数 f("oh oh") // panic: runtime error: invalid memory address or nil pointer dereference 로그인 후 복사 nil channel 永远阻塞 尝试从 nil 通道读取或写入 nil 通道将永远受阻。关闭nil通道会引起 Panic 。 总结
|
위 내용은 Golang의 nil 및 0 값에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Go Crawler Colly의 대기열 스레딩 문제는 Colly Crawler 라이브러리를 GO 언어로 사용하는 문제를 탐구합니다. � ...

Go Language의 부동 소수점 번호 작동에 사용되는 라이브러리는 정확도를 보장하는 방법을 소개합니다.

Go Language의 문자열 인쇄의 차이 : println 및 String () 함수 사용 효과의 차이가 진행 중입니다 ...

GO 언어에서 구조를 정의하는 두 가지 방법 : VAR과 유형 키워드의 차이. 구조를 정의 할 때 Go Language는 종종 두 가지 다른 글쓰기 방법을 본다 : 첫째 ...

GO의 어떤 라이브러리가 대기업이나 잘 알려진 오픈 소스 프로젝트에서 개발 했습니까? GO에 프로그래밍 할 때 개발자는 종종 몇 가지 일반적인 요구를 만납니다.

Go Language에서 메시지 대기열을 구현하기 위해 Redisstream을 사용하는 문제는 Go Language와 Redis를 사용하는 것입니다 ...

골란드의 사용자 정의 구조 레이블이 표시되지 않으면 어떻게해야합니까? Go Language 개발을 위해 Goland를 사용할 때 많은 개발자가 사용자 정의 구조 태그를 만날 것입니다 ...

VSCODE 사용자의 GOLANG 제네릭 기능 유형 제약 조건을 자동으로 삭제하면 VSCODE를 사용하여 Golang 코드를 작성할 때 이상한 문제가 발생할 수 있습니다. 언제...
