GO語言測試題


 

選擇題

【初級】下面屬於關鍵字的是()
A. func
B. def
C. struct
D. class
  參考答案:AC,func 定義函數,struct 定義結構體的復雜數據類型

【初級】定義一個包內全局字符串變量,下面語法正確的是()
A. var str string
B. str := “”
C. str = “”
D. var str = “”
  參考答案:AD ,B := 只能用於函數體內局部變量

【初級】通過指針變量 p 訪問其成員變量 name,下面語法正確的是()
A. p.name
B. (*p).name
C. (&p).name
D. p->name
  參考答案:ABC D是C語言的訪問方式,GO中用於給channel中寫數據,B輸出的是值的name是無效的

type Person struct {
	name string
}

func test(p *Person) {
	fmt.Println((*p).name) //取出指針
}

func main() {
	demo := Person{name:"wang"}
	fmt.Println(demo.name)

	test(&Person{name:"Wu"}) // 指針傳遞后,給函數的變量要使用*取出指針
	fmt.Println((&demo).name)  // 本身為指針則可以使用.屬性:(指針).name
}

  

【初級】關於接口和類的說法,下面說法正確的是()
A. 一個類只需要實現了接口要求的所有函數,我們就說這個類實現了該接口
B. 實現類的時候,只需要關心自己應該提供哪些方法,不用再糾結接口需要拆得多細才合理
C. 類實現接口時,需要導入接口所在的包
D. 接口由使用方按自身需求來定義,使用方無需關心是否有其他模塊定義過類似的接口
  參考答案:A

【初級】關於字符串連接,下面語法正確的是()
A. str := ‘abc’ + ‘123’
B. str := “abc” + “123”
C. str := ‘123’ + “abc”
D. fmt.Sprintf(“abc%d”, 123)
  參考答案:BD ‘’ 是單字符

【初級】關於協程,下面說法正確是()
A. 協程和線程都可以實現程序的並發執行
B. 線程比協程更輕量級
C. 協程不存在死鎖問題
D. 通過channel來進行協程間的通信
  參考答案:AD 協程比線程輕量

【中級】關於init函數,下面說法正確的是()
A. 一個包中,可以包含多個init函數
B. 程序編譯時,先執行導入包的init函數,再執行本包內的init函數
C. main包中,不能有init函數
D. init函數可以被其他函數調用
  參考答案:AB

1、init函數用於包的初始化,如初始化包中的變量,這個初始化在package xxx的時候完成,也就是在main之前完成;
2、每個包可以擁有多個init函數, 每個包的源文件也可以擁有多個init函數;
3、同一個包中多個init函數的執行順序是沒有明確定義的,但是不同包的init函數是根據包導入的依賴關系決定的。
4、init函數不能被其他函數調用,其實在main函數之前自動執行的
關於import _ " "的說明

    go對包導入非常嚴格,不允許導入不使用的包。但是有時候我們導入包只是為了做一些初始化的工作,這樣就應該采用import _ "
"的形式,如第II節的例程中我們采用了import _ " "的形式導入level1和level2包,這樣就可以在只完成初始化,也不會報錯

 

【初級】關於循環語句,下面說法正確的有()
A. 循環語句既支持for關鍵字,也支持while和do-while
B. 關鍵字for的基本使用方法與C/C++中沒有任何差異
C. for循環支持continue和break來控制循環,但是它提供了一個更高級的break,可以選擇中斷哪一個循環
D. for循環不支持以逗號為間隔的多個賦值語句,必須使用平行賦值的方式來初始化多個變量
  參考答案:CD 不支持while和do-while

【初級】關於類型轉化,下面語法正確的是()
A.

type MyInt int
var i int = 1
var j MyInt = i

B.
type MyInt int
var i int= 1
var j MyInt = (MyInt)i

C.
type MyInt int
var i int= 1
var j MyInt = MyInt(i)

D.
type MyInt int
var i int= 1
var j MyInt = i.(MyInt)

參考答案:C   A沒有類型轉化, B 變量加()

func main() {
	type MyInt int
	var i int= 1
	var j MyInt = MyInt(i)
	fmt.Println(reflect.TypeOf(j),reflect.TypeOf(i),j) // main.MyInt int 1
}

  

【初級】關於局部變量的初始化,下面正確的使用方式是()
A. var i int = 10
B. var i = 10
C. i := 10
D. i = 10
  參考答案:ABC

 

【初級】關於const常量定義,下面正確的使用方式是()
A.

const Pi float64 = 3.14159265358979323846
const zero= 0.0
B.
const (
size int64= 1024
eof = -1
)
C.
const (
ERR_ELEM_EXISTe rror = errors.New(“element already exists”)
ERR_ELEM_NT_EXIST error = errors.New(“element not exists”)
)
D.
const u, vfloat32 = 0, 3
const a,b, c = 3, 4, “foo”

  參考答案:ABD

 

【初級】關於布爾變量b的賦值,下面錯誤的用法是()
A. b = true
B. b = 1
C. b = bool(1)
D. b = (1 == 2)
  參考答案:BC 布爾值為:true或 flase

【中級】下面的程序的運行結果是()

func main() {
  if (true) {
    defer fmt.Printf("1")
   } else {
    defer fmt.Printf("2")
   }
  fmt.Printf("3")
}
A. 3 2 1
B. 3 2
C. 3 1
D. 1 3

  參考答案:C defer 時間延遲函數

 

【初級】關於switch語句,下面說法正確的有()
A. 條件表達式必須為常量或者整數
B. 單個case中,可以出現多個結果選項
C. 需要用break來明確退出一個case
D. 只有在case中明確添加fallthrough關鍵字,才會繼續執行緊跟的下一個case
  參考答案:BD 條件表達式可以為表達式 ,go中不需要用break來明確退出一個case

【中級】 golang中的引用類型包括()
A. 數組切片
B. map
C. channel
D. interface
  參考答案:ABCD

golang中分為值類型和引用類型
值類型分別有:int系列、float系列、bool、string、數組和結構體
引用類型有:指針、slice切片、管道channel、接口interface、map、函數等
值類型的特點是:變量直接存儲值
引用類型的特點是:變量存儲的是一個地址,這個地址對應的空間里才是真正存儲的值

 

【中級】 golang中的指針運算包括()
A. 可以對指針進行自增或自減運算
B. 可以通過“&”取指針的地址
C. 可以通過“*”取指針指向的數據
D. 可以對指針進行下標運算
  參考答案:BC ,指針不能下標,加減運算

【初級】關於main函數(可執行程序的執行起點),下面說法正確的是()
A. main函數不能帶參數
B. main函數不能定義返回值
C. main函數所在的包必須為main包
D. main函數中可以使用flag包來獲取和解析命令行參數
  參考答案:ABCD ,go語言和C語言不一樣,go 中Main函數和init函數都沒有參數和返回值的定義。

【中級】下面賦值正確的是()
A. var x = nil
B. var x interface{} = nil
C. var x string = nil
D. var x error = nil
  參考答案:BD nil == C語言中的NULL 是無類型的數值常亮 A無法解釋類型,C,cannot use nil as type string in assignment, error 和 interface{} 接口類的都可以賦值為nil

 

【中級】關於整型切片的初始化,下面正確的是()
A. s := make([]int)
B. s := make([]int, 0)
C. s := make([]int, 5, 10)
D. s := []int{1, 2, 3, 4, 5}
  參考答案:BCD make 必須要類型 容量

 

【中級】關於函數聲明,下面語法錯誤的是()
A. func f(a, b int) (value int, err error)
B. func f(a int, b int) (value int, err error)
C. func f(a, b int) (value int, error)
D. func f(a int, b int) (int, int, error)
  參考答案:C error 需要單獨聲明形參

 

【中級】關於GetPodAction定義,下面賦值正確的是()

package main

import "fmt"

type Common interface {
	Hello(name string) error
}

type Commons interface {
	HelloX(name string) error
}
type Person struct {
	name string
}

// 值拷貝是無法改變的
func (p Person) Hello(name string) error {
	p.name = name
	fmt.Println("接口實現函數",name)
	return nil
}

// 傳入的是指針是可以改變傳入值的屬性的
func (p *Person) HelloX(name string) error {
	p.name = name
	fmt.Println("接口實現函數",name)
	return nil
}

func main() {
	demo := Person{name:"wang"}
	demo.Hello("Wu")
	fmt.Println(demo.name)  // wang 說明結構體是值傳遞

	var inter_demo Common
	b := Person{name:"li"}
	inter_demo = b
	inter_demo.Hello("Xing")
	fmt.Println(b.name)


	var inter_demo2 Commons
	c := &Person{name:"xxx"}
	inter_demo2 = c
	inter_demo2.HelloX("Change")
	fmt.Println(c.name)

	fmt.Println(inter_demo2.(*Person))
	// 類型斷言: x.(T)  x為接口變量,T為類型
	if person, err := inter_demo2.(*Person); err == true {  // 由於HelloX使用的是指針所以需要使用*Person
		fmt.Println(person.name)
	}

	if person2, err := inter_demo.(Person); err == true{
		fmt.Println(person2.name)
	}
}

  

【中級】關於接口,下面說法正確的是()
A. 只要兩個接口擁有相同的方法列表(次序不同不要緊),那么它們就是等價的,可以相互賦值
B. 如果接口A的方法列表是接口B的方法列表的子集,那么接口B可以賦值給接口A
C. 接口查詢是否成功,要在運行期才能夠確定
D. 接口賦值是否可行,要在運行期才能夠確定
  參考答案:ABC

只要兩個接口擁有相同的方法列表(次序不同不要緊),那么它們就是等價的,可以相互賦值。 Go語言接口是否可以賦值,是在編譯期就確定的。接口的查詢是在運行期確定。

【初級】關於channel,下面語法正確的是()
A. var ch chan int
B. ch := make(chan int)
C. <- ch
D. ch <-
  參考答案:ABC ,沒有 ch <-

【初級】關於同步鎖,下面說法正確的是()
A. 當一個goroutine獲得了Mutex后,其他goroutine就只能乖乖的等待,除非該goroutine釋放這個Mutex
B. RWMutex在讀鎖占用的情況下,會阻止寫,但不阻止讀
C. RWMutex在寫鎖占用情況下,會阻止任何其他goroutine(無論讀和寫)進來,整個鎖相當於由該goroutine獨占
D. Lock()操作需要保證有Unlock()或RUnlock()調用與之對應
  參考答案:ABC 無論是RWMutex還是Mutex,與Lock()對應的都是Unlock()

【中級】 golang中大多數數據類型都可以轉化為有效的JSON文本,下面幾種類型除外()
A. 指針
B. channel
C. complex
D. 函數
  參考答案:BCD 指針本身不能進行序列化,go提供了隱式轉換,表面進行的是指針序列化,內部會針對指針進行取值操作,實際還是針對的起所指的對象進行序列化了

 

【初級】 flag是bool型變量,下面if表達式符合編碼規范的是()
A. if flag == 1
B. if flag
C. if flag == false
D. if !flag
  參考答案:BD

 

【初級】 value是整型變量,下面if表達式符合編碼規范的是()
A. if value == 0
B. if value
C. if value != 0
D. if !value

  參考答案:AC

【中級】關於函數返回值的錯誤設計,下面說法正確的是()
A. 如果失敗原因只有一個,則返回bool
B. 如果失敗原因超過一個,則返回error
C. 如果沒有失敗原因,則不返回bool或error
D. 如果重試幾次可以避免失敗,則不要立即返回bool或error
  參考答案:ABCD

【中級】關於異常設計,下面說法正確的是()
A. 在程序開發階段,堅持速錯,讓程序異常崩潰
B. 在程序部署后,應恢復異常避免程序終止
C. 一切皆錯誤,不用進行異常設計
D. 對於不應該出現的分支,使用異常處理
  參考答案:ABD

【中級】關於slice或map操作,下面正確的是()
A.

var s []int

s =append(s,1)

B.

var mmap[string]int

m[“one”]= 1

C.

var s[]int

s =make([]int, 0)

s =append(s,1)

D.

var mmap[string]int

m =make(map[string]int)

m[“one”]= 1

  參考答案:ACD

Make只用來創建slice,map,channel。 其中map使用前必須初始化,一定要make才能使用。
append可直接動態擴容slice,而map不行,map在使用前必須初始化。 var m map[string]int =
make(map[string]int) m[“one”] = 1 或者 var m map[string]int =
map[string]int{“two”, 2} m[“one”] = 1

  

【中級】關於channel的特性,下面說法正確的是()
A. 給一個 nil channel 發送數據,造成永遠阻塞
B. 從一個 nil channel 接收數據,造成永遠阻塞
C. 給一個已經關閉的 channel 發送數據,引起 panic
D. 從一個已經關閉的 channel 接收數據,如果緩沖區中為空,則返回一個零值
  參考答案:ABCD nil channel代表channel未初始化,向未初始化的channel讀寫數據會造成永久阻塞。關閉(close)未初始化的channel會引起panic

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM