一、本堂课重点内容:
课前导学
【Go 语言原理与实践学习资料】第三届字节跳动青训营-后端专场 - 掘金
实战课程代码
课程PPT
学习资料
本节课程主要分为三个方面:
- Go 语言简介
- Go 语言开发入门
- Go 实战
二、详细知识点介绍及例子:
1 变量
声明变量的一般形式是使用 var 关键字:
var identifier type
可以一次声明多个变量:
var identifier1, identifier2 type
identifier1, identifier2 = v1, v2, v3
var vname1, vname2, vname3 = v1, v2, v3
vname1, vname2, vname3 := v1, v2, v3
如果没有初始化
-
数值类型(包括complex64/128)为 0
-
布尔类型为 false
-
字符串为 "" (空字符串)
-
以下其他类型为 nil:
var a *int var a []int var a map[string] int var a chan int var a func(string) int var a error // error 是接口
第二种,根据值自行判定变量类型。
var v_name = value
第三种,使用:=
v_name := value
常量的定义格式:
const identifier [type] = value
你可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。
- 显式类型定义:
const b string = "abc" - 隐式类型定义:
const b = "abc
2 if else
if后面没有括号
if i==0 {
}
1.1.3 for
for后面没有括号
for{}//代表死循环
// a traditional "while" loop
for condition {
// ...
}
没有while
for循环的另一种形式, 在某种数据类型的区间(range)上遍历,如字符串或切片。
for _, arg := range os.Args[1:] {
s += sep + arg
sep = " "
}
1.1.4 switch
switch a {
case1:
...
default:
...
}
1.5 数组
语法格式如下:
var variable_name [SIZE] variable_type
var a[5]int
var v = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
命令行参数:输出所有的命令行参数
func main() {
fmt.Println(strings.Join(os.Args[1:], " "))
}
长度不确定,用 ...
var v = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
// 指定下标来初始化: 将索引为 1 和 3 的元素初始化
balance := [5]float32{1:2.0,3:7.0}
1.1.6 切片(可变长度数组)
定义
1.用未指定大小的数组来定义切片:
var identifier []type
2.使用 make() 函数来创建切片:
var slice1 []type = make([]type, len)
slice1 := make([]type, len)
3.也可以指定容量,capacity可选
make([]T, length, capacity)
初始化
s :=[] int {1,2,3 }
s := arr[startIndex:endIndex]
s := arr[:]
s1 := s[startIndex:endIndex]
==len() 和 cap() ==
len(s)
cap(s)
切片在未初始化之前默认为 nil,长度为 0
切片截取
截取切片 [lower-bound:upper-bound]
numbers[1:4]
append() 和 copy()
/* 向切片添加一个元素 */
numbers = append(numbers, 1)
/* 同时添加多个元素 */
numbers = append(numbers, 2,3,4)
/* 拷贝 numbers 的内容到 numbers1 */
copy(numbers1,numbers)
1.1.7 map
map_variable := make(map[key_data_type]value_data_type)
m := make(map[string]int)
m["one"]=1
delete() 函数用于删除集合的元素
delete(aMap, "key")
1.1.8 range
range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素
for key, value := range oldMap {
newMap[key] = value
}
如果只想读取 key:
for key := range oldMap
或者这样:
for key, _ := range oldMap
如果只想读取 value:
for _, value := range oldMap
1.1.9 函数
Go 语言函数定义格式如下:
func function_name( [parameter list] ) [return_types] {
函数体
}
func add(a int,b int)int{
}
Go 函数可以返回多个值:
func swap(x, y string) (string, string) {
return y, x
}
Go 语言可以作为另外一个函数的实参:
package main
import (
"fmt"
)
func main(){
/* 函数变量 */
getSelf := func(x int) int {
return x
}
fmt.Println(getSelf(9))
}
给定类型的方法:
func (variable_name variable_data_type) function_name() [return_type]{
/* 函数体*/
}
eg:
//该 method 属于 Circle 类型对象中的方法
func (c Circle) getArea() float64 {
//c.radius 即为 Circle 类型对象中的属性
return 3.14 * c.radius * c.radius
}
1.1.10 指针
*&
整型指针数组:
var ptr [MAX]*int;
1.1.11 结构体
结构体的格式如下:
type struct_variable_type struct {
member definition
member definition
...
member definition
}
type user struct{
name string
password string
}
1.1.12 错误处理
error类型是一个接口类型,这是它的定义:
type error interface {
Error() string
}
函数通常在最后的返回值使用errors.New 可返回错误信息
func add(a int,b int)(int a,err error){
return 0,errors New("not found")
}
...
result, err:= add(1,2)
if err != nil {
fmt.Println(err)
}
1.1.13 字符串操作
Strings包中函数
fmt包中字符串格式化类型
%v:值的默认格式,变量的自然形式(natural format);
%+v:当打印结构体时,输出结构体成员名与值;
%#v:当打印结构体时,输出结构体类型名、成员名与值
%T:打印类型(相应值的类型);
%%:打印百分号;
%p:打印指针的地址(以0x开始)
1.1.14 JSON操作
要保证结构体公开字段首字母大写。
Go json包
Marshal():Go数据对象 -> json数据
UnMarshal():Json数据 -> Go数据对象
func Marshal(v interface{}) ([]byte, error)
func Unmarshal(data []byte, v interface{}) error
package main
import (
"encoding/json"
"fmt"
)
type Post struct {
Id int
Content string
Author string
}
func main() {
post := &Post{1, "Hello World", "userA"}
b, err := json.Marshal(post)
if err != nil {
fmt.Println(nil)
}
fmt.Println(string(b))
}
输出
{"Id":1,"Content":"Hello World","Author":"userA"}
1.1.15 时间处理
time包中函数
具体参考c.biancheng.net/view/5392.h…
now := time.Now()
1.1.16 数字解析
stronv包
具体参考c.biancheng.net/view/5112.h…
stronv.ParseFloat(.., ..)
1.1.17 进程信息
”os" "os/exec"包
os.Args;
1.18 其他
输入输出
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
input := bufio.NewScanner(os.Stdin)
var result string
if input.Scan(){
result = input.Text()
}
fmt.Println(result)
}
行分隔符
在 Go 程序中,一行代表一个语句结束
字符串连接
Go 语言的字符串可以通过 + 实现
格式化字符串
package main
import (
"fmt"
)
func main() {
var stockcode=123
var enddate="2020-12-31"
var url="Code=%d&endDate=%s"//格式,作为一个参数输入
var target_url=fmt.Sprintf(url,stockcode,enddate)
fmt.Println(target_url)
}
类型转换
type_name(expression)
接口
把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。
/* 定义接口 */
type interface_name interface {
method_name1 [return_type]
method_name2 [return_type]
method_name3 [return_type]
...
method_namen [return_type]
}
/* 定义结构体 */
type struct_name struct {
/* variables */
}
/* 实现接口方法 */
func (struct_name_variable struct_name) method_name1() [return_type] {
/* 方法实现 */
}
...
func (struct_name_variable struct_name) method_namen() [return_type] {
/* 方法实现*/
}
/* 那么 */
func main(){
var i interface_name;
i = new (struct_name);
i.method_name1();
}