// 四种变量的声明方式
package main
import "fmt"
// 方法123可用于全局变量
var gA int = 100
var gB = 200
// 方法4不可用于全局变量
// gC := 300 // 错误:无法在函数外使用 := 声明变量
func main() {
// 1. 声明一个变量,不赋值
var a int // 声明一个整数变量a,默认为0
fmt.Println("a:", a)
fmt.Printf("Type of a is %T\n", a)
// 2. 声明一个变量,赋值
var b int = 10
fmt.Println("b:", b)
fmt.Printf("Type of b is %T\n", b)
// 3. 声明一个变量,类型由编译器推断
var c = 100
fmt.Println("c:", c)
fmt.Printf("Type of c is %T\n", c)
// 4.省略 var 关键字,使用 := 声明并赋值 (最常用)
d := 1000
fmt.Println("d:", d)
fmt.Printf("Type of d is %T\n", d)
i := 3.14
fmt.Println("i:", i)
fmt.Printf("Type of i is %T\n", i)
J := "Hello"
fmt.Println("J:", J)
fmt.Printf("Type of J is %T\n", J)
// 全局变量输出
fmt.Println("gA:", gA, ", gB:", gB)
// 声明多个变量
var e, f int = 1, 2
fmt.Println("e:", e, ", f:", f)
var g, h = 110, "World"
fmt.Println("g:", g, ", h:", h)
// 多行多变量声明
var (
x int = 42
y string = "Go"
z bool = true
)
fmt.Println("x:", x, ", y:", y, ", z:", z)
}
3. const与iota知识点注意事项
package main
import (
"fmt"
)
const (
BEIJING = 10 * iota// iota 是一个特殊的常量生成器,在 const 块中使用时会自动递增,只能在const中使用
SHANGHAI
GUANGZHOU
SHENZHEN
)
const (
a, b = iota + 1, iota + 2
c, d
e, f
g, h = iota * 2, iota * 3
i, j
)
func main() {
// 常量(只读属性)
const pi = 3.14
fmt.Println("The value of pi is:", pi)
fmt.Println("BEIJING:", BEIJING)
fmt.Println("SHANGHAI:", SHANGHAI)
fmt.Println("GUANGZHOU:", GUANGZHOU)
fmt.Println("SHENZHEN:", SHENZHEN)
fmt.Println("a:", a, ", b:", b)
fmt.Println("c:", c, ", d:", d)
fmt.Println("e:", e, ", f:", f)
fmt.Println("g:", g, ", h:", h)
fmt.Println("i:", i, ", j:", j)
}
4. Go中函数的多返回职三种写法
package main
import (
"fmt"
)
func fool(a string, b int) int {
fmt.Println("a = ", a)
fmt.Println("b = ", b)
c := 100
return c
}
// 返回多个返回值,匿名
func foo2(a string, b int) (int, int) {
fmt.Printf("---foo2---")
fmt.Println("a = ", a)
fmt.Println("b = ", b)
return 100, 200
}
// 返回多个返回值,有形参名称
func foo3(a string, b int) (r1 int, r2 int) {
fmt.Printf("---foo3---")
fmt.Println("a = ", a)
fmt.Println("b = ", b)
r1 = 100
r2 = 200
return
}
func foo4(a string, b int) (r1 ,r2 int) {
fmt.Printf("---foo4---\n")
fmt.Println("a = ", a)
fmt.Println("b = ", b)
r1 = 100
r2 = 200
return
}
func main() {
d := fool("abc", 555)
fmt.Println("d = ", d)
e, f := foo2("def", 666)
fmt.Println("e = ", e)
fmt.Println("f = ", f)
ret1 , ret2 := foo3("foo3", 325)
fmt.Println("ret1 = ", ret1)
fmt.Println("ret2 = ", ret2)
ret1, ret2 = foo4("foo4", 325)
fmt.Println("ret1 = ", ret1)
fmt.Println("ret2 = ", ret2)
}
5. Import导包路径问题与init方法
Import的实际导包路径
项目总体文件目录
(base) PS D:\goproject\src\gostudy> tree
卷 Data 的文件夹 PATH 列表
卷序列号为 DEAF-7D9D
D:.
├─1-firstG
├─2-var
├─3-const_iota
├─4-function
└─5-init
├─lib1
└─lib2
package main
import (
"fmt"
)
func swap(px *int, py *int) {
var temp int
temp = *px // temp保存px指针指向的值
*px = *py // 将py指针指向的值赋给px指针指向的值
*py = temp // 将temp的值赋给py指针指向的值
}
func main() {
var a int = 10
var b int = 20
swap(&a, &b)
fmt.Println("a = ", a, "b = ", b)
// 二级指针
var p *int
p = &a
fmt.Println(&a)
fmt.Println(p)
var pp **int
pp = &p
fmt.Println(&p)
fmt.Println(pp)
}
8. defer语句调用顺序
defer语句执行遵循栈方式
package main
import (
"fmt"
)
func deferFunc() int {
fmt.Println("deferFunc() ...")
return 0
}
func returnFunc() int {
fmt.Println("returnFunc() ...")
return 0
}
func returnAndDefer() int {
defer deferFunc() // defer语句会将deferFunc函数压栈,等到returnAndDefer函数执行完毕后再执行deferFunc函数
return returnFunc() // return语句会先执行returnFunc函数,然后再执行deferFunc函数,最后将returnFunc函数的返回值返回给调用者
}
func main() {
defer fmt.Println("main end1")
defer fmt.Println("main end2") // 遵循先进后出原则,压栈
fmt.Println("main::hello go 1")
fmt.Println("main::hello go 2")
returnAndDefer();
}
Output:
(base) PS D:\goproject\src\gostudy\7-defer> go run defer.go
main::hello go 1
main::hello go 2
returnFunc() ...
deferFunc() ...
main end2
main end1
9. Go中数组和动态数组区别
数组和slice
数组
package main
import "fmt"
func main() {
var myArray1 [10]int
myArray2 := [10]int{1, 2, 3, 4}
for i := 0; i < len(myArray1); i++ {
fmt.Println(myArray1[i])
}
for index, value := range myArray2 {
fmt.Println("index = ", index, ", value = ", value)
}
testslice()
}
动态数组slice
package main
import "fmt"
func printArray(arr []int) {
for _, value := range arr{
fmt.Println("value = ", value)
}
arr[0] = 100 // 修改切片中的元素,切片是引用类型,修改切片中的元素会影响到原数组中的元素
}
func testslice() {
myArray := []int{1, 2, 3, 4}
fmt.Printf("myArray type is %T\n", myArray)
printArray(myArray)
fmt.Println(" ==== ")
for _, value := range myArray {
fmt.Println("value = ", value)
}
}
package main
import "fmt"
type myint int
type Book struct {
title string
auth string
}
func changeBook(book Book) {
// 传递一个book的副本
book.auth = "666"
}
func changeBook2(book *Book) {
book.auth = "777"
}
func main() {
// var a myint = 10
// fmt.Println("a = ", a)
// fmt.Printf("type of a = %T\n", a)
var book1 Book
book1.title = "Golang"
book1.auth = "zhang3"
fmt.Printf("%v\n", book1)
changeBook(book1)
fmt.Printf("%v\n", book1)
changeBook2(&book1)
fmt.Printf("%v\n", book1)
}
Output:
(base) PS D:\goproject\src\gostudy\10-OOP> go run .
{Golang zhang3}
{Golang zhang3}
{Golang 777
15. Go面对对象类的表示与封装
Go面对对象类的封装
package main
import "fmt"
type Hero struct {
Name string
Ad int
Level int
}
func (this *Hero) Show() {
fmt.Println("Name = ", this.Name)
fmt.Println("Ad = ", this.Ad)
fmt.Println("Level = ", this.Level)
}
func (this *Hero) GetName() string{
return this.Name
}
func (this *Hero) SetName(newName string) {
this.Name = newName
}
func main() {
hero := Hero{Name : "zhang3", Ad : 100, Level:1}
hero.SetName("li4")
hero.Show()
}
Output:
(base) PS D:\goproject\src\gostudy> go run .
Name = li4
Ad = 100
Level = 1
16. Go面对对象继承
Go面对对象类的继承
package main
import "fmt"
type Human struct {
name string
sex string
}
func (this *Human) Eat() {
fmt.Println("Human.Eat()...")
}
func (this *Human) Walk() {
fmt.Println("Human.Walk()...")
}
type SuperMan struct {
Human
level int
}
// 重定义父类方法
func (this *SuperMan) Eat() {
fmt.Println("SuperMan.Eat()...")
}
// 子类新方法
func (this *SuperMan) Fly() {
fmt.Println("SuperMan.Fly()...")
}
func (this *SuperMan) Print() {
fmt.Println("name = ", this.name)
fmt.Println("sex = ", this.sex)
fmt.Println("level = ", this.level)
}
func main(){
h := Human{"zhang3", "female"}
h.Eat()
h.Walk()
// 定义一个子类对象
// s := SuperMan{Human{"WNN", "male"}, 88}
var s SuperMan
s.name = "WNN"
s.sex = "real man"
s.level = 88
s.Walk()
s.Eat()
s.Fly()
s.Print()
}
Output:
(base) PS D:\goproject\src\gostudy> go run .
Human.Eat()...
Human.Walk()...
Human.Walk()...
SuperMan.Eat()...
SuperMan.Fly()...
name = WNN
sex = real man
level = 88
(base) PS D:\goproject\src\gostudy> go run .
Cat is Sleep
color = Green
color = Cat
Dog is Sleep
color = Yellow
color = Dog
18. interface空接口万能类型与类型断言机制
interface空接口
package main
import "fmt"
func myFunc(arg interface{}) {
fmt.Println("myFunc is called...")
fmt.Println(arg)
// interface{} 改如何区分 此时引用的底层数据类型到底是什么?
// 给 interface{}提供"类型断言"机制
value, ok := arg.(string)
if !ok {
fmt.Println("arg is not a string")
} else {
fmt.Println("arg is string type, value = ", value)
fmt.Printf("value type is %T\n ", value)
}
}
type Book struct {
auth string
}
func main() {
book := Book{"golang"}
myFunc(book)
myFunc(100)
myFunc("abc")
myFunc(3.14)
}
Output:
(base) PS D:\goproject\src\gostudy> go run .
myFunc is called...
{golang}
arg is not a string
myFunc is called...
100
arg is not a string
myFunc is called...
abc
arg is string type, value = abc
value type is string
myFunc is called...
3.14
arg is not a string
19. 变量的内置pair结构详细说明
关于变量的内置pair结构的详细说明
package main
import "fmt"
func main() {
var a string
// pair<staticType:string, value:"aceld">
a = "aceld"
// pair<type:string, value:"aceld">
var allType interface{}
allType = a
str, _ := allType.(string)
fmt.Println(str)
}
Output:
(base) PS D:\goproject\src\gostudy\11-reflect> go run .
aceld
20. Go反射reflect机制用法
一
package main
import (
"fmt"
"reflect"
)
func reflectNum(arg interface{}) {
fmt.Println("type : ", reflect.TypeOf(arg))
fmt.Println("value : ", reflect.ValueOf(arg))
}
func main() {
var num float64 = 1.23345
reflectNum(num)
}
Output:
(base) PS D:\goproject\src\gostudy> go run .
type : float64
value : 1.23345
二
package main
import (
"fmt"
"reflect"
)
type User struct {
Id int
Name string
Age int
}
func (this User) Call() {
fmt.Println("User is called ..")
fmt.Printf("%v\n", this)
}
func main() {
user := User{1, "Aceld", 18}
DoFileAndMethod(user)
}
func DoFileAndMethod(input interface{}) {
// 获取input的type
inputType := reflect.TypeOf(input)
fmt.Println("inputType is : ", inputType.Name())
// 获取input的value
inputValue := reflect.ValueOf(input)
fmt.Println("inputValue is :", inputValue)
// 通过type获取里面的字段
// 1.获取interface的reflect.Type,通过Type得到NumField,进行遍历
// 2.得到每个Field,数据类型
// 3.通过field有一个Interface()方法等到对应的value
for i := 0; i < inputType.NumField(); i++ {
field := inputType.Field(i)
value := inputValue.Field(i).Interface()
fmt.Printf("%s: %v = %v\n", field.Name, field.Type, value)
}
// 通过type获取里面的方法,调用
for i := 0; i < inputType.NumMethod(); i++ {
m := inputType.Method(i)
fmt.Printf("%s: %v\n", m.Name, m.Type)
}
}
Output:
(base) PS D:\goproject\src\gostudy> go run .
inputType is : User
inputValue is : {1 Aceld 18}
Id: int = 1
Name: string = Aceld
Age: int = 18
Call: func(main.User)
21. Go反射解析结构体标签Tag
package main
import (
"fmt"
"reflect"
)
type resume struct {
Name string `info:"name" doc:"我的名字"`
Sex string `info:"sex"`
}
func findTag(str interface{}) {
t := reflect.TypeOf(str).Elem()
for i := 0; i < t.NumField(); i++ {
taginfo := t.Field(i).Tag.Get("info")
tagdoc := t.Field(i).Tag.Get("doc")
fmt.Println("info: ", taginfo, " doc: ", tagdoc)
}
}
func main() {
var re resume
findTag(&re)
}
Output:
(base) PS D:\goproject\src\gostudy> go run .
info: name doc: 我的名字
info: sex doc:
22. 结构体标签在JSON中的应用
结构体标签在JSON中的应用
package main
import (
"encoding/json"
"fmt"
)
type Movie struct {
Title string `json:"title"`
Year int `json:"year"`
Price int `json:"rmb"`
Actors []string `json:"actors"`
}
func main() {
movie := Movie{"喜剧之王", 2000, 10, []string{"xingye", "zhangbozhi"}}
// 编码 结构体==>json
jsonStr, err := json.Marshal(movie)
if err != nil {
fmt.Println("json marshal error", err)
return
}
fmt.Printf("jsonStr = %s\n", jsonStr)
// 解码 jsonStr ==> 结构体
myMovie := Movie{}
err = json.Unmarshal(jsonStr, &myMovie)
if err != nil {
fmt.Println("json Unmarshal error", err)
return
}
fmt.Printf("%v\n", myMovie)
}
Output:
(base) PS D:\goproject\src\gostudy> go run .
jsonStr = {"title":"喜剧之王","year":2000,"rmb":10,"actors":["xingye","zhangbozhi"]}
{喜剧之王 2000 10 [xingye zhangbozhi]}