中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

go中與java C++中應該注意的語法糖以及不同點是什么

發布時間:2021-11-20 16:01:14 來源:億速云 閱讀:139 作者:柒染 欄目:云計算

這篇文章將為大家詳細講解有關go中與java C++中應該注意的語法糖以及不同點是什么,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

背景

最近在用golang寫k8s operator(其中涉及到informer controler )用于內部調度平臺用,剛好借此機會能夠與java版本的 informer controller進行對比,由于之前對golang沒怎么接觸過,遇到了和java c++不同的語法糖,現在列舉一下:

具體不同

glang中package

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

golang中struct

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

type Member struct {
    Id     int    `json:"id"`
}
//綁定到Member結構的方法,但是這種不會改變member的值,因為結構體是值傳遞,當我們調用setID時,方法接收器接收到是只是結構體變量的一個副本,通過副本對值進行修復,并不會影響調用者,因此,我們可以將方法接收器定義為指針變量,就可達到修改結構體的目的
func (m Member)setId(id int){
    m.Id = id
}
m := Member{}
m.setId(1)
fmt.Println(m.Id)//輸出為空
//綁定到Member結構的方法,會改變member的值 
func (m *Member)setId(id int){
    m.Id = id
}
m := Member{}
m.setId(1)
fmt.Println(m.Id)//輸出為1

關于方法的接受者和接口如何被調用,參考如下:

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

  • 當方法的接收者是值時,不管是值調用還是指針調用,方法內部都是對原對象的副本進行操作,不會影響原對象型,那么方法的接受者必須也是值類型該方法才可以被調用

  • 當方法的接收者是指針時,不管是值調用還是指針調用,方法內部都是通過指針對原對象進行操作,會影響原對象

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

定義struct的tags

在定義strut的結構體時,可以添加tag,tag可以在運行時用到,以及形成json或者xml時用到如下:

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"|表示內嵌類型的key和外層struct的key是平行關系,如NetworkList里的key和Project key在形成json的時候是平行關系,不是內嵌關系,也就是在同一級 json:"id,-"|-(橫杠) 表示私有字段,形成json的時候不包括該key json:"f3,omitempty|omitempty表示該字段為空,則生成json時,不包括該key json:"f4"|表示生成json時,key為f4

golang的類型轉換

c++ java 中有隱式類型轉換,golang沒有,golang中有強制類型轉換和類型斷言

  • 強制類型轉換

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{}是空接口沒有任何方法,且所有類型都實現了空接口,相當于java中的object,interface類型默認是一個指針

golang中的go關鍵字

go 關鍵字用來創建 goroutine (協程),是實現并發的關鍵

//go 關鍵字放在方法調用前新建一個 goroutine 并讓他執行方法體
go GetThingDone(param1, param2);

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

//直接新建一個 goroutine 并在 goroutine 中執行代碼塊
go {
    //do someting...
}

golang中的defer關鍵字

  • defer 的執行方式類似其他語言中的析構函數,在函數體執行結束后按照調用順序的相反順序逐個執行

  • 即使函數發生嚴重錯誤也會執行,相當于finally

  • 常用于資源清理、文件關閉、解鎖以及記錄時間等操作

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

golang中的init 函數

golang的init函數在該文件被被引用時才執行(是import時,不是調用包函數時)

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

匿名函數

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

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

關于go中與java C++中應該注意的語法糖以及不同點是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武清区| 阳新县| 西安市| 长兴县| 梅河口市| 通化县| 大埔区| 宽甸| 临沭县| 晋州市| 高雄市| 鹰潭市| 个旧市| 瓦房店市| 玉屏| 丰县| 田林县| 民乐县| 乐东| 花莲市| 治多县| 辽宁省| 兴隆县| 香河县| 迭部县| 泽普县| 城口县| 白水县| 阳山县| 禹州市| 呼和浩特市| 伽师县| 抚州市| 延边| 鄄城县| 白城市| 上栗县| 肃南| 同德县| 衡南县| 固镇县|