Rumah >pembangunan bahagian belakang >Golang >Berikut ialah perangkap yang perlu anda perhatikan apabila menggunakan Go!

Berikut ialah perangkap yang perlu anda perhatikan apabila menggunakan Go!

藏色散人
藏色散人ke hadapan
2021-12-15 15:30:261592semak imbas

Artikel ini ditulis oleh ruangan tutorial golang untuk memperkenalkan anda kepada beberapa perangkap yang perlu anda perhatikan apabila menggunakan Go. Saya harap ia akan membantu rakan yang memerlukan!

Perangkap Go yang perlu diberi perhatian

Perangkap yang perlu diberi perhatian

Kelebihan Go ialah pengaturcaraan coroutine yang mudah dan prestasi yang kukuh dalam pemprosesan rangkaian. Walau bagaimanapun, untuk mengejar kesederhanaan penggunaan, bahasa Go sangat berbeza daripada bahasa lain Berikut adalah beberapa perangkap utama yang perlu diberi perhatian:

1 antara muka antara muka ini) pelaksanaan), semantik pelaksanaan mungkin berbeza daripada apa yang dijangkakan oleh kontrak antara muka.

2. := dan = mudah dikelirukan

3 Masalah nilai sifar kelas itu, ia boleh disoal tetapi tidak boleh diberikan

4. Jenis rujukan Jika nilai diluluskan, nilai asal masih akan diubah suai. Apakah jenis rujukan

5. Slice trap, jika kapasiti mencukupi, ia diluluskan oleh rujukan

6 nilai antara muka tiada

Pit 2~ Kod Pit 6 Contoh adalah seperti berikut:

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()
}

Atas ialah kandungan terperinci Berikut ialah perangkap yang perlu anda perhatikan apabila menggunakan Go!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:learnku.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam