先客观来说说Golang的使用体验**(目前感受)**
C/CPP/C#/PYTHON 程序员上手Golang可能遇到的不习惯之处: 无函数重载特性,可以使用不同函数名解决使用包的概念,类似namespcae,可访问程度使用首字母大小写来辨别无枚举特性,使用const+iota解决自己实现面向对象特性有点麻烦,代码写出来会比较零散。C#/Cpp程序员使用Go语言的for循环可能会感觉迷惑,后面详细讲解。异常处理写法,习惯了也还行 Golang使用舒服之处 比C/C++更安心便捷的指针简洁奉行 [如无必要,勿增实体] 的准则 For循环要说的地方以下这几行代码以我经验去理解,会觉得value是每次循环都会被迭代的,类似C#中实现了next()方法,认为每次拿到的value都指向不同的位置
但是实际运行发现index和value值确实在变化,但是&value是固定的
var IntList []int = []int{1,2,3,4,5}
for index,value := range(IntList){
fmt.Printf("index=%d,value=%d,address of value=%d\n",index,value,&value)
}
其实这里的value是一个临时变量(var value int),每次循环会取出列表里的值赋值给value,所以value值确实是变动的,但是value的地址是固定的
正文 李文周博客习题解答package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
// *** 作状态
type State int
const (
SUC State = iota
FAL_ATTRI
FAL_EMPTY
FAL_FULL
FAL_NONE
FAL_MISMATCH
)
//学生信息
type Student struct {
id int
name string
age int
score int
}
//学生信息管理
type StuManagerment struct {
stuArray []Student
length int
capacity int
}
//brief:信息管理构造函数
//args :管理学生的个数上限
//ret :管理器的指针
func newStuManagerment(cap int) (*StuManagerment, State) {
stuArray := make([]Student, 0, cap)
if stuArray == nil {
return nil, FAL_ATTRI
}
sm := new(StuManagerment)
sm.capacity = cap
sm.length = 0
sm.stuArray = stuArray
return sm, SUC
}
//信息管理相关函数
//brief:显示学生列表中所有的学生信息
//args :学生管理器指针
//ret :
func (s *StuManagerment) ShowList() State {
if s.length == 0 {
fmt.Println("Is Empty")
return FAL_EMPTY
}
for _, stu := range s.stuArray {
fmt.Println(stu)
}
return SUC
}
//brief:添加学生
//args :所添加学生的结构体指针
//ret :是否添加成功
func (s *StuManagerment) AddusingStudent(stu *Student) State {
if s.length == s.capacity {
fmt.Println("Full!")
return FAL_FULL
}
s.stuArray = append(s.stuArray, *stu)
s.length++
return SUC
}
//brief:添加学生信息
//args: 所添加学生的所有信息
//ret : 是否添加成功
func (s *StuManagerment) AddusingFeild(_id int, _name string, _age int, _score int) State {
if s.length == s.capacity {
fmt.Println("Full!")
return FAL_FULL
}
stu := new(Student)
stu.id = _id
stu.name = _name
stu.age = _age
stu.score = _score
s.stuArray = append(s.stuArray, *stu)
s.length++
return SUC
}
//brief:删除学生
//args :学生id
//ret :State
func (s *StuManagerment) Del(id int) State {
for index, stu := range s.stuArray {
if stu.id == id {
s.stuArray = append(s.stuArray[:(index)], s.stuArray[(index+1):]...)
s.length--
return SUC
}
}
return FAL_NONE
}
//brief:修改学生信息
func (s *StuManagerment) Mod() State {
fmt.Println("Input Student Info(id name age score): ")
//获取用户输入
input := bufio.NewScanner(os.Stdin)
input.Scan()
info := input.Text()
//通过空格拆分为列表
infoList := strings.Split(info, " ")
//id
id, err := strconv.Atoi(infoList[0])
if err != nil {
return FAL_ATTRI
}
//name
name := infoList[1]
//age
age, err := strconv.Atoi(infoList[2])
if err != nil {
return FAL_ATTRI
}
//score
score, err := strconv.Atoi(infoList[3])
if err != nil {
return FAL_ATTRI
}
fmt.Printf("You Input is id:\n%d name:%s age:%d score:%d\n", id, name, age, score)
//扫描要修改的目标id是否存在
for index, stu := range s.stuArray {
if stu.id == id {
s.stuArray[index].name = name
s.stuArray[index].age = age
s.stuArray[index].score = score
fmt.Println("Modify Succeed")
return SUC
}
}
fmt.Println("ID is not in list")
return FAL_NONE
}
func main() {
fmt.Println("=================Student Information Management================")
stumanager, state := newStuManagerment(10)
if state != SUC {
fmt.Println("Make Error")
return
}
fmt.Println("Add A Student with method one")
stumanager.AddusingFeild(1, "ly", 19, 100)
fmt.Println(stumanager)
fmt.Println("Add A Student with method two")
stu1 := Student{2, "yhq", 20, 100}
stumanager.AddusingStudent(&stu1)
fmt.Println("Show List")
stumanager.ShowList()
fmt.Println("Delete ID=1")
stumanager.Del(1)
fmt.Println("Show Deleted List")
stumanager.ShowList()
fmt.Println("Modify A Student")
stumanager.Mod()
fmt.Println("Show the Modified List")
stumanager.ShowList()
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)