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 类型的转换
- 将字符串解析为 int 类型,使用
atoi
, 这个有可能解析错误 - 将 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] })` //输出递增的数组来