go语言细节汇总

本文深入探讨了Go语言的多个核心特性,包括字符串处理、switch语句的特殊用法、函数变参数规则、错误处理机制、通道的同步异步使用、反射机制及包管理等关键概念。同时介绍了Go语言中的一些常见陷阱和最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、原始字符串

func main() {
	s := `功能介绍:
	1、可以拍照
	2、可以打电话`
	fmt.Println(s)
}

2、字符串不能用序号取元素指针

func main() {
	s := "abc"
	fmt.Println(&s[1]) //error 636: cannot take the address of s[1]
}

3、range迭代取出的地址是相同的

4、fallthrough进入下一个case,退出case无需break

func main() {
	a := 10
	switch a {
	case 10:
		fmt.Println("hhh")
		fallthrough
	case 11:
		fmt.Println("ggg")
	default:
		fmt.Println("fff")
	}
}

5、函数变参只能由一个,且只能是最后一个

6、recover在延时调用defer内有效,其他返回nil

package main

import (
	"fmt"
	"log"
	"runtime/debug"
)

func test(f func() int) {
	defer func() {
		if err := recover(); err != nil {
			debug.PrintStack()
			log.Println(err)
		}
	}()
	fmt.Println(f())
}

func main() {
	a := 0
	fmt.Println(recover())

	test(func() int {
		return 10 / a
	})

}

7、channel同步异步

package main

import (
	"fmt"
	"sync"
)

func main() {
	ch := make(chan int) //缓冲区同步
	var wg sync.WaitGroup
	go func() {
		wg.Add(1)
		defer wg.Done()
		for c := range ch {
			fmt.Println(c)
		}
		fmt.Println("recv over")
	}()

	ch <- 1
	ch <- 2
	ch <- 3
	ch <- 4
	ch <- 5
	fmt.Println("send over")
	close(ch)
	wg.Wait()
}

8、uintptr被GC当做普通整数对象,不会回收指向的对象占用内存

9、reflect

10、go package

package is folder 包就是文件夹

package name is folder name 包名就是文件夹名字

package path is folder path 包路径就是文件夹路径

否则会出错

11、append、map、len、println都不是关键字,无需包含任何包, 因为它在builtin包里

12、临时转换一个含调用方法的接口

package main

import (
	"fmt"
)

type person struct {
}

func (p *person) print() {
	fmt.Println("person")
}

func main() {
	//var p1 interface{print()} = new(person)
	//p1.print()
	var p interface{} = new(person)
	p.(interface {
		print()
	}).print()
}

13、map其实就是泛型的概念,只是go不开放给用户,map的对象可以是任意类型包括结构体。map初始化格式要求严格。

m := map[int]string{
		2: "jack",
		3: "marry"}
m := map[int]string{
		2: "jack",
		3: "marry", //没有逗号编译不过
	}
14、




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值