这是我参与「第五届青训营」笔记创作活动的第1天
第一次参加青训营,希望通过这次的学习能够快速上手一门新的语言,当然之前也有过Java、Python的开发,目前感觉还行
为什么学习go
当然一个最简单的原因就是提高竞争力,然后就是go语言优秀的性能和天生语言层面的高并发
语法简单、跨平台、优秀的垃圾回收机制、高性能高并发、快速编译
环境准备
HelloWorld
嘿嘿,学习任何语言都要从HelloWorld开始哦
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
基础语法
怎么说呢,语法很简单,都是大同小异的,甚至go好像更简单一点
变量
字母或下划线开头,由字母、数字、下划线组成
go语言里面的常量没有确定的类型,会根据上下文自动确定类型
package main
//var a = "Hello"
//var b string = "World"
//var c bool
var (
name1 type1
name2 type2
)
func main(){
//println(a, b, c)
const LENGTH int = 10
const WIDTH int = 5
var area int
const a, b, c = 1, false, "str" //多重赋值
area = LENGTH * WIDTH
fmt.Printf("面积为 : %d", area)
println()
println(a, b, c)
}
if-else
if-else写法上和C、C++类似,使用上有一些不同
比如,左边的括号不能另外占一行,必须紧接在后面,还有就是条件不需要另外加括号和if隔开,编译时也会自动去掉
package main
import (
"fmt"
)
func main() {
if num := 10; num % 2 == 0 {
fmt.Println(num,"is even")
} else {
fmt.Println(num,"is odd")
}
}
for
go语言中没有while、do while,只有一个for for后面什么都不写,就是一个死循环,其他和C、C++一样,break和continue控制
package main
import "fmt"
func main() {
var b int = 15
var a int
numbers := [6]int{1, 2, 3, 5}
for a := 0; a < 10; a++ {
fmt.Printf("a 的值为: %d\n", a)
}
for a < b {
a++
fmt.Printf("a 的值为: %d\n", a)
}
for i,x:= range numbers {
fmt.Printf("第 %d 位 x 的值 = %d\n", i,x)
}
}
switch
和C、C++最大的不同就是不用在case后面显示的写上break
go执行一次就不会继续往下执行跳出整个Switch,如果要再向下执行需要fallthrough
switch不写任何变量,直接在case中写条件分支,这就是一个更强大的if-else
package main
import (
"fmt"
)
func main() {
num := 75
switch {
case num >= 0 && num <= 50:
fmt.Println("num is greater than 0 and less than 50")
case num >= 51 && num <= 100:
fmt.Println("num is greater than 51 and less than 100")
case num >= 101:
fmt.Println("num is greater than 100")
}
}
数组、切片、Map
数组是一个长度固定的元素序列,因为长度固定,很少直接使用
package main
import "fmt"
func main() {
var n [10]int /* n 是一个长度为 10 的数组 */
var i,j int
/* 为数组 n 初始化元素 */
for i = 0; i < 10; i++ {
n[i] = i
}
/* 输出每个数组元素的值 */
for j = 0; j < 10; j++ {
fmt.Printf("Element[%d] = %d\n", j, n[j] )
}
}
切片底层还是数组,但提供更丰富的操作,可以任意更改长度,自动扩容
package main
import "fmt"
func main() {
var numbers []int
printSlice(numbers)
/* 允许追加空切片 */
numbers = append(numbers, 0)
printSlice(numbers)
/* 同时添加多个元素 */
numbers = append(numbers, 2,3,4)
printSlice(numbers)
/* 创建切片 numbers1 是之前切片的两倍容量*/
numbers1 := make([]int, len(numbers), (cap(numbers))*2)
/* 拷贝 numbers 的内容到 numbers1 */
copy(numbers1,numbers)
printSlice(numbers1)
}
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
Map习惯叫做哈希或者字典,Map中是完全无序的,遍历时不会按照插入时的顺序返回
package main
import "fmt"
func main() {
/* 创建 map */
countryCapitalMap := map[string] string {"France":"Paris","Italy":"Rome","Japan":"Tokyo","India":"New Delhi"}
fmt.Println("原始 map")
/* 打印 map */
for country := range countryCapitalMap {
fmt.Println("Capital of",country,"is",countryCapitalMap[country])
}
/* 删除元素 */
delete(countryCapitalMap,"France");
fmt.Println("Entry for France is deleted")
fmt.Println("删除元素后 map")
/* 打印 map */
for country := range countryCapitalMap {
fmt.Println("Capital of",country,"is",countryCapitalMap[country])
}
}
函数
package main
import "fmt"
func main() {
var a int = 100
var b int = 200
var ret int
/* 调用函数并返回最大值 */
ret = max(a, b)
fmt.Printf( "最大值是 : %d\n", ret )
}
func max(num1, num2 int) int {
if (num1 > num2) {
return num1
}
return num2
}
指针
相较于C、C++,go语言指针支持的操作比较有限,不能直接在指针上运算
package main
import (
"fmt"
)
func change(val *int) {
*val = 55
}
func main() {
a := 58
fmt.Println("before is",a)
b := &a
change(b)
fmt.Println("after is", a)
}
结构体
也就是带类型的字段集合
package main
import "fmt"
type Books struct {
title string
author string
subject string
book_id int
}
func main() {
var Book1 Books
/* book1 描述 */
Book1.title = "Go语言"
Book1.author = "www.baidu.com"
Book1.subject = "Go 语言教程"
Book1.book_id = 12345
fmt.Printf( "Book 1 title : %s\n", Book1.title)
fmt.Printf( "Book 1 author : %s\n", Book1.author)
fmt.Printf( "Book 1 subject : %s\n", Book1.subject)
fmt.Printf( "Book 1 book_id : %d\n", Book1.book_id)
}
错误处理
go语言的错误处理不像Java的异常那样,习惯上函数返回都带上一个error,通过简单的if-else来处理错误
package main
import (
"fmt"
"os"
)
func main() {
f, err := os.Open("/test.txt")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(f.Name(), "opened successfully")
}