이 글은 Go를 사용할 때 주의해야 할 몇 가지 함정을 소개하기 위해 golang튜토리얼 칼럼에서 작성한 글입니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!
주목해야 할 Go의 함정
주목해야 할 함정
Go의 장점은 편리한 코루틴 프로그래밍과 강력한 네트워크 처리 성능에 있습니다. 그러나 사용의 단순성을 추구하기 위해 Go 언어는 다른 언어와 매우 다릅니다. 주의해야 할 몇 가지 주요 함정은 다음과 같습니다.
1. 클래스가 실수로 인터페이스를 구현할 수 있습니다. 인터페이스)의 의미는 인터페이스 계약에서 예상하는 것과 다를 수 있습니다.
2. := 및 =는 혼동하기 쉽습니다.
3. Map에 0 값이 있으면 쿼리할 수 있지만 할당할 수는 없습니다.
4. 원래 값을 수정합니다. 참조 유형은 무엇입니까
5. 용량이 충분하면 참조로 전달됩니다
6.nil 인터페이스 값
Pit 2~Pit 6의 코드 예는 다음과 같습니다.
package main import ( "fmt" "time" ) func catchError() { if err := recover(); err != nil { fmt.Println(err) } } func hole2() { a := 1 if time.Now().Year() > 2020 { a := 2 // 一不小心加了一个冒号 println(a) } println(a) } func hole3() { defer catchError() var m0 map[string]string println("key:", m0["key"]) m0["key"] = "val" // 报错:assignment to entry in nil map } type Hole4 struct { Name string Slices []string MyMap map[string]string Channel chan int } func hole4() { a := Hole4{ Name: "a", Slices: []string{"a"}, MyMap: map[string]string{"key": "a"}, Channel: make(chan int), } go func() { for n := range a.Channel { fmt.Println(n) } }() b := a b.Name = "b" b.Slices[0] = "b" b.MyMap["key"] = "b" b.Channel <- 999 fmt.Println(a) fmt.Println(b) } func hole5() { slice1 := make([]string, 1, 1) slice1[0] = "1" temp1 := slice1 temp1 = append(temp1, "1") temp1[0] = "2" fmt.Println(slice1) slice9 := make([]string, 1, 9) slice9[0] = "1" temp2 := slice9 temp2 = append(temp2, "1") temp2[0] = "2" fmt.Println(slice9) } type Cache interface { Name() } type RedisCache struct{} func (RedisCache) Name() {} func hole6() { defer catchError() var redis1 *RedisCache = nil var redis2 Cache = redis1 if redis2 != nil { println("entering...") redis2.Name() // 报错:nil pointer dereference } } func main() { hole2() hole3() hole4() hole5() hole6() }
위 내용은 Go!를 사용할 때 주의해야 할 함정은 다음과 같습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!