go中與javaC++中應(yīng)該注意的語(yǔ)法糖以及不同點(diǎn)是什么

這篇文章將為大家詳細(xì)講解有關(guān)go中與java C++中應(yīng)該注意的語(yǔ)法糖以及不同點(diǎn)是什么,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

目前創(chuàng)新互聯(lián)公司已為數(shù)千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、商河網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

背景

最近在用golang寫(xiě)k8s operator(其中涉及到informer controler )用于內(nèi)部調(diào)度平臺(tái)用,剛好借此機(jī)會(huì)能夠與java版本的 informer controller進(jìn)行對(duì)比,由于之前對(duì)golang沒(méi)怎么接觸過(guò),遇到了和java c++不同的語(yǔ)法糖,現(xiàn)在列舉一下:

具體不同

glang中package

每個(gè) Go 文件都屬于且僅屬于一個(gè)包,必須在源文件中非注釋的第一行指明這個(gè)文件屬于哪個(gè)包,如:package main,package main 表示一個(gè)可獨(dú)立執(zhí)行的程序,
每個(gè) Go 應(yīng)用程序都包含一個(gè)名為 main 的包。package main 包下可以有多個(gè)文件,但所有文件中只能有一個(gè) main () 方法,main () 方法代表程序入口

golang中struct

golang中沒(méi)有class的概念,但是有struct,而且可以給struct增加方法,如下:

type Member struct {
    Id     int    `json:"id"`
}
//綁定到Member結(jié)構(gòu)的方法,但是這種不會(huì)改變member的值,因?yàn)榻Y(jié)構(gòu)體是值傳遞,當(dāng)我們調(diào)用setID時(shí),方法接收器接收到是只是結(jié)構(gòu)體變量的一個(gè)副本,通過(guò)副本對(duì)值進(jìn)行修復(fù),并不會(huì)影響調(diào)用者,因此,我們可以將方法接收器定義為指針變量,就可達(dá)到修改結(jié)構(gòu)體的目的
func (m Member)setId(id int){
    m.Id = id
}
m := Member{}
m.setId(1)
fmt.Println(m.Id)//輸出為空
//綁定到Member結(jié)構(gòu)的方法,會(huì)改變member的值 
func (m *Member)setId(id int){
    m.Id = id
}
m := Member{}
m.setId(1)
fmt.Println(m.Id)//輸出為1

關(guān)于方法的接受者和接口如何被調(diào)用,參考如下:

  • 不管方法的接收者是值還是指針,對(duì)象的值和指針均可以調(diào)用該方法型,那么方法的接受者可以是值類型也可以是指針類型

  • 當(dāng)方法的接收者是值時(shí),不管是值調(diào)用還是指針調(diào)用,方法內(nèi)部都是對(duì)原對(duì)象的副本進(jìn)行操作,不會(huì)影響原對(duì)象型,那么方法的接受者必須也是值類型該方法才可以被調(diào)用

  • 當(dāng)方法的接收者是指針時(shí),不管是值調(diào)用還是指針調(diào)用,方法內(nèi)部都是通過(guò)指針對(duì)原對(duì)象進(jìn)行操作,會(huì)影響原對(duì)象

注意:struct的屬性可以沒(méi)有名字而只有類型,使用時(shí)類型即為屬性名。(因此,一個(gè)struct中同一個(gè)類型的匿名屬性只能有一個(gè))

定義struct的tags

在定義strut的結(jié)構(gòu)體時(shí),可以添加tag,tag可以在運(yùn)行時(shí)用到,以及形成json或者xml時(shí)用到如下:

type NetworkList struct {
	Project  `json:",inline"`
	f2 int    `json:"id,-"`
    f3 string `json:"f3,omitempty"`
	f4 string `json:"f4"`
}

type Project struct {
	Key   string `json:"key"`
	Value string `json:"value"`
}

其中,
名詞|解釋 ---|--- json:",inline"|表示內(nèi)嵌類型的key和外層struct的key是平行關(guān)系,如NetworkList里的key和Project key在形成json的時(shí)候是平行關(guān)系,不是內(nèi)嵌關(guān)系,也就是在同一級(jí) json:"id,-"|-(橫杠) 表示私有字段,形成json的時(shí)候不包括該key json:"f3,omitempty|omitempty表示該字段為空,則生成json時(shí),不包括該key json:"f4"|表示生成json時(shí),key為f4

golang的類型轉(zhuǎn)換

c++ java 中有隱式類型轉(zhuǎn)換,golang沒(méi)有,golang中有強(qiáng)制類型轉(zhuǎn)換和類型斷言

  • 強(qiáng)制類型轉(zhuǎn)換

package main

import "fmt"

func main() {
    var a float32 = 5.6
    var b int = 10
    fmt.Println (a * float32(b))
}
  • 類型斷言

package main

import "fmt"

func main() {
    var a interface{} =10
    t,ok:= a.(int)
    if ok{
        fmt.Println("int",t)
    }
    t2,ok:= a.(float32)
    if ok{
        fmt.Println("float32",t2)
    }
}

golang中的interface{}

interface{}是空接口沒(méi)有任何方法,且所有類型都實(shí)現(xiàn)了空接口,相當(dāng)于java中的object,interface類型默認(rèn)是一個(gè)指針

golang中的go關(guān)鍵字

go 關(guān)鍵字用來(lái)創(chuàng)建 goroutine (協(xié)程),是實(shí)現(xiàn)并發(fā)的關(guān)鍵

//go 關(guān)鍵字放在方法調(diào)用前新建一個(gè) goroutine 并讓他執(zhí)行方法體
go GetThingDone(param1, param2);

//上例的變種,新建一個(gè)匿名方法并執(zhí)行
go func(param1, param2) {
}(val1, val2)

//直接新建一個(gè) goroutine 并在 goroutine 中執(zhí)行代碼塊
go {
    //do someting...
}

golang中的defer關(guān)鍵字

  • defer 的執(zhí)行方式類似其他語(yǔ)言中的析構(gòu)函數(shù),在函數(shù)體執(zhí)行結(jié)束后按照調(diào)用順序的相反順序逐個(gè)執(zhí)行

  • 即使函數(shù)發(fā)生嚴(yán)重錯(cuò)誤也會(huì)執(zhí)行,相當(dāng)于finally

  • 常用于資源清理、文件關(guān)閉、解鎖以及記錄時(shí)間等操作

func main() {
  fmt.Println("a")
  
  defer fmt.Println("b")
  defer fmt.Println("c")
}
//打印
//a
//c
//b

golang中的init 函數(shù)

golang的init函數(shù)在該文件被被引用時(shí)才執(zhí)行(是import時(shí),不是調(diào)用包函數(shù)時(shí))

package lib
import "fmt"
func init() {
    fmt.Println("lib empty init ")
}
----
package main

import (
    "Test/lib"
    "fmt"
)

func main() {
    fmt.Println("wint")
}
// 輸出
//lib empty init  
//wint

匿名函數(shù)

該用法和java C++中差不多

func() {
    //func body
}()     //花括號(hào)后加()表示函數(shù)調(diào)用,此處聲明時(shí)為指定參數(shù)列表,
        //故調(diào)用執(zhí)行時(shí)也不需要傳參

關(guān)于go中與java C++中應(yīng)該注意的語(yǔ)法糖以及不同點(diǎn)是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

新聞標(biāo)題:go中與javaC++中應(yīng)該注意的語(yǔ)法糖以及不同點(diǎn)是什么
瀏覽路徑:http://bm7419.com/article46/gocdeg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、搜索引擎優(yōu)化、標(biāo)簽優(yōu)化、關(guān)鍵詞優(yōu)化、虛擬主機(jī)、域名注冊(cè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站