linkedin-skill-assessments-quizzes

Go(编程语言)

Q1. 让两个函数属于相同类型需要满足什么条件?

Go(Golang)中的用户自定义函数类型

Q2. 将一个 UTF-8 编码的字符串传给 len() 函数会返回什么?

Go(Golang)中字符串长度.

Q3. 下列哪一个不是 Go 中有效的循环结构?

      do { ... } while i < 5
      for _,c := range "hello" { ... }
      for i := 1; i < 5; i++ { ... }
      for i < 5 { ... }

Explanation: Go 只有 for 循环。

Q4. 你如何把数字 3 添加到右侧?

values := []int{1, 1, 2}
      values.append(3)
      values.insert(3, 3)
      append(values, 3)
      values = append(values, 3)

Explanation: 在 Go 中切片是不可变的,因此调用 append 不会修改原切片。

Q5. Read 的值是多少?

const (
  Write = iota
  Read
  Execute
)

Go(Golang)中的 IOTA

Q6. 下列哪个是 Go 中唯一有效的 import 语句?

      import "github/gin-gonic/gin"
      import "https://github.com/gin-gonic/gin"
      import "../template"
      import "github.com/gin-gonic/gin"

GoLang 中的 Import

Q7. 如果你尝试编译并运行下面这个 Go 程序,会发生什么?

package main
var GlobalFlag string
func main() {
  print("["+GlobalFlag+"]")
}
  1. Go 中变量有初始值。对字符串类型来说,其初始值是空字符串。
  2. Go Playground

Q8. 如果变量 myVar 在模块 myModule 中的包 myPackage 的某个文件里、所有函数之外声明,那么它可以从哪里被访问?

Explanation: 若要让该变量在 myPackage 之外可用,请将名称改为 MyVar。 另请参阅 Go 之旅中的导出名称示例。

Q9. 你如何让 go test 打印它正在运行的测试?

test 包

Q10. 这段代码打印了 {0, 0}。你如何修复它?

type Point struct {
  x int
  y int
}

func main() {
  data := []byte(`{"x":1, "y": 2}`)
  var p Point
  if err := json.Unmarshal(data, &p); err != nil {
    fmt.Println("error: ", err)
  } else {
    fmt.Println(p)
  }
}
  1. 如何在 Golang 中解析 JSON?
  2. Go Playground

Q11. 当 sync.Mutex 处于加锁状态时,它会阻塞什么?

  1. GoLang 中的 Mutexsync.Mutex 会加锁,使得同一时间只有一个 goroutine 可以访问被保护的变量。
  2. sync.Mutex

Q12. 以惯用方式暂停当前作用域的执行,直到任意数量的 goroutine 返回,应当使用什么?

Explanation: 这正是 sync.WaitGroup 的用途——在 Golang 中使用 sync.WaitGroup

Q13. 在 select 语句中使用 time.After 的副作用是什么?

注意:它不会阻塞 select,也不会阻塞其他通道。

  1. Golang 中的 time.After() 函数及示例
  2. 如何在 Golang 中使用 ‘time.After’ 和 ‘default’?
  3. Go Playground 示例

Q14. select 语句用于什么?

GoLang 中的 Select 语句

Q15. 按照 Go 文档标准,你应该如何为下面的函数编写文档?

func Add(a, b int) int {
        return a + b
}

Explanation: 文档注释应当以函数名开头。

Go 中的注释

Q16. 为了能编译 i := myVal.(int)myVal 的类型限制是什么?

Explanation: 这种使用 .(type) 的类型断言只用于接口。

  1. 示例
  2. 原始类型的类型转换方式不同
  3. Go Playground
  4. 类型断言

Q17. 什么是通道(channel)?

Channels

Q18. 如何让某个文件仅在 Windows 上编译?

  1. 如何使用 go build 工具进行条件编译(2013 年 10 月)
  2. go 命令的构建约束

//go:build windows “Go 1.16 及更早版本使用不同的构建约束语法,前缀为 // +build。当遇到旧语法时,gofmt 会添加等效的 //go:build 约束。”

Q19. 将如下内容作为 HTTP POST 请求的 body 传递时,正确的方式是什么?

data := "A group of Owls is called a parliament"
  resp, err := http.Post("https://httpbin.org/post", "text/plain", []byte(data))
      resp, err := http.Post("https://httpbin.org/post", "text/plain", data)
      resp, err := http.Post("https://httpbin.org/post", "text/plain", strings.NewReader(data))
      resp, err := http.Post("https://httpbin.org/post", "text/plain", &data)
  1. net/http#Client.Post
  2. http.Post Golang 示例

Q20. 对于只有一个方法且签名为 Save() error 的接口,惯用的命名是什么?

Effective Go,接口命名

Q21. 一个 switch 语句_它自己的词法块(lexical block)。每个 case 语句_一个额外的词法块

Go 语言核心技术(上卷)1.5—作用域

相关文章摘录:

第二个 if 语句嵌套在第一个 if 语句内部,因此在第一个 if 中声明的变量对第二个 if 可见。switch 中也有类似规则:除了条件的词法块外,每个 case 还拥有自己的词法块。

Q22. JSON 的 Unmarshal 函数在大小写敏感性上的默认行为是什么?

encoding/json#Unmarshal

相关文章摘录:

将 JSON 解组到结构体时,Unmarshal 会将传入对象的键与 Marshal 使用的键(结构体字段名或其标签)进行匹配,更倾向于精确匹配,但也接受大小写不敏感的匹配。默认情况下,没有对应结构体字段的对象键将被忽略(另见 Decoder.DisallowUnknownFields)。

Q23. time 包中 Time.Sub()Time.Add() 的区别是什么?

  1. time#Time.Add
  2. time#Time.Sub

Q24. 在一个结构体里使用多个字段标签(field tags)有什么风险?

  1. 示例代码 / b29r0fUD1cp
  2. 如何在 Go 中使用 Struct Tags

Q25. 内置的 recover 方法在什么地方有用?

Go(Golang)中 Recover 函数示例

相关文章摘录:

只有在延迟执行的函数内部调用 recover 才有用。在延迟函数内部执行 recover 会通过恢复正常执行来停止正在进行的 panic 序列,并获取传给 panic 的错误信息。如果在延迟函数之外调用 recover,它不会停止 panic 序列。

Q26. 下列哪个选项不会把输出发送到标准错误(stderr)?

  1. func println:将结果写入标准错误。
  2. func Newfunc New(out io.Writer, prefix string, flag int) *Logger;参数 out 用于设置日志数据的输出目标。
  3. func ErrorfErrorf 根据格式化说明符进行格式化,并将字符串作为值返回。
  4. func Fprintlnfunc Fprintln(w io.Writer, a ...any) (n int, err error)Fprintln 使用操作数的默认格式并写入到 w

Q27. 如何让 Go 从不同的位置导入某个包?

  1. 从另一个模块调用你的代码:第 5 章,go mod edit -replace example.com/greetings=../greetings
  2. go.mod 的 replace 指令

Q28. 如果你的当前工作目录位于项目顶层,哪条命令会运行其所有测试包?

  1. Go(Golang)中的 testing 包
  2. Go(Golang)中的 cmd 包

相关文章摘录:

也允许使用相对模式,例如 go test ./... 来测试所有子目录。

Q29. 你可以在字符串中放入哪些编码?

  1. Go 中的字符串、字节、rune 和字符

相关文章摘录:

简而言之,Go 源码是 UTF-8,因此字符串字面量的源码是 UTF-8 文本。

  1. Go(Golang)中的编码示例

相关文章摘录:

encoding 包定义了字符编码(如 Shift JIS 和 Windows 1252)的接口,可与 UTF-8 相互转换。

Q30. 在 t.Run 内部,t.Fatal 的行为有什么不同?

  1. 参考
  2. Go 中的 testing 包,相关文章摘录:

Fatal 等价于先 LogFailNowLog 使用默认格式化参数记录文本到错误日志。 FailNow 将函数标记为失败,并通过调用 runtime.Goexit 停止其执行(随后会运行当前 goroutine 中所有延迟调用)。执行将继续到下一个测试或基准。FailNow 必须在运行测试或基准函数的 goroutine 中调用,而不是在测试期间创建的其它 goroutine 中调用。调用 FailNow 不会停止那些其它 goroutine。 Runf 作为 t 的一个名为 name 的子测试运行。它在单独的 goroutine 中运行 f 并阻塞直到 f 返回或调用 t.Parallel 成为并行测试。Run 会报告 f 是否成功(或至少在调用 t.Parallel 之前没有失败)。 可以从多个 goroutine 同时调用 Run,但所有这些调用必须在外层测试函数返回之前返回。

Q31. log.Fatal 做了什么?

Go(Golang)中 func Fatal 示例

相关文章摘录:

Fatal 等价于先 Print(),然后调用 os.Exit(1)

Q32. 哪一个是有效的 Go 时间格式字面量?

Go 中的时间常量

相关文章摘录:

Year: "2006" "06"
Month: "Jan" "January" "01" "1"
Day of the week: "Mon" "Monday"
Day of the month: "2" "_2" "02"
Day of the year: "__2" "002"
Hour: "15" "3" "03" (PM or AM)
Minute: "4" "04"
Second: "5" "05"
AM/PM mark: "PM"

Q33. 你应该如何记录一个错误(err)?

Explanation:Go 的 log 包 中既没有 log.ERROR 也没有 log.Error()log.Print() 的参数处理方式类似 fmt.Print()log.Printf() 的参数处理方式类似 fmt.Printf()

Q34. go test 命令会把哪些文件名识别为测试文件?

  1. go 命令中的测试包:’Go test’ 会重新编译每个包以及任何名称匹配“*_test.go”模式的文件。
  2. 在 Go 中添加测试

Q35. 这段代码的输出是什么?

ch := make(chan int)
ch <- 7
val := <-ch
fmt.Println(val)

Go Playground 分享,输出:

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:
main.main()
 /tmp/sandbox2282523250/prog.go:7 +0x37

Program exited.

Q36. 这个程序的输出是什么?

ch := make(chan int)
close(ch)
val := <-ch
fmt.Println(val)
  1. Go 语言规范 “接收操作符”,相关文章摘录:

    从已关闭的通道进行接收的操作总能立即继续执行,在接收了所有已发送的值之后,会得到该元素类型的零值。

  2. Go Playground 分享,输出:

0

Program exited.

Q37. 这段代码会打印什么?

var stocks map[string]float64 // stock -> price
price := stocks["MSFT"]
fmt.Printf("%f\n", price)

Go Playground 分享,输出:

0.000000

Program exited.

Q38. 在项目中拥有多个可执行文件的常见方式是什么?

  1. Stack Overflow
  2. Medium
  3. Medium

Q39. 如何将 main.go 编译为可在 OSX arm64 上运行的可执行文件?

文档

Q40. 启动一个 goroutine 来 print Hello Gopher! 的正确语法是?

启动 goroutine 的示例

Q41. 如果你在 for range 循环中迭代一个 map,键值对会以什么顺序访问?

参考

Q42. 以惯用的方式,自定义一个自定义结构体在格式化字符串中的表示应如何做?

参考

Q43. 你如何避免这段代码中的 goroutine 泄漏?

func findUser(ctx context.Context, login string) (*User, error) {
    ch := make(chan *User)
    go func() {
            ch <- findUserInDB(login)
    }()

    select {
    case user := <-ch:
            return user, nil
    case <-ctx.Done():
            return nil, fmt.Errorf("timeout")
    }
}

参考

相关文章摘录:

解决该泄漏的最简单方式是把通道从无缓冲改为容量为 1 的带缓冲通道。这样在超时场景下,接收方离开后,goroutine 仍能把 *User 值放入通道,然后返回。

44. 这段代码会打印什么?

var i int8 = 120
i += 10
fmt.Println(i)

Go Playground 示例,输出:

-126

Program exited.

45. 给定下面 worker 的定义,启动一个 goroutine 调用 worker 并将结果发送到名为 ch 的通道,正确的语法是?

func worker(m Message) Result
go func() {
    r := worker(m)
    ch <- r
}
go func() {
    r := worker(m)
    r -> ch
} ()
go func() {
    r := worker(m)
    ch <- r
} ()
go ch <- worker(m)

Go Playground 示例

Q46. 在这段代码中,哪些名称是导出的?

package os

type FilePermission int
type userID int

参考 1 参考 2

Q47. 关于 Go 中的结构体,下列哪项是正确的?

Q48. Go 编译器内置的 generate 命令做什么?

通过处理源码生成 Go 文件

Q49. 使用 time 包,如何获得从现在起 90 分钟后的时间?

func (Time) Add 示例

Q50. 一个程序使用通道在 goroutine 中打印五个整数,同时在主协程中向通道喂入整数,但按现状它不能正常工作。你需要修改什么才能让它工作?

参考

相关文章摘录:

解决该泄漏的最简单方式是把通道从无缓冲改为容量为 1 的带缓冲通道。这样在超时场景下,接收方离开后,goroutine 仍能把 *User 值放入通道,然后返回。

Q51. 在导入了 encoding/json 之后,你将如何访问 Marshal 函数?

encoding/json#Marshal 示例

Q52. 为了用 context.Context 为这个发起 GET 请求的 HTTP 客户端实现 3 秒超时,缺失的两段代码是什么?

package main

import (
        "context"
        "fmt"
        "net/http"
)

func main() {
        var cancel context.CancelFunc
        ctx := context.Background()

        // #1: <=== 这里应当写什么?

        req, _ := http.NewRequest(http.MethodGet,
                "https://linkedin.com",
                nil)

        // #2: <=== 这里应当写什么?

        client := &http.Client{}
        res, err := client.Do(req)
        if err != nil {
                fmt.Println("Request failed:", err)
                return
        }
        fmt.Println("Response received, status code:",
                res.StatusCode)
}
      ctx.SetTimeout(3*time.Second)
      req.AttachContext(ctx)
      ctx, cancel = context.WithTimeout(ctx, 3*time.Second); defer cancel()
      req = req.WithContext(ctx)
      ctx, cancel = context.WithTimeout(ctx, 3*time.Second); defer cancel() #2: req.AttachContext(ctx)
      ctx.SetTimeout(3*time.Second)
      req = req.WithContext(ctx)
  1. context#WithTimeout
  2. net/http#Request.WithContext

Q53. 如果你在同一个 .go 文件中定义了名为 Client 的结构体,如何导出一个带有默认值的变量,使其可以被其他包访问?

Q54. 该程序输出 {Master Chief Spartan Protagonist Halo}。怎样让它输出 Master Chief - a Spartan - is the Protagonist of Halo

package main

import "fmt"

type Character struct{
        Name  string
        Class string
        Role  string
        Game  string
}

func main() {
        mc := Character{
                Name: "Master Chief",
                Class: "Spartan",
                Role: "Protagonist",
                Game: "Halo",
        }
        fmt.Println(mc)
}
  1. fmt#Stringer

Q55. 你会如何为 Clients 实现一个可用的 Append() 方法?

package main

type Client struct {
  Name string
}
type Clients struct {
  clients []*Client
}
func main() {
  c:= &Clients{clients.make([]*Client,0)}
  c.Append(&Client{Name: "LinkedIn API})
}

Q56. 你如何从被调用函数抛出的 panic() 中恢复,同时不让程序失败?假设你的答案将在发生 panic 的同一作用域内运行。

Q57. 这段代码会打印什么?

var n int
fmt.Println (n)

因为在 Go 中,当变量被声明但未显式初始化时,会被赋予基于其类型的默认零值。对于整数 n 来说,零值是 0。

Q58. 在创建格式化字符串时,如果希望调用自定义类型的 String() string 方法,应使用哪个动词?

在 Go 中,%s 用于格式化字符串。当用于定义了 String() 方法的自定义类型时,会自动调用 String(),其返回值将用于该格式化字符串。

Q59. 调用 time.Now().Format(layout) 时,下面哪个不是合法的 layout 值?

time#Time.Format

根据文档,值 1 和 01 代表当前月份。

each layout string is a representation of the time stamp,
	Jan 2 15:04:05 2006 MST
An easy way to remember this value is that it holds, when presented in this order, the values (lined up with the elements above):
	  1 2  3  4  5    6  -7

Q60. 你如何向 Go 编译器表明结构体 Namespace 必须实现接口 JSONConverter?假设答案写在声明 Namespace 的同一个包中。

该语法创建一个类型为 JSONConverter 的变量 _,并将 (*Namespace)(nil) 赋给它。这实质上检查了 Namespace 是否满足 JSONConverter 接口。

Q61. 关于类型与接口,下列哪一项是错误的?

在 Go 中,只要一个类型实现了接口的所有方法,它就自动满足该接口;无需显式声明“实现了某接口”。

Q62. 补全该程序以生成指定的输出,假设 SQL 表如下所示。

===[Output]================
1: &{GameId:1 Title:Wolfenstein YearReleased:1992}
2: &{GameId:2 Title:Doom YearReleased:1993}
3: &{GameId:3 Title:Quake YearReleased:1996}

===[main.go]================
package main

import (
        "database/sql"
        "fmt"
        _ "github.com/go-sql-driver/mysql"
        "log"
)

type Game struct {
        GameId       int
        Title        string
        YearReleased int
}

func main() {

        conn, err := sql.Open("mysql",
                "john_carmack:agiftw!@tcp(localhost:3306)/idsoftware")

        if err != nil {
                panic(err)
        }
        defer func() { _ = conn.Close() }()

        results, err := conn.Query("SELECT game_id,title,year_released FROM games;")
        if err != nil {
                panic(err)
        }
        defer func() { _ = results.Close() }()

        // #1 <=== What goes here?

        for results.Next() {
                var g Game

                // #2 <=== What goes here?

                if err != nil {
                        panic(err)
                }

                // #3 <=== What goes here?

        }

        for i, g := range games {
                fmt.Printf("%d: %+v\n", i, g)
        }

}
#1: games := make([]*Game, results.RowsAffected())
#2: g, err = results.Fetch()
#3: games[results.Index()] = &g
#1: games := []Game{}
#2: g, err = results.Fetch()
#3: games = append(games,g)
#1: games := map[int]Game{}
#2: err = results.Scan(&g)
#3: games[g.GameId] = g
#1: games := make(map[int]*Game, 0)
#2: err = results.Scan(&g.GameId, &g.Title, &g.YearReleased)
#3: games[g.GameId] = &g

Q63. 填空题

  1. Go 中的测试文件必须_
  2. 单个测试由_标识。
  3. 你可以通过__来运行子测试。
  4. 通过_可以记录错误并标记测试失败。

Q64. rune 是哪种类型的别名?

  1. Go 中的字符串、字节、rune 和字符

相关文章摘录:

Go 语言将 rune 定义为 int32 类型的别名,这样当整数值表示一个码点时,程序可以更清晰。

Q65. 何时可以使用 := 语法给多个变量赋值?例如:

x, err := myFunc()
  1. 简短变量声明

Q66. 你如何在浏览器中查看 cpu.pprof 的 profiler 输出?

Q67. 何时 interface{} 类型的变量会被判断为 nil

Q68. 如果一个字符串变量已分配但未赋值,它持有什么值?

若字符串变量已分配但未赋值,其默认值是空字符串 ""。在 Go 中,未初始化的字符串变量会被自动赋予其类型的零值。

Q69. 用于停止程序继续执行的内置函数是哪个?

内置函数 panic() 会触发 panic,停止正常执行流程并开始“恐慌”过程;若不被恢复,程序将终止。

Q70. 输出将是什么?

a,b := 1, 2
b,c:= 3, 4
fmt.Println(a, b, c)

Go Playground 示例

Q71. 逻辑与条件的运算符是?

Q72. 在 Go 中,什么是匿名函数?

Q73. 在 Go 中,用于声明匿名函数的关键字是?

Q74. 使用匿名函数的主要优势是什么?

Explanation: 它们可以在使用处内联定义,提供了更灵活的代码组织方式。

Q75. 在 Go 中,如何在声明匿名函数后立即调用它?

参考

Q76. Go 开发者可以为哪些类型定义方法?

方法可以为任何非内置的具名类型定义。通过 type 声明创建的新类型是具名类型,可以为其定义方法;但不能直接为内置类型(如 intstring 等)附加方法。参考