Go语言入门(五)结构体&练习
时间:2022-07-25
本文章向大家介绍Go语言入门(五)结构体&练习,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
结构体&练习
结构体
定义
Go中的面向对象是通过 struct来实现的,struct是用户自定义的类型
//定义结构体
/定义结构体
type User struct {
Name string
Gender string
Age int
AvatarUrl string
}
func useStruct() {
//初始化结构体1
var user1 User
user1.Name = "jeson"
user1.Gender = "male"
user1.Age = 20
user1.AvatarUrl = "http://baidu.com"
//初始化结构体2
user2 := User{
Name: "miky",
Gender: "female",
Age: 18,
}
fmt.Println(user1,user2)
//空结构体
user3 := User{}
fmt.Println(user3)
}
结构体的特性
- struct的内存布局:占用一段连续的内存空间
- 结构体没有构造函数,需要自己实现
//定义结构体
type User struct {
Name string
Gender string
Age int
AvatarUrl string
}
// 定义构造函数
func NewUser(name,gender string,age int,url string) User {
var user User
user.Name = name
user.Gender = gender
user.Age = age
user.AvatarUrl = url
return user
}
//使用构造函数
func main() {
user1 := NewUser("zhansan","male",23,"xxx")
fmt.Println(user1)
}
匿名字段和嵌套的使用
type People struct {
Name string
Gender string
Age int
AvatarUrl string
//匿名字段
int
string
//结构体嵌套
address Address
}
type Address struct {
City string
Province string
}
func nimingStructs() {
var people People
people.Name = "abc"
people.Gender = "male"
people.AvatarUrl = "www.qq.com"
//直接用结构体名引用匿名字段
people.int = 99
people.string = "hello world"
//嵌套结构体的使用
people.address.City = "beijing"
people.address.Province = "beijing"
fmt.Printf("%#vn",people)
//
people1 := People{
Name: "alley",
Gender: "male",
Age: 12,
AvatarUrl: "www.baidu.com",
int: 0,
string: "dd",
address: Address{
City: "Lanzhou",
Province: "Gansu",
},
}
fmt.Printf("%#vn",people1)
}
- 匿名结构体: 继承
- 字段可见性: 大写表示公开可以访问,小写表示私有
tag与结构体的应用
tag是结构体原信息,可以在运行的时候通过反射的机制读取出来
type User struct {
Name string `json:"name"`
Gender string `json:"gender"`
Age int `json:"age"`
AvatarUrl string `json:"avataurl"`
}
func jsonMarshal () {
var user User
user.Name = "jeck"
user.Gender = "male"
user.Age = 20
user.AvatarUrl = "xxx"
//json 格式
data,err := json.Marshal(user)
if err != nil {
fmt.Printf("marshal failed %vn",err)
return
}
fmt.Printf("json:%vn",string(data))
}
练习
- 实现1-100内的质数的打印
func isPrime(n int) bool {
var flag = true
for j:=2;j<n;j++ {
if (n%j==0) {
flag = false
break
}
}
return flag
}
func zhishu() {
var n int
fmt.Printf("Please input n:n")
fmt.Scanf("%d",&n)
for i := 2;i<n;i++ {
if isPrime(i) {
fmt.Printf("%d is primen",i)
}
}
}
- 输入一行字符,分别计算簇字母空格数字和其他字符的个数
v1初始版
func main() {
str := "how are you! i am fine! thank you.welcome"
var tmp []rune
var wordCount map[string]int = make(map[string]int,10)
var chars []rune = []rune(str)
for i:=0; i<len(str);i++ {
if (str[i] >= 'a' && str[i] <= 'z' || str[i] >= 'A' && str[i] <= 'Z') {
tmp = append(tmp,chars[i])
}else {
word := string(tmp)
if len(word) > 0 {
count,ok := wordCount[word]
if !ok {
wordCount[word] = 1
} else {
wordCount[word] = count+1
}
}
tmp = tmp[0:0]
}
}
if len(tmp) > 0{
word := string(tmp)
if len(word) > 0 {
count,ok := wordCount[word]
if !ok {
wordCount[word] = 1
} else {
wordCount[word] = count+1
}
}
}
for key,val := range wordCount {
fmt.Printf("word:%s,出现的次数%dn",key,val)
}
}
v2函数抽象版本
func addWorld(wordCount map[string]int,chars []rune) {
word := string(chars)
if len(word) > 0 {
count,ok := wordCount[word]
if !ok {
wordCount[word] = 1
} else {
wordCount[word] = count+1
}
}
}
func main() {
str := "how are you! i am fine! thank you.welcome"
var tmp []rune
var wordCount map[string]int = make(map[string]int,10)
var chars []rune = []rune(str)
for i:=0; i<len(str);i++ {
if (str[i] >= 'a' && str[i] <= 'z' || str[i] >= 'A' && str[i] <= 'Z') {
tmp = append(tmp,chars[i])
}else {
addWorld(wordCount,tmp)
tmp = tmp[0:0]
}
}
if len(tmp) > 0{
addWorld(wordCount,tmp)
}
for key,val := range wordCount {
fmt.Printf("word:%s,出现的次数%dn",key,val)
}
}
- 字符统计(包含中文)
func addWord(charCount map[rune]int,char rune){
count,ok := charCount[char]
if !ok {
charCount[char] = 1
}else {
charCount[char] = count +1
}
}
func main() {
str := "sds sds,Let us go go go,学习好的 any sds!@lili"
var charCount map[rune]int = make(map[rune]int,10)
var chars []rune = []rune(str)
for i:=0;i<len(chars);i++ {
addWord(charCount,chars[i])
}
for key,val := range charCount {
fmt.Printf("keys:%c val: %dn",key,val)
}
}
- 实现一个学生管理系统,每个学生有分数,年级,性别,名字等信息,用户可以在控制台添加学生,修改学生信息,打印学生列表的功能
type Student struct {
Id string `json:"id"`
Name string `json:"name"`
Age int `json:"name"`
Gender string `json:"gender"`
Score float32 `json:"score"`
}
func showMenu() {
fmt.Printf("please select:n")
fmt.Printf("1. 添加学生信息n")
fmt.Printf("2. 修改学生信息n")
fmt.Printf("3. 显示学生信息n")
fmt.Printf("4. 退出n")
}
func getStudentInfo() Student {
var stu Student
fmt.Printf("please input id:n")
fmt.Scanf("%sn",&stu.Id)
fmt.Printf("please input name:n")
fmt.Scanf("%sn",&stu.Name)
fmt.Printf("please input age:n")
fmt.Scanf("%dn",&stu.Age)
fmt.Printf("please input gender:n")
fmt.Scanf("%sn",&stu.Gender)
fmt.Printf("please input score:n")
fmt.Scanf("%fn",&stu.Score)
return stu
}
func addStudent(allStudent map[string]Student) {
stu := getStudentInfo()
_,ok := allStudent[stu.Id]
if ok {
fmt.Printf("student %s is existsn",stu.Id)
return
}
allStudent[stu.Id] = stu
}
func showStudentList(allStudent map[string]Student) {
for _,val := range allStudent {
fmt.Printf("#########分隔线##########n")
fmt.Printf("id:%sn",val.Id)
fmt.Printf("name:%sn",val.Name)
fmt.Printf("age:%dn",val.Age)
fmt.Printf("gender:%sn",val.Gender)
fmt.Printf("score:%fn",val.Score)
fmt.Printf("#########分隔线##########n")
}
}
func modifyStudent(allStudent map[string]Student) {
stu := getStudentInfo()
_,ok := allStudent[stu.Id]
if !ok {
fmt.Printf("student %s is not existsn",stu.Id)
return
}
allStudent[stu.Id] = stu
}
func main() {
var allStudent map[string]Student = make(map[string]Student,100)
for {
showMenu()
var sel int
fmt.Scanf("%dn",&sel)
switch sel {
case 1:
addStudent(allStudent)
case 2:
modifyStudent(allStudent)
case 3:
showStudentList(allStudent)
case 4:
os.Exit(0)
}
}
}
- Python 里 and、or 的计算规则
- Python中赋值、浅拷贝与深拷贝
- git 简易使用说明
- 开发篇-MySQL分区(一)
- Establishing SSL connection without server's identity verification is not recommended. According to
- Django-认证系统
- javascript:双链表-插入排序
- javascript:二叉搜索树 实现
- 自然语言处理 语言模型介绍
- 口水先擦干!从大数据看外卖如何拯救“忙”与“宅”
- javascript:巧用eval函数组装表单输入项为json对象
- Django——model基础
- java学习:日期的运算
- ORACLE:写Function时,传入参数变量名的注意事项
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 解决Pytorch自定义层出现多Variable共享内存错误问题
- PHP观察者模式定义与用法实例分析
- ThinkPHP5.1表单令牌Token失效问题的解决
- PHP设计模式之工厂模式(Factory Pattern)的讲解
- keras K.function获取某层的输出操作
- 浅谈sklearn中predict与predict_proba区别
- 解决Keras中循环使用K.ctc_decode内存不释放的问题
- PDO::getAvailableDrivers讲解
- PDO::_construct讲解
- Yii2.0实现的批量更新及批量插入功能示例
- PDO::inTransaction讲解
- 小程序前后端交互使用JWT
- python文件操作seek()偏移量,读取指正到指定位置操作
- 使用OpenCV去除面积较小的连通域
- 使用vs code编辑调试php配置的方法