Go 使用过程中的错误

切片和结构体的声明

  • 切片的扩容,只有使用 append 的时候管用

  • 指针如果没有声明指向哪里,那么就是 nil

  • 结构体使用 type M struct , 匿名结构体使用var M struct { } 来声明

  • 报错infinite recursive call 无限递归调用

  • map 不需要使用数组类型的申明,见下面代码段1 ,结构题数组的声明使用 下面代码段 2

## map代码 1
func main() {
	m := map[string]int{
		"小刘": 12,
		"小王": 15,
	}
	for k, v := range m {
		fmt.Println(k, v)
	}
}
## 结构体代码 2
  stus := []student{
        {name: "pprof.cn", age: 18},
        {name: "测试", age: 23},
        {name: "博客", age: 28},
    }

go的 ...用法

Go 语言里的 ... 是有两种用法,一个是在字符串前边,一个是在字符串后边。

  • 在前边表示参数不确定
  • 在后边表示将切片打碎了传进去
func test1(args ...string) { //可以接受任意个string参数
    for _, v:= range args{
        fmt.Println(v)
    }
}

func main(){
var strss= []string{
        "qwr",
        "234",
        "yui",
        "cvbc",
    }
    test1(strss...) //切片被打散传入
}

结构体

结构体的声明是要使用键值对

func newAGraph(n int) *AGraph {
	adjList := make([]VNode, n)
	return &AGraph{
		n:       n,       // 结构体是使用键值对的方式来声明的
		e:       0,       //边数为0
		adjList: adjList, // 链表
	}
}

匿名结构体的声明,是在方法内部声明,直接把 type 更改成 var

func main() {
    var user struct{Name string; Age int}
    user.Name = "pprof.cn"
    user.Age = 18
    fmt.Printf("%#v\n", user)
}

当结构体内的东西需要修改的时候,或者结构体内的东西比较大的时候,使用指针类型的结构体

结构体使用 new 声明。

类型转换

显示类型转换

这种类型转换主要在切换同一基础类型不同精度范围时使用,比如我们要将 int 型转为 int64 类型时。类型被转换后是否会损失精度的问题,如果损失了精度是否会影响接下来的业务流程。

	a := 1.52
	b:=int(a)

断言

断言,顾名思义就是果断的去猜测一个未知的事物。其断言操作就是用来判断 interface{} 的类型。

	var f interface{} = 25
	c := f.(int)

string 和int 类型的转换

  1. 将字符串解析为 int 类型,使用 atoi, 这个有可能解析错误
  2. 将 int 类型转换成字符串,需要使用 itoa,这个不会报错
	if a, err := strconv.Atoi("1"); err != nil {
		fmt.Println(err)
	} else {
		fmt.Print(a)
	}
	b:=strconv.Itoa(1)
	fmt.Print(b)
// 输出结果
1  1

从数组中删掉一个值

func deletIndex(a []int, i int) []int {
	a = append(a[0:i], a[i+1:]...)
	return a
}

稍微复杂点的 for 循环

	for i, j := 0, 0; i < 20 && j < 20; i, j = i+1, j+1 {

	}

ACM下的标准输入

func main() {
	// 标准输入
	scanner := bufio.NewScanner(os.Stdin) //一次读一行
	for scanner.Scan() {
		text := scanner.Text() //text文本
		if len(text) == 0 {
			break
		}
		fields := strings.Fields(text) //切片
		sum := 0
		for _, field := range fields {
			num, _ := strconv.Atoi(field)
			sum += num
		}
		fmt.Println(sum)
	}
	fmt.Println("结束了")
}

标准输入

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	for scanner.Scan() {
		strs := strings.Split(scanner.Text(), " ")
		sort.Strings(strs)
		fmt.Println(strings.Join(strs, " "))
	}
}

看清楚到底是用什么分割的

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	for scanner.Scan() {
		strs := strings.Split(scanner.Text(), ",") //注意是用什么划分的
		sort.Strings(strs)
		fmt.Println(strings.Join(strs, ","))
	}
}

排序

输出递增的数组来

  sort.Slice(a, func(i, j int) bool { return a[i] < a[j] })` //输出递增的数组来

参考文献

https://zhuanlan.zhihu.com/p/30453711

posted @ 2021-07-13 19:40  沧海一声笑rush  阅读(50)  评论(0编辑  收藏  举报