Go语言常见语法错误

2024-04-16 17:38
文章标签 语言 go 常见 语法错误

本文主要是介绍Go语言常见语法错误,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Go语言常见语法错误

转载自大神博客

目录
  • Go语言常见语法错误
  • 1、开大括号不能放在单独的一行
  • 2、未使用的变量
  • 3、未使用的Imports
  • 4、":="简式的变量声明仅可以在函数内部使用
  • 5、使用简式声明重复声明变量
  • 6、Go语言命名区分大小写
  • 7、Go语言中分号分行
  • 8、Go语言中无效的分号
  • 9、Go语言中注意变量作用域
  • 10、偶然的变量隐藏
  • 11、不使用显式类型,无法使用“nil”来初始化变量
  • 12、使用“nil” Slices and Maps
  • 13、Map的容量
  • 14、字符串不会为nil

1、开大括号不能放在单独的一行

错误代码:

package mainimport "fmt"func main() 
{ fmt.Println("hello world!")
}
12345678

编译错误:

./main.go:5:6: missing function body for "main"
./main.go:6:1: syntax error: unexpected semicolon or newline before {
12

正确代码:

package mainimport "fmt"func main() {fmt.Println("hello world!")
}
1234567

2、未使用的变量

如果你有未使用的局部变量,代码将编译失败。
如果你给未使用的变量分配了一个新的值,代码还是会编译失败。你需要在某个地方使用这个变量,才能让编译器愉快的编译。

错误代码:

package mainvar gvar intfunc main() {var one inttwo := 2var three intthree = 3
}
12345678910

编译错误:

./main.go:6:6: one declared and not used
./main.go:7:9: two declared and not used
./main.go:8:6: three declared and not used
123

正确代码:

package mainimport "fmt"func main() {var one int_ = onetwo := 2fmt.Println(two)var three intthree = 3one = threevar four intfour = four
}// 另外可以选择是注释掉或者移除未使用的变量
1234567891011121314151617

3、未使用的Imports

如果你引入一个包,而没有使用其中的任何函数、接口、结构体或者变量的话,代码将会编译失败。
如果你真的需要引入的包,你可以添加一个"_"下划线标记符,来作为这个包的名字,从而避免编译失败。下滑线标记符用于引入,但不使用。

错误代码:

package mainimport ("fmt""log""time"
)func main() {
}
```go编译错误:1234567891011121314

./main.go:4:2: imported and not used: “fmt”
./main.go:5:2: imported and not used: “log”
./main.go:6:2: imported and not used: “time”

正确代码:​```go
package mainimport (_ "fmt""log""time"
)var _ = log.Printlnfunc main() {_ = time.Now
}// 另外可以选择是移除或者注释掉未使用的imports
12345678910111213141516171819

4、":="简式的变量声明仅可以在函数内部使用

错误代码:

package mainmyvar := 1 func main() {  
}
123456

编译错误:

./main.go:3:1: syntax error: non-declaration statement outside function body
1

正确代码:

package mainvar myvar = 1func main() {
}
123456

5、使用简式声明重复声明变量

你不能在一个单独的声明中重复声明一个变量,但在多变量声明中这是允许的,其中至少要有一个新的声明变量。
重复变量需要在相同的代码块内,否则你将得到一个隐藏变量。

错误代码:

package mainfunc main() {one := 0one := 1
}
123456

编译错误:

./main.go:5:6: no new variables on left side of :=
1

正确代码:

package mainfunc main() {one := 0one, two := 1, 2one, two = two, one
}
1234567

6、Go语言命名区分大小写

错误代码:

package mainimport "fmt"func main() {fmt.println("Hello world")
}// 以下代码都是不正确的:
// Package main
// iMport "fmt"
// import "Fmt"
// Func main() {}
// Fmt.Println
// fmt.println
123456789101112131415

编译错误:

./main.go:6:2: cannot refer to unexported name fmt.println
./main.go:6:2: undefined: fmt.println
12

正确代码:

package mainimport "fmt"func main() {fmt.Println("Hello world")
}
1234567

7、Go语言中分号分行

错误代码:

package mainimport "fmt"func main() {fmt.Println("Hello world") fmt.Println("Hi again")
}
1234567

编译错误:

./main.go:6:29: syntax error: unexpected fmt at end of statement
1

正确代码:

package mainimport "fmt"func main() {fmt.Println("Hello world")//解决以上问题,可以将上述的两条语句放在两行fmt.Println("Hi again") //可以将两条语句用分号结束fmt.Println("Hello world");fmt.Println("Hi again") test()
}func test() { //因此在Go语言中,分号能省则省,如果必须使用时,添加上也不会出错。fmt.Println("Hello world");fmt.Println("Hi again");
};
12345678910111213141516171819

8、Go语言中无效的分号

错误代码:

package mainimport "fmt";;func main() {fmt.Println("Hello world")
}
1234567

编译错误:

./main.go:3:14: syntax error: non-declaration statement outside function body
1

正确代码:

package mainimport "fmt";func main() {fmt.Println("Hello world")
}
1234567

9、Go语言中注意变量作用域

错误代码:

package mainvar num intfunc main() {str := "hello world"if true {var b bool}println(num)println(str)println(b)
}
12345678910111213

编译错误:

./main.go:12:10: undefined: b
1

正确代码:

package mainvar num intfunc main() {str := "hello world"if true {var b boolprintln(b)}println(num)println(str)
}
12345678910111213

10、偶然的变量隐藏

短式变量声明的语法如此的方便(尤其对于那些使用过动态语言的开发者而言),很容易让人把它当成一个正常的分配操作。如果你在一个新的代码块中犯了这个错误,将不会出现编译错误,但你的应用将不会做你所期望的事情。

package mainimport "fmt"func main() {x := 1fmt.Println(x) // 1{fmt.Println(x) // 1x := 2fmt.Println(x) // 2}fmt.Println(x) // 1 
}
1234567891011121314

运行结果:

1
1
2
1
1234

即使对于经验丰富的Go开发者而言,这也是一个非常常见的陷阱,但又很难发现。

你可以使用 vet命令来发现一些这样的问题。 默认情况下, vet不会执行这样的检查,你需要设置-shadow参数:
命令:go tool vet -shadow your_file.go

go tool vet -shadow main.go
main.go:10: declaration of "x" shadows declaration at main.go:6
12

11、不使用显式类型,无法使用“nil”来初始化变量

nil标志符用于表示interface、函数、maps、slices和channels的“零值”。如果你不指定变量的类型,编译器将无法编译你的代码,因为它猜不出具体的类型。

错误代码:

package mainfunc main() {var x = nil_ = x
}
123456

编译错误:

./main.go:4:6: use of untyped nil
1

正确代码:

package mainfunc main() {var x interface{} = nil_ = x
}
123456

12、使用“nil” Slices and Maps

在一个nil的slice中添加元素是没问题的,但对一个map做同样的事将会生成一个运行时的panic。

正确代码:

package mainfunc main() {var s []ints = append(s, 1)
}
123456

错误代码:

package mainimport ("fmt"
)func main() {var m map[int]intm[1] = 1fmt.Println(m)
}
1234567891011

运行错误:

panic: assignment to entry in nil map
1

正确代码:

package mainimport ("fmt"
)func main() {var m map[int]intm = make(map[int]int)m[1] = 1fmt.Println(m)
}
123456789101112

13、Map的容量

map 只有 len操作, 没有 cap 操作

错误代码:

package mainimport ("fmt"
)func main() {m := map[int]string{1: "a", 2: "b", 3: "c"}cap := cap(m)fmt.Println(cap)
}
1234567891011

编译错误:

./main.go:9:12: invalid argument m (type map[int]string) for cap
1

正确代码:

package mainimport ("fmt"
)func main() {m := map[int]string{1: "a", 2: "b", 3: "c"}len := len(m)fmt.Println(len)
}
1234567891011

14、字符串不会为nil

这对于经常使用nil分配字符串变量的开发者而言是个需要注意的地方。

package mainfunc main() {var x string = nilif x == nil {x = "default"}
}
12345678

编译错误:

./main.go:4:6: cannot use nil as type string in assignment
./main.go:5:7: invalid operation: x == nil (mismatched types string and nil)
12

正确代码:

package mainfunc main() {var x stringif x == "" {x = "default"}
}
12345678

这篇关于Go语言常见语法错误的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/909458

相关文章

R语言中的正则表达式深度解析

《R语言中的正则表达式深度解析》正则表达式即使用一个字符串来描述、匹配一系列某个语法规则的字符串,通过特定的字母、数字及特殊符号的灵活组合即可完成对任意字符串的匹配,:本文主要介绍R语言中正则表达... 目录前言一、正则表达式的基本概念二、正则表达式的特殊符号三、R语言中正则表达式的应用实例实例一:查找匹配

Go语言结构体标签(Tag)的使用小结

《Go语言结构体标签(Tag)的使用小结》结构体标签Tag是Go语言中附加在结构体字段后的元数据字符串,用于提供额外的属性信息,这些信息可以通过反射在运行时读取和解析,下面就来详细的介绍一下Tag的使... 目录什么是结构体标签?基本语法常见的标签用途1.jsON 序列化/反序列化(最常用)2.数据库操作(

Java中的CompletableFuture核心用法和常见场景

《Java中的CompletableFuture核心用法和常见场景》CompletableFuture是Java8引入的强大的异步编程工具,支持链式异步编程、组合、异常处理和回调,介绍其核心用法,通过... 目录1、引言2. 基本概念3. 创建 CompletableFuture3.1. 手动创建3.2.

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

SpringBoot项目整合Netty启动失败的常见错误总结

《SpringBoot项目整合Netty启动失败的常见错误总结》本文总结了SpringBoot集成Netty时常见的8类问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、端口冲突问题1. Tomcat与Netty端口冲突二、主线程被阻塞问题1. Netty启动阻

C语言逗号运算符和逗号表达式的使用小结

《C语言逗号运算符和逗号表达式的使用小结》本文详细介绍了C语言中的逗号运算符和逗号表达式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 在C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把两个表达式连接其一般形式为:表达

Go语言实现桥接模式

《Go语言实现桥接模式》桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化,本文就来介绍一下了Go语言实现桥接模式,感兴趣的可以了解一下... 目录简介核心概念为什么使用桥接模式?应用场景案例分析步骤一:定义实现接口步骤二:创建具体实现类步骤三:定义抽象类步骤四:创建扩展抽象类步

GO语言实现串口简单通讯

《GO语言实现串口简单通讯》本文分享了使用Go语言进行串口通讯的实践过程,详细介绍了串口配置、数据发送与接收的代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录背景串口通讯代码代码块分解解析完整代码运行结果背景最近再学习 go 语言,在某宝用5块钱买了个

SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)

《SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)》本文总结了SpringBoot项目整合Kafka启动失败的常见错误,包括Kafka服务器连接问题、序列化配置错误、依赖配置问题、... 目录一、Kafka服务器连接问题1. Kafka服务器无法连接2. 开发环境与生产环境网络不通二、序