区块链技术博客
www.b2bchain.cn

基础篇·第一章·作业求职学习资料

本文介绍了基础篇·第一章·作业求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

[TOC]

作业如下:

1. Go语言的变量命名规范是什么?

只能由字母、下划线、数字组成,且不以数字开头; 不能使用关键字、保留字等GO内置元素; 严格区分大小写; 一般遵循驼峰命名法;

2. 如何获取变量的地址?如何取到地址中的值?

通过 & 取地址符号获取变量地址; 通过 * 解引用符号获取地址中的值;

3. 变量的生命周期是什么?作用域是什么?

变量从被声明出来到其占用的内存被释放的时间范围; 变量在程序中可被引用到的代码块所涵盖的范围就是它的作用域;

4. 创建变量有哪几种方式

一般声明方式:     var 变量名 变量类型     例: var aIntVar int  批量声明方式:      var (         变量名1 变量类型         变量名2 = 初始表达式     )     例:  var (             aString string             isTrue = true          )  自动推导类型方式:     var 变量名 = 初始表达式     例: var aIntVar = 1  短声明(完全推导方式):     变量名 := 初始表达式     例: aString := "abc"

5. Go语言简单数据类型都有哪些?

整型     有符号 int int8 int16 int32 int64     无符号 uint uint8 uint16 uint32 uint64     byte     rune 浮点型     float32 float64 布尔型     bool 字符串     string

6. 初始化数组的几种方式?

一般初始化     var 数组名 数组类型 = 数组类型{初始值列表} 例: var intArr [3]int = [3]int{1,2,3}     var intArr [3]int = [...]int{1,2,3}  省略形式     var 数组名 = 数组类型{初始值列表} 例: var intArr = [3]int{1,2,3}     var intArr = [...]int{1,2,3}  短声明形式     数组名 := 数组类型{初始值列表} 例: intArr := [3]int{1,2,3}     intArr := [...]int{1,2,3}

7. 遍历数组

  • fori形式
intArr := [...]int{1,2,3} for i := 0; i < len(intArr); i++ {     fmt.Println(intArr[i]) }
  • for…range形式
for i, v := range intArr {     fmt.Println(i, v) }

8. 初始化切片的几种方式?

一般初始化     var 切片名 切片类型 = 切片类型{初始值列表} 例: var intSlice []int = []int{1,2,3}  省略形式     var 数组名 = 切片类型{初始值列表} 例: var intSlice = []int{1,2,3}  短声明形式     切片名 := 切片类型{初始值列表} 例: intSlice := []int{1,2,3}  从数组切取     intArr := [...]int{1,2,3,4,5}     完全切取         intSlice := intArr[:]     从左下边开始切取至结束         intSlice := intArr[0:]     切取部分至结束下标         intSlice := intArr[:4]     指定切取范围左右下标         intSlice := intArr[2:4]  make方式     intArr := make([]int)

9. 遍历切片

  • fori形式
intSlice := [...]int{1,2,3} for i := 0; i < len(intSlice); i++ {     fmt.Println(intSlice[i]) }
  • for…range形式
for i, v := range intSlice {     fmt.Println(i, v) }

10. 如何复制切片

方式1     通过内置函数copy,例: copy(distSlice, srcSlice) 方式2     直接赋值,例: bSlice := aSlice 方式3     切片切取,例: cSlice := dSlice[:]

11. 实现切片的增删改查

// 初始化切片 aIntSlice := make([]int, 3)  // 增 方式1(需len > 0) 直接赋值 aIntSlice[0] = 1  // 增 方式2 append方式 末尾追加 aIntSlice = append(aIntSlice, 4)  // 增 方式3 指定下标插入 aIntSlice = append(aIntSlice[:2], append([]int{2}, aIntSlice[2:]...)...)   // 删 aIntSlice = append(aIntSlice[:2], aIntSlice[3]...)  // 改 aIntSlice[1] = 1  // 查 for i, v := range aIntSlice {     if v == 3 {         fmt.Println("找到")     } }

12. 下面代码是否有问题?并说出为什么? 如果有问题,如何修正?

s:=[]string{"炭烤生蚝","麻辣小龙虾","干锅鸭"} s2:= make([]*string,len(s)) for i,v:=range s{      s2[i]=&v } 问题:     s2中的元素值都是s的最后一个元素值; 原因:     for...range遍历中每次迭代的值只是副本拷贝给临时变量v,每次迭代的值在变化,但是v始终是同一个,遍历的最后一次迭代v得到的值为s切片的最后一个元素。 修正:     方式1[推荐]:         s2[i] = &s[i]     方式2:         vNew := v         s2[i] = &vNew

13. 分别写一个 if 和 switch、枚举 的例子

package main  import (     "fmt"     "math/rand" )  const (     SUNDAY = iota     MONDAY     TUESDAY     WEDNESDAY     THURSDAY     FRIDAY     SATURDAY )  func main() {     rnd := rand.New(rand.NewSource(time.Now().UnixNano()))     weekDay := rnd.Intn(6)      if weekDay > SUNDAY && weekDay < SATURDAY {         fmt.Println("work hard")     }else {         fmt.Println("happy weekend")     }      switch weekDay {     case SUNDAY,SATURDAY:         fmt.Println("happy weekend")     default:         fmt.Println("work hard")     } }

14. map有什么特点?

实现特点:     map是通过bucket来存储key-value, key-value则是通过哈希函数散列到不同桶中。 遍历特点:     因为实现是哈希,所以遍历结果也就是无序的。 KEY特点:     必须是可==比较的类型。

15. 什么样的类型可以做map的key

可进行==比较的基本类型以及只含基本类型的数组、结构体。

16. 写一个map的增删改查

package main  import "fmt"  func main() {     // 初始化map     goods := make(map[string][]string)      // 增     goods["水果"] = []string{"苹果", "香蕉", "橘子"}     goods["蔬菜"] = []string{"萝卜", "白菜"}     goods["肉禽"] = []string{"鸡", "鸭", "与"}      // 删     delete(goods, "肉禽")      // 改     goods["肉禽"] = []string{"鸡", "鸭", "与"}      // 查     if _, ok := goods["蔬菜"]; !ok{         fmt.Println("不存在")     }      // 遍历     for s, good := range goods {         fmt.Println(s, good)     }  }

17. 函数的定义

对需要进行复用的完成某项业务逻辑的代码指令集组织形成的带名字或参数列表或返回值列表的的代码块。

18. 函数传参,传值还是传引用?

GO中只有值传递。 实际使用场景中,是拷贝值的副本传入参数。 而值的类型可分为基本类型或引用类型。  类型的选择,可以从以下方面考虑: 1)是否需要改变源值,是的话,传递它的引用(本身是引用类型或非引用类型的指针); 2) 源值的数据如果很大,则拷贝代价较大,则考虑传递其引用;

19. 定义函数的多返回值?

package main  import "fmt"  func main() {     addOp, subOp := calc()     sum := addOp(2, 1)     sub := subOp(4, 3)     fmt.Println(sum, sub) }  func calc() (func(int, int) int, func(int, int) int) {     return func(i int, i2 int) int {             return i + i2         }, func(i int, i2 int) int {             return i - i2         } }

20. 举例说明 函数变量、匿名函数、闭包、变长函数?

package main  import (     "fmt"     "strings" )  func main() {     fileNames := []string{"test.jpg", "test.txt", "test.go", "test.png"} //待检测格式的文件列表     supportExt := []string{"jpeg", "jpg", "png", "gif"}                  //符合条件的文件后缀格式     chkFile := ToChkSuffix(supportExt...)     for _, name := range fileNames {         fmt.Println(name, chkFile(name)) //结果     } }  // 声明函数类型 type ChkSuffix func(fileName string) bool  // 功能: 检查文件格式是否符合要求 // in:  vaArgs 变长参数列表 // out: chk 函数变量 func ToChkSuffix(vaArgs ...string) (chk ChkSuffix) {     // 匿名函数和闭包     return func(fileName string) bool {         fileExt := strings.Split(fileName, ".")[1]         for _, arg := range vaArgs {             if fileExt == arg {                 return true             }         }         return false     } }

21. 说一下面向对象设计的好处?

GO语言中,面向对象三大特性“封装”、“继承”、“多态”,就充分体现了其好处: 如提高代码的可复用性、健壮性、扩展性,安全性,同时通过GO的接口实现的“多态”更加“高内聚低耦合”。

22. 方法的定义

GO语言的方法是指绑定了具体类型或具体类型的引用的函数。

23. 指针接收者和值接收者有何不同

指针接收者,传递的是类型的引用,意味着方法中对接收者的影响是即时生效的; 反之,值接收者在方法中的改变只是它的一个拷贝副本,并不影响自身。

[TOC]

作业如下:

1. Go语言的变量命名规范是什么?

只能由字母、下划线、数字组成,且不以数字开头; 不能使用关键字、保留字等GO内置元素; 严格区分大小写; 一般遵循驼峰命名法;

2. 如何获取变量的地址?如何取到地址中的值?

通过 & 取地址符号获取变量地址; 通过 * 解引用符号获取地址中的值;

3. 变量的生命周期是什么?作用域是什么?

变量从被声明出来到其占用的内存被释放的时间范围; 变量在程序中可被引用到的代码块所涵盖的范围就是它的作用域;

4. 创建变量有哪几种方式

一般声明方式:     var 变量名 变量类型     例: var aIntVar int  批量声明方式:      var (         变量名1 变量类型         变量名2 = 初始表达式     )     例:  var (             aString string             isTrue = true          )  自动推导类型方式:     var 变量名 = 初始表达式     例: var aIntVar = 1  短声明(完全推导方式):     变量名 := 初始表达式     例: aString := "abc"

5. Go语言简单数据类型都有哪些?

整型     有符号 int int8 int16 int32 int64     无符号 uint uint8 uint16 uint32 uint64     byte     rune 浮点型     float32 float64 布尔型     bool 字符串     string

6. 初始化数组的几种方式?

一般初始化     var 数组名 数组类型 = 数组类型{初始值列表} 例: var intArr [3]int = [3]int{1,2,3}     var intArr [3]int = [...]int{1,2,3}  省略形式     var 数组名 = 数组类型{初始值列表} 例: var intArr = [3]int{1,2,3}     var intArr = [...]int{1,2,3}  短声明形式     数组名 := 数组类型{初始值列表} 例: intArr := [3]int{1,2,3}     intArr := [...]int{1,2,3}

7. 遍历数组

  • fori形式
intArr := [...]int{1,2,3} for i := 0; i < len(intArr); i++ {     fmt.Println(intArr[i]) }
  • for…range形式
for i, v := range intArr {     fmt.Println(i, v) }

8. 初始化切片的几种方式?

一般初始化     var 切片名 切片类型 = 切片类型{初始值列表} 例: var intSlice []int = []int{1,2,3}  省略形式     var 数组名 = 切片类型{初始值列表} 例: var intSlice = []int{1,2,3}  短声明形式     切片名 := 切片类型{初始值列表} 例: intSlice := []int{1,2,3}  从数组切取     intArr := [...]int{1,2,3,4,5}     完全切取         intSlice := intArr[:]     从左下边开始切取至结束         intSlice := intArr[0:]     切取部分至结束下标         intSlice := intArr[:4]     指定切取范围左右下标         intSlice := intArr[2:4]  make方式     intArr := make([]int)

9. 遍历切片

  • fori形式
intSlice := [...]int{1,2,3} for i := 0; i < len(intSlice); i++ {     fmt.Println(intSlice[i]) }
  • for…range形式
for i, v := range intSlice {     fmt.Println(i, v) }

10. 如何复制切片

方式1     通过内置函数copy,例: copy(distSlice, srcSlice) 方式2     直接赋值,例: bSlice := aSlice 方式3     切片切取,例: cSlice := dSlice[:]

11. 实现切片的增删改查

// 初始化切片 aIntSlice := make([]int, 3)  // 增 方式1(需len > 0) 直接赋值 aIntSlice[0] = 1  // 增 方式2 append方式 末尾追加 aIntSlice = append(aIntSlice, 4)  // 增 方式3 指定下标插入 aIntSlice = append(aIntSlice[:2], append([]int{2}, aIntSlice[2:]...)...)   // 删 aIntSlice = append(aIntSlice[:2], aIntSlice[3]...)  // 改 aIntSlice[1] = 1  // 查 for i, v := range aIntSlice {     if v == 3 {         fmt.Println("找到")     } }

12. 下面代码是否有问题?并说出为什么? 如果有问题,如何修正?

s:=[]string{"炭烤生蚝","麻辣小龙虾","干锅鸭"} s2:= make([]*string,len(s)) for i,v:=range s{      s2[i]=&v } 问题:     s2中的元素值都是s的最后一个元素值; 原因:     for...range遍历中每次迭代的值只是副本拷贝给临时变量v,每次迭代的值在变化,但是v始终是同一个,遍历的最后一次迭代v得到的值为s切片的最后一个元素。 修正:     方式1[推荐]:         s2[i] = &s[i]     方式2:         vNew := v         s2[i] = &vNew

13. 分别写一个 if 和 switch、枚举 的例子

package main  import (     "fmt"     "math/rand" )  const (     SUNDAY = iota     MONDAY     TUESDAY     WEDNESDAY     THURSDAY     FRIDAY     SATURDAY )  func main() {     rnd := rand.New(rand.NewSource(time.Now().UnixNano()))     weekDay := rnd.Intn(6)      if weekDay > SUNDAY && weekDay < SATURDAY {         fmt.Println("work hard")     }else {         fmt.Println("happy weekend")     }      switch weekDay {     case SUNDAY,SATURDAY:         fmt.Println("happy weekend")     default:         fmt.Println("work hard")     } }

14. map有什么特点?

实现特点:     map是通过bucket来存储key-value, key-value则是通过哈希函数散列到不同桶中。 遍历特点:     因为实现是哈希,所以遍历结果也就是无序的。 KEY特点:     必须是可==比较的类型。

15. 什么样的类型可以做map的key

可进行==比较的基本类型以及只含基本类型的数组、结构体。

16. 写一个map的增删改查

package main  import "fmt"  func main() {     // 初始化map     goods := make(map[string][]string)      // 增     goods["水果"] = []string{"苹果", "香蕉", "橘子"}     goods["蔬菜"] = []string{"萝卜", "白菜"}     goods["肉禽"] = []string{"鸡", "鸭", "与"}      // 删     delete(goods, "肉禽")      // 改     goods["肉禽"] = []string{"鸡", "鸭", "与"}      // 查     if _, ok := goods["蔬菜"]; !ok{         fmt.Println("不存在")     }      // 遍历     for s, good := range goods {         fmt.Println(s, good)     }  }

17. 函数的定义

对需要进行复用的完成某项业务逻辑的代码指令集组织形成的带名字或参数列表或返回值列表的的代码块。

18. 函数传参,传值还是传引用?

GO中只有值传递。 实际使用场景中,是拷贝值的副本传入参数。 而值的类型可分为基本类型或引用类型。  类型的选择,可以从以下方面考虑: 1)是否需要改变源值,是的话,传递它的引用(本身是引用类型或非引用类型的指针); 2) 源值的数据如果很大,则拷贝代价较大,则考虑传递其引用;

19. 定义函数的多返回值?

package main  import "fmt"  func main() {     addOp, subOp := calc()     sum := addOp(2, 1)     sub := subOp(4, 3)     fmt.Println(sum, sub) }  func calc() (func(int, int) int, func(int, int) int) {     return func(i int, i2 int) int {             return i + i2         }, func(i int, i2 int) int {             return i - i2         } }

20. 举例说明 函数变量、匿名函数、闭包、变长函数?

package main  import (     "fmt"     "strings" )  func main() {     fileNames := []string{"test.jpg", "test.txt", "test.go", "test.png"} //待检测格式的文件列表     supportExt := []string{"jpeg", "jpg", "png", "gif"}                  //符合条件的文件后缀格式     chkFile := ToChkSuffix(supportExt...)     for _, name := range fileNames {         fmt.Println(name, chkFile(name)) //结果     } }  // 声明函数类型 type ChkSuffix func(fileName string) bool  // 功能: 检查文件格式是否符合要求 // in:  vaArgs 变长参数列表 // out: chk 函数变量 func ToChkSuffix(vaArgs ...string) (chk ChkSuffix) {     // 匿名函数和闭包     return func(fileName string) bool {         fileExt := strings.Split(fileName, ".")[1]         for _, arg := range vaArgs {             if fileExt == arg {                 return true             }         }         return false     } }

21. 说一下面向对象设计的好处?

GO语言中,面向对象三大特性“封装”、“继承”、“多态”,就充分体现了其好处: 如提高代码的可复用性、健壮性、扩展性,安全性,同时通过GO的接口实现的“多态”更加“高内聚低耦合”。

22. 方法的定义

GO语言的方法是指绑定了具体类型或具体类型的引用的函数。

23. 指针接收者和值接收者有何不同

指针接收者,传递的是类型的引用,意味着方法中对接收者的影响是即时生效的; 反之,值接收者在方法中的改变只是它的一个拷贝副本,并不影响自身。

[TOC]

作业如下:

1. Go语言的变量命名规范是什么?

只能由字母、下划线、数字组成,且不以数字开头; 不能使用关键字、保留字等GO内置元素; 严格区分大小写; 一般遵循驼峰命名法;

2. 如何获取变量的地址?如何取到地址中的值?

通过 & 取地址符号获取变量地址; 通过 * 解引用符号获取地址中的值;

3. 变量的生命周期是什么?作用域是什么?

变量从被声明出来到其占用的内存被释放的时间范围; 变量在程序中可被引用到的代码块所涵盖的范围就是它的作用域;

4. 创建变量有哪几种方式

一般声明方式:     var 变量名 变量类型     例: var aIntVar int  批量声明方式:      var (         变量名1 变量类型         变量名2 = 初始表达式     )     例:  var (             aString string             isTrue = true          )  自动推导类型方式:     var 变量名 = 初始表达式     例: var aIntVar = 1  短声明(完全推导方式):     变量名 := 初始表达式     例: aString := "abc"

5. Go语言简单数据类型都有哪些?

整型     有符号 int int8 int16 int32 int64     无符号 uint uint8 uint16 uint32 uint64     byte     rune 浮点型     float32 float64 布尔型     bool 字符串     string

6. 初始化数组的几种方式?

一般初始化     var 数组名 数组类型 = 数组类型{初始值列表} 例: var intArr [3]int = [3]int{1,2,3}     var intArr [3]int = [...]int{1,2,3}  省略形式     var 数组名 = 数组类型{初始值列表} 例: var intArr = [3]int{1,2,3}     var intArr = [...]int{1,2,3}  短声明形式     数组名 := 数组类型{初始值列表} 例: intArr := [3]int{1,2,3}     intArr := [...]int{1,2,3}

7. 遍历数组

  • fori形式
intArr := [...]int{1,2,3} for i := 0; i < len(intArr); i++ {     fmt.Println(intArr[i]) }
  • for…range形式
for i, v := range intArr {     fmt.Println(i, v) }

8. 初始化切片的几种方式?

一般初始化     var 切片名 切片类型 = 切片类型{初始值列表} 例: var intSlice []int = []int{1,2,3}  省略形式     var 数组名 = 切片类型{初始值列表} 例: var intSlice = []int{1,2,3}  短声明形式     切片名 := 切片类型{初始值列表} 例: intSlice := []int{1,2,3}  从数组切取     intArr := [...]int{1,2,3,4,5}     完全切取         intSlice := intArr[:]     从左下边开始切取至结束         intSlice := intArr[0:]     切取部分至结束下标         intSlice := intArr[:4]     指定切取范围左右下标         intSlice := intArr[2:4]  make方式     intArr := make([]int)

9. 遍历切片

  • fori形式
intSlice := [...]int{1,2,3} for i := 0; i < len(intSlice); i++ {     fmt.Println(intSlice[i]) }
  • for…range形式
for i, v := range intSlice {     fmt.Println(i, v) }

10. 如何复制切片

方式1     通过内置函数copy,例: copy(distSlice, srcSlice) 方式2     直接赋值,例: bSlice := aSlice 方式3     切片切取,例: cSlice := dSlice[:]

11. 实现切片的增删改查

// 初始化切片 aIntSlice := make([]int, 3)  // 增 方式1(需len > 0) 直接赋值 aIntSlice[0] = 1  // 增 方式2 append方式 末尾追加 aIntSlice = append(aIntSlice, 4)  // 增 方式3 指定下标插入 aIntSlice = append(aIntSlice[:2], append([]int{2}, aIntSlice[2:]...)...)   // 删 aIntSlice = append(aIntSlice[:2], aIntSlice[3]...)  // 改 aIntSlice[1] = 1  // 查 for i, v := range aIntSlice {     if v == 3 {         fmt.Println("找到")     } }

12. 下面代码是否有问题?并说出为什么? 如果有问题,如何修正?

s:=[]string{"炭烤生蚝","麻辣小龙虾","干锅鸭"} s2:= make([]*string,len(s)) for i,v:=range s{      s2[i]=&v } 问题:     s2中的元素值都是s的最后一个元素值; 原因:     for...range遍历中每次迭代的值只是副本拷贝给临时变量v,每次迭代的值在变化,但是v始终是同一个,遍历的最后一次迭代v得到的值为s切片的最后一个元素。 修正:     方式1[推荐]:         s2[i] = &s[i]     方式2:         vNew := v         s2[i] = &vNew

13. 分别写一个 if 和 switch、枚举 的例子

package main  import (     "fmt"     "math/rand" )  const (     SUNDAY = iota     MONDAY     TUESDAY     WEDNESDAY     THURSDAY     FRIDAY     SATURDAY )  func main() {     rnd := rand.New(rand.NewSource(time.Now().UnixNano()))     weekDay := rnd.Intn(6)      if weekDay > SUNDAY && weekDay < SATURDAY {         fmt.Println("work hard")     }else {         fmt.Println("happy weekend")     }      switch weekDay {     case SUNDAY,SATURDAY:         fmt.Println("happy weekend")     default:         fmt.Println("work hard")     } }

14. map有什么特点?

实现特点:     map是通过bucket来存储key-value, key-value则是通过哈希函数散列到不同桶中。 遍历特点:     因为实现是哈希,所以遍历结果也就是无序的。 KEY特点:     必须是可==比较的类型。

15. 什么样的类型可以做map的key

可进行==比较的基本类型以及只含基本类型的数组、结构体。

16. 写一个map的增删改查

package main  import "fmt"  func main() {     // 初始化map     goods := make(map[string][]string)      // 增     goods["水果"] = []string{"苹果", "香蕉", "橘子"}     goods["蔬菜"] = []string{"萝卜", "白菜"}     goods["肉禽"] = []string{"鸡", "鸭", "与"}      // 删     delete(goods, "肉禽")      // 改     goods["肉禽"] = []string{"鸡", "鸭", "与"}      // 查     if _, ok := goods["蔬菜"]; !ok{         fmt.Println("不存在")     }      // 遍历     for s, good := range goods {         fmt.Println(s, good)     }  }

17. 函数的定义

对需要进行复用的完成某项业务逻辑的代码指令集组织形成的带名字或参数列表或返回值列表的的代码块。

18. 函数传参,传值还是传引用?

GO中只有值传递。 实际使用场景中,是拷贝值的副本传入参数。 而值的类型可分为基本类型或引用类型。  类型的选择,可以从以下方面考虑: 1)是否需要改变源值,是的话,传递它的引用(本身是引用类型或非引用类型的指针); 2) 源值的数据如果很大,则拷贝代价较大,则考虑传递其引用;

19. 定义函数的多返回值?

package main  import "fmt"  func main() {     addOp, subOp := calc()     sum := addOp(2, 1)     sub := subOp(4, 3)     fmt.Println(sum, sub) }  func calc() (func(int, int) int, func(int, int) int) {     return func(i int, i2 int) int {             return i + i2         }, func(i int, i2 int) int {             return i - i2         } }

20. 举例说明 函数变量、匿名函数、闭包、变长函数?

package main  import (     "fmt"     "strings" )  func main() {     fileNames := []string{"test.jpg", "test.txt", "test.go", "test.png"} //待检测格式的文件列表     supportExt := []string{"jpeg", "jpg", "png", "gif"}                  //符合条件的文件后缀格式     chkFile := ToChkSuffix(supportExt...)     for _, name := range fileNames {         fmt.Println(name, chkFile(name)) //结果     } }  // 声明函数类型 type ChkSuffix func(fileName string) bool  // 功能: 检查文件格式是否符合要求 // in:  vaArgs 变长参数列表 // out: chk 函数变量 func ToChkSuffix(vaArgs ...string) (chk ChkSuffix) {     // 匿名函数和闭包     return func(fileName string) bool {         fileExt := strings.Split(fileName, ".")[1]         for _, arg := range vaArgs {             if fileExt == arg {                 return true             }         }         return false     } }

21. 说一下面向对象设计的好处?

GO语言中,面向对象三大特性“封装”、“继承”、“多态”,就充分体现了其好处: 如提高代码的可复用性、健壮性、扩展性,安全性,同时通过GO的接口实现的“多态”更加“高内聚低耦合”。

22. 方法的定义

GO语言的方法是指绑定了具体类型或具体类型的引用的函数。

23. 指针接收者和值接收者有何不同

指针接收者,传递的是类型的引用,意味着方法中对接收者的影响是即时生效的; 反之,值接收者在方法中的改变只是它的一个拷贝副本,并不影响自身。

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 基础篇·第一章·作业求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们