最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang易錯(cuò)知識(shí)點(diǎn)匯總

 更新時(shí)間:2022年09月06日 11:37:45   作者:王中陽(yáng)Go  
這篇文章匯總了在開(kāi)發(fā)和刷面試題過(guò)程中遇到的Golang容易搞錯(cuò)的知識(shí)點(diǎn),關(guān)鍵部分也都為大家寫了代碼示例,感興趣的小伙伴可以了解一下

類型轉(zhuǎn)換和類型斷言

類型轉(zhuǎn)換語(yǔ)法:Type(expression)

類型斷言語(yǔ)法為:expression.(Type)

1.類型轉(zhuǎn)換示例代碼

package main

import "fmt"

//典型的類型轉(zhuǎn)換示例
func main() {
   // 類型轉(zhuǎn)換示例
   var a int = 5
   var b int = 2
   var c float32
   c = float32(a) / float32(b) //這里就是典型的類型轉(zhuǎn)換
   fmt.Printf("a的類型:%T\n", a)
   fmt.Printf("b的類型:%T\n", b)
   fmt.Printf("c的類型:%T\n", c)
   fmt.Printf("c的值:%v\n", c)
   //如果我們不進(jìn)行類型轉(zhuǎn)換,看下輸出結(jié)果
   fmt.Printf("不進(jìn)行類型轉(zhuǎn)換的輸出結(jié)果:%v\n", a/b) //從結(jié)果可以看出值為2,丟失了精度
}

打印結(jié)果

2.類型斷言代碼示例

注意:對(duì)于類型斷言,expression 必須是接口類型

package main

import "fmt"

//經(jīng)典的類型斷言示例 搭配switch使用
func main() {
   var x interface{}
   x = 1
   switch x.(type) { //這就是上面說(shuō)的expression.(Type)
   case float32:
      fmt.Println("類型是:float32")
   case string:
      fmt.Println("類型是:string")
   case int:
      fmt.Println("類型是:int")
   default:
      fmt.Println("未知類型")
   }
}

運(yùn)行結(jié)果

全局變量

定義全局變量必須用var,全局變量要定義在函數(shù)之外,而在函數(shù)之外定義的變量只能用var定義。

全局變量使用var,編譯通過(guò)

全局變量不使用var,編譯不通過(guò)

init函數(shù)

這是官方對(duì)于init()函數(shù)的介紹:

變量除了可以在全局聲明中初始化,也可以在 init ()函數(shù)中初始化。這是一類非常特殊的函數(shù),它不能夠被人為調(diào)用,而是在每個(gè)包完成初始化后自動(dòng)執(zhí)行,并且執(zhí)行優(yōu)先級(jí)比 main 函數(shù)高。 初始化總是以單線程執(zhí)行,并且按照包的依賴關(guān)系順序執(zhí)行。 一個(gè)可能的用途是在開(kāi)始執(zhí)行程序之前對(duì)數(shù)據(jù)進(jìn)行檢驗(yàn)或修復(fù),以保證程序狀態(tài)的正確性。

如何覺(jué)得上面這一大段話不好理解的話,可以看我的總結(jié):

  • init函數(shù)可以在任何包中有0個(gè)、1個(gè)或多個(gè);
  • main函數(shù)只能在main包中有且只有一個(gè),但是main包中也可以有0個(gè)、1個(gè)或多個(gè)init函數(shù);
  • init函數(shù)和main函數(shù)都不能被顯式調(diào)用;

Go語(yǔ)言中變量、init函數(shù)、main函數(shù)的執(zhí)行順序

  • 首先初始化導(dǎo)入包的變量和常量
  • 然后執(zhí)行導(dǎo)入包的init函數(shù)
  • 然后初始化本包的變量和常量
  • 然后執(zhí)行本包的init函數(shù)
  • 最后執(zhí)行本包的main函數(shù)

Go接口總結(jié)

這是我在刷題的時(shí)候碰到的,總結(jié)出來(lái)給大家:

  • 如果兩個(gè)接口擁有相同方法列表(順序可以不一致),那么這兩個(gè)接口實(shí)質(zhì)上同一個(gè)接口
  • 接口A是接口B的子集,意味著A的方法B中都有,那么A是B的基類,所以A=B是可行的
  • 接口是否能夠調(diào)用成功,需要運(yùn)行的時(shí)候才能知道
  • 接口賦值是否可行,在編譯階段就可以知道

Go字符串

Go語(yǔ)言中的字符串不支持下標(biāo)操作

在go語(yǔ)言中,字符串是一種基本類型,和其它開(kāi)發(fā)語(yǔ)言不同,Go的字符串是由單個(gè)字節(jié)連接起來(lái)的。

Go語(yǔ)言統(tǒng)一使用utf-8編碼標(biāo)識(shí)Unicode文本。當(dāng)字符為ASCII編碼時(shí),占用1個(gè)字節(jié),其它字符占用2到4個(gè)字節(jié),中文占用3個(gè)字節(jié)

如何修改字符串的內(nèi)容

有三種方法:

  • 將字符串轉(zhuǎn)成byte切片,再根據(jù)下標(biāo)替換內(nèi)容
  • 將字符串轉(zhuǎn)為rune切片,再根據(jù)下標(biāo)替換內(nèi)容
  • 使用原生包 strings 中的 Replace() 方法

示例代碼

package main

import (
   "fmt"
   "strings"
)

func main() {
   //第一種方法 將字符串轉(zhuǎn)成byte切片
   s := "hello"
   s2 := []byte(s)
   s2[0] = 'x'
   fmt.Printf("轉(zhuǎn)成byte切片:%v\n", string(s2)) //打印結(jié)果:轉(zhuǎn)成byte切片:xello

   // 第二種方法 將字符串轉(zhuǎn)為rune切片
   s3 := "王中陽(yáng)"
   s4 := []rune(s3) //注意:中文字符串要進(jìn)行修改,只能轉(zhuǎn)成rune切片,不能轉(zhuǎn)成byte切片
   s4[0] = '楊'
   fmt.Printf("轉(zhuǎn)成rune切片:%v\n", string(s4)) //打印結(jié)果:轉(zhuǎn)成rune切片:楊中陽(yáng)

   // 第三種方法,使用原生包strings 中的 Replace() 方法
   s5 := "abcdef"
   old := "abc"
   newString := "ABC"
   s6 := strings.Replace(s5, old, newString, -1) //最后一個(gè)參數(shù)n的作用是:返回將s5中前n個(gè)不重疊old子串都替換為new的新字符串,如果n<0會(huì)替換所有old子串。
   fmt.Printf("strings替換之后的:%v\n", s6)           //打印結(jié)果:strings替換之后的:ABCdef
}

運(yùn)行結(jié)果

slice

slice可以通過(guò)append方式實(shí)現(xiàn)元素的刪除。

**切片使用冒號(hào)分隔時(shí)遵循"前閉后開(kāi)"原則,即包括前面的值,不包括后面的值。 **

1.刪除單個(gè)元素

package main

import "fmt"

//使用append 刪除單個(gè)元素
func main() {
   var data = []int{0, 1, 2, 3, 4, 5}
   //刪除元素2
   index := 2
   //切片使用冒號(hào)分隔時(shí)遵循"前閉后開(kāi)"原則,即包括前面的值,不包括后面的值。
   data1 := append(data[:index], data[index+1:]...)
   fmt.Println(data1)
}

運(yùn)行結(jié)果

2.刪除多個(gè)元素

package main

import "fmt"

//使用append 刪除多個(gè)元素
func main() {
   var data = []int{0, 1, 2, 3, 4, 5}
   //刪除元素0,1,2
   index := 2
   //切片使用冒號(hào)分隔時(shí)遵循"前閉后開(kāi)"原則,即包括前面的值,不包括后面的值。
   data1 := append(data[:0], data[index+1:]...)
   fmt.Println(data1)
}

運(yùn)行結(jié)果

總結(jié)

這篇文章匯總了我再開(kāi)發(fā)和刷面試題過(guò)程中遇到的容易搞錯(cuò)的知識(shí)點(diǎn),包括:

  • 類型轉(zhuǎn)換和類型斷言的對(duì)比
  • 定義全局變量只能用var,定義全局變量也可以定義在init()函數(shù)中
  • init()函數(shù)的知識(shí)點(diǎn),以及init函數(shù)和main函數(shù)的執(zhí)行順序:先執(zhí)行引用包的常量和變量、在執(zhí)行引用包的init函數(shù)、再執(zhí)行本包的常量和變量、再執(zhí)行本包的init函數(shù)、最后才會(huì)執(zhí)行本包的main函數(shù)。
  • Go接口的概念總結(jié),刷面試題的時(shí)候可能碰到咬文嚼字的問(wèn)題,注意避坑。
  • Go字符串不能通過(guò)下標(biāo)直接修改內(nèi)容,但是可以通過(guò)轉(zhuǎn)成byte[]/rune[]/以及使用原生包strings中的Replace()方法修改內(nèi)容
  • Go中的slice不能像map一樣直接使用delete()方法刪除元素,可以使用append()方法+冒號(hào)分隔切片的方式,間接實(shí)現(xiàn)切片元素的刪除。

到此這篇關(guān)于Golang易錯(cuò)知識(shí)點(diǎn)匯總的文章就介紹到這了,更多相關(guān)Golang知識(shí)點(diǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在 Golang 中實(shí)現(xiàn) Cache::remember 方法詳解

    在 Golang 中實(shí)現(xiàn) Cache::remember 方法詳解

    這篇文章主要介紹了在 Golang 中實(shí)現(xiàn) Cache::remember 方法詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • GoAdminGroup/go-admin的安裝和運(yùn)行的教程詳解

    GoAdminGroup/go-admin的安裝和運(yùn)行的教程詳解

    這篇文章主要介紹了GoAdminGroup/go-admin的安裝和運(yùn)行的教程詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Go解析不定JSON數(shù)據(jù)的方法詳解

    Go解析不定JSON數(shù)據(jù)的方法詳解

    在開(kāi)發(fā)中常常會(huì)碰到很多JSON類型的數(shù)據(jù)進(jìn)行交互,而其中有很多JSON數(shù)據(jù)你是不能確定它的字段和結(jié)構(gòu)的,而Go語(yǔ)言是一門靜態(tài)強(qiáng)類型的語(yǔ)言,在進(jìn)行JSON解析的時(shí)候必須要確定字段的類型,本文給大家介紹了Go如何解析不定JSON數(shù)據(jù),需要的朋友可以參考下
    2024-03-03
  • 淺談golang中的&^位清空操作

    淺談golang中的&^位清空操作

    這篇文章主要介紹了淺談golang中的&^位清空操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • golang?struct?json?tag的使用以及深入講解

    golang?struct?json?tag的使用以及深入講解

    這篇文章主要給大家介紹了關(guān)于golang?struct?json?tag的使用以及深入講解,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-02-02
  • Go 基于令牌桶的限流器實(shí)現(xiàn)

    Go 基于令牌桶的限流器實(shí)現(xiàn)

    如果一般流量過(guò)大,下游系統(tǒng)反應(yīng)不過(guò)來(lái),這個(gè)時(shí)候就需要限流了,本文主要介紹了Go 基于令牌桶的限流器實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Go項(xiàng)目編寫Makefile規(guī)則文件概述

    Go項(xiàng)目編寫Makefile規(guī)則文件概述

    這篇文章主要為大家介紹了Go項(xiàng)目編寫Makefile文件規(guī)則概述,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • go語(yǔ)言按顯示長(zhǎng)度截取字符串的方法

    go語(yǔ)言按顯示長(zhǎng)度截取字符串的方法

    這篇文章主要介紹了go語(yǔ)言按顯示長(zhǎng)度截取字符串的方法,涉及Go語(yǔ)言操作字符串的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Go實(shí)現(xiàn)整合Logrus實(shí)現(xiàn)日志打印

    Go實(shí)現(xiàn)整合Logrus實(shí)現(xiàn)日志打印

    這篇文章主要介紹了Go實(shí)現(xiàn)整合Logrus實(shí)現(xiàn)日志打印,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • Go網(wǎng)絡(luò)編程TCP抓包實(shí)操示例探究

    Go網(wǎng)絡(luò)編程TCP抓包實(shí)操示例探究

    作為一名軟件開(kāi)發(fā)者,網(wǎng)絡(luò)編程是必備知識(shí),本文通過(guò)?Go?語(yǔ)言實(shí)現(xiàn)?TCP?套接字編程,并結(jié)合?tcpdump?工具,展示它的三次握手、數(shù)據(jù)傳輸以及四次揮手的過(guò)程,幫助讀者更好地理解?TCP?協(xié)議與?Go?網(wǎng)絡(luò)編程
    2024-01-01

最新評(píng)論

社旗县| 沅江市| 鹿泉市| 正安县| 巢湖市| 吉隆县| 水城县| 乐安县| 益阳市| 镇坪县| 屯留县| 乌恰县| 金平| 托克托县| 高安市| 托克托县| 财经| 利川市| 南郑县| 连平县| 武穴市| 将乐县| 铁岭县| 萍乡市| 涿州市| 广汉市| 五常市| 皋兰县| 辉县市| 康乐县| 夏河县| 石阡县| 阿荣旗| 沁阳市| 浏阳市| 佛坪县| 安国市| 胶州市| 景宁| 侯马市| 油尖旺区|