4.switch 中如何强制执行下一个 case 代码块switch 语句中的 case 代码块会默认带上 break,但可以使用 fallthrough 来强制执行下一个 case 代码块 。
func main() { isSpace := func(char byte) bool {switch char {case ' ': // 空格符会直接 break,返回 false // 和其他语言不一样// fallthrough // 返回 truecase '\t':return true}return false } fmt.Println(isSpace('\t')) // true fmt.Println(isSpace(' ')) // false}
5.你是如何关闭 HTTP 的响应体的【go基础语法50问,来看看你的go基础合格了吗?】直接在处理 HTTP 响应错误的代码块中,直接关闭非 nil 的响应体;手动调用 defer 来关闭响应体 。
// 正确示例func main() { resp, err := http.Get("http://www.baidu.com")// 关闭 resp.Body 的正确姿势if resp != nil {defer resp.Body.Close() } checkError(err) defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) checkError(err) fmt.Println(string(body))}
6.你是否主动关闭过http连接,为啥要这样做有关闭,不关闭会程序可能会消耗完 socket 描述符 。有如下2种关闭方式:
- 直接设置请求变量的 Close 字段值为 true,每次请求结束后就会主动关闭连接 。设置 Header 请求头部选项 Connection: close,然后服务器返回的响应头部也会有这个选项,此时 HTTP 标准库会主动断开连接
// 主动关闭连接func main() { req, err := http.NewRequest("GET", "http://golang.org", nil) checkError(err) req.Close = true //req.Header.Add("Connection", "close") // 等效的关闭方式 resp, err := http.DefaultClient.Do(req) if resp != nil {defer resp.Body.Close() } checkError(err) body, err := ioutil.ReadAll(resp.Body) checkError(err) fmt.Println(string(body))}
- 你可以创建一个自定义配置的 HTTP transport 客户端,用来取消 HTTP 全局的复用连接 。
func main() { tr := http.Transport{DisableKeepAlives: true} client := http.Client{Transport: &tr} resp, err := client.Get("https://golang.google.cn/") if resp != nil {defer resp.Body.Close() } checkError(err) fmt.Println(resp.StatusCode) // 200 body, err := ioutil.ReadAll(resp.Body) checkError(err) fmt.Println(len(string(body)))}
7.解析 JSON 数据时,默认将数值当做哪种类型在 encode/decode JSON 数据时,Go 默认会将数值当做 float64 处理 。func main() {var data = https://www.huyubaike.com/biancheng/[]byte(`{"status": 200}`)var result map[string]interface{}if err := json.Unmarshal(data, &result); err != nil {log.Fatalln(err)}
解析出来的 200 是 float 类型 。8.如何从 panic 中恢复在一个 defer 延迟执行的函数中调用 recover ,它便能捕捉/中断 panic 。
// 错误的 recover 调用示例func main() { recover() // 什么都不会捕捉 panic("not good") // 发生 panic,主程序退出 recover() // 不会被执行 println("ok")}// 正确的 recover 调用示例func main() { defer func() {fmt.Println("recovered: ", recover()) }() panic("not good")}
9.简短声明的变量需要注意啥- 简短声明的变量只能在函数内部使用
- struct 的变量字段不能使用 := 来赋值
- 不能用简短声明方式来单独为一个变量重复声明, := 左侧至少有一个新变量,才允许多变量的重复声明
11.recover的执行时机无,recover 必须在 defer 函数中运行 。recover 捕获的是祖父级调用时的异常,直接调用时无效 。
func main() {recover()panic(1)}
直接 defer 调用也是无效 。func main() {defer recover()panic(1)}
defer 调用时多层嵌套依然无效 。
经验总结扩展阅读
- 早晨问好的励志优美句子 早安最短精句早上好
- 惠普星13air缺点_惠普星13air有哪些问题
- C# 8.0 添加和增强的功能【基础篇】
- 下午最美祝福语 最新下午好问候语温馨短句
- 下午问候语温馨一句话 愉快的下午说说心情
- 下午发朋友圈的说说心情 下午好温馨问候语
- 适合下午发的心情说说 高情商下午好问候
- 下午好问候语简短句子 下午心情短句
- 下午好简短祝福语 高情商下午好问候简短句子
- 下午的问候语温馨的话 下午好正能量短句