Golang面試題解析(二)

來源:互聯網
上載者:User

12.是否可以編譯通過?如果通過,輸出什嗎?

func main() {i := GetValue()switch i.(type) {case int:println("int")case string:println("string")case interface{}:println("interface")default:println("unknown")}}func GetValue() int {return 1}

解析

考點:type

編譯失敗,因為type只能使用在interface

13.下面函數有什麼問題?

func funcMui(x,y int)(sum int,error){    return x+y,nil}

解析

考點:函數傳回值命名 在函數有多個傳回值時,只要有一個傳回值有指定命名,其他的也必須有命名。 如果傳回值有有多個傳回值必須加上括弧; 如果只有一個傳回值並且有命名也需要加上括弧; 此處函數第一個傳回值有sum名稱,第二個為命名,所以錯誤。

14.是否可以編譯通過?如果通過,輸出什嗎?

package mainfunc main() {println(DeferFunc1(1))println(DeferFunc2(1))println(DeferFunc3(1))}func DeferFunc1(i int) (t int) {t = idefer func() {t += 3}()return t}func DeferFunc2(i int) int {t := idefer func() {t += 3}()return t}func DeferFunc3(i int) (t int) {defer func() {t += i}()return 2}

解析

考點:defer和函數傳回值 需要明確一點是defer需要在函數結束前執行。 函數傳回值名字會在函數起始處被初始化為對應類型的零值並且範圍為整個函數 DeferFunc1有函數傳回值t範圍為整個函數,在return之前defer會被執行,所以t會被修改,返回4; DeferFunc2函數中t的範圍為函數,返回1; DeferFunc3返回3

15.是否可以編譯通過?如果通過,輸出什嗎?

func main() {list := new([]int)list = append(list, 1)fmt.Println(list)}

解析

考點:new list:=make([]int,0)

16.是否可以編譯通過?如果通過,輸出什嗎?

package mainimport "fmt"func main() {s1 := []int{1, 2, 3}s2 := []int{4, 5}s1 = append(s1, s2)fmt.Println(s1)}

解析

考點:append append切片時候別漏了'...'

17.是否可以編譯通過?如果通過,輸出什嗎?

func main() {sn1 := struct {age  intname string}{age: 11, name: "qq"}sn2 := struct {age  intname string}{age: 11, name: "qq"}if sn1 == sn2 {fmt.Println("sn1 == sn2")}sm1 := struct {age intm   map[string]string}{age: 11, m: map[string]string{"a": "1"}}sm2 := struct {age intm   map[string]string}{age: 11, m: map[string]string{"a": "1"}}if sm1 == sm2 {fmt.Println("sm1 == sm2")}}

解析

考點:結構體比較 進行結構體比較時候,只有相同類型的結構體才可以比較,結構體是否相同不但與屬性類型個數有關,還與屬性順序相關。

sn3:= struct {    name string    age  int}{age:11,name:"qq"}

sn3與sn1就不是相同的結構體了,不能比較。 還有一點需要注意的是結構體是相同的,但是結構體屬性中有不可以比較的類型,如map,slice。 如果該結構屬性都是可以比較的,那麼就可以使用“==”進行比較操作。

可以使用reflect.DeepEqual進行比較

if reflect.DeepEqual(sn1, sm) {    fmt.Println("sn1 ==sm")}else {    fmt.Println("sn1 !=sm")}

所以編譯不通過: invalid operation: sm1 == sm2

18.是否可以編譯通過?如果通過,輸出什嗎?

func Foo(x interface{}) {if x == nil {fmt.Println("empty interface")return}fmt.Println("non-empty interface")}func main() {var x *int = nilFoo(x)}

解析

考點:interface內部結構

non-empty interface

19.是否可以編譯通過?如果通過,輸出什嗎?

func GetValue(m map[int]string, id int) (string, bool) {if _, exist := m[id]; exist {return "存在資料", true}return nil, false}func main()  {intmap:=map[int]string{1:"a",2:"bb",3:"ccc",}v,err:=GetValue(intmap,3)fmt.Println(v,err)}

解析

考點:函數傳回值類型 nil 可以用作 interface、function、pointer、map、slice 和 channel 的“空值”。但是如果不特別指定的話,Go 語言不能識別類型,所以會報錯。通常編譯的時候不會報錯,但是運行是時候會報:cannot use nil as type string in return argument.

20.是否可以編譯通過?如果通過,輸出什嗎?

const (x = iotayz = "zz"kp = iota)func main()  {fmt.Println(x,y,z,k,p)}

解析

考點:iota 

結果:

0 1 zz zz 4


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.