golang struct
ex1
/*
https://golangbot.com/structs/
struct 结构
结构就是一组字段。
*/
package main
import "fmt"
// 声明一个结构
type Employee struct {
firstName string
lastName string
age int
}
//// 同类型简化声明
//type Employee struct {
// firstName, lastName string
// age, salary int
//}
func main() {
// 匿名结构, 不给结构名字
var employee struct {
firstName, lastName string
age int
}
employee.age = 33
fmt.Println(employee)
// 结构初始化为零値
fmt.Println("Employee:", Employee{})
}
ex2
// 创建命名结构
package main
import (
"fmt"
)
type Employee struct {
firstName, lastName string
age, salary int
}
func main() {
//使用字段名字创建结构
emp1 := Employee{
firstName: "Sam",
age: 25,
salary: 500,
lastName: "Anderson",
}
//创建结构不使用字段名字
emp2 := Employee{"Thomas", "Paul", 29, 800}
fmt.Println("Employee 1", emp1)
fmt.Println("Employee 2", emp2)
}
ex3
// 创建匿名结构
package main
import (
"fmt"
)
func main() {
emp3 := struct { // 这里定义
firstName, lastName string
age, salary int
}{ // 这里初始化
firstName: "Andreah",
lastName: "Nikola",
age: 31,
salary: 5000,
}
fmt.Println("Employee 3", emp3)
}
ex4
// 结构字段访问
package main
import (
"fmt"
)
type Employee struct {
firstName, lastName string
age, salary int
}
func main() {
emp6 := Employee{"Sam", "Anderson", 55, 6000}
fmt.Println("First Name:", emp6.firstName)
fmt.Println("Last Name:", emp6.lastName)
fmt.Println("Age:", emp6.age)
fmt.Printf("Salary: $%d", emp6.salary)
fmt.Println()
var emp7 Employee
emp7.firstName = "Jack"
emp7.lastName = "Adams"
fmt.Println("Employee 7:", emp7)
}
ex5
// 结构指针
package main
import (
"fmt"
)
type Employee struct {
firstName, lastName string
age, salary int
}
func main() {
// 这里emp8就是一个结构指针
emp8 := &Employee{"Sam", "Anderson", 55, 6000}
fmt.Println("First Name:", (*emp8).firstName) // 通过指针访问结构字段
fmt.Println("Age:", (*emp8).age)
// golang提供另一种可选方法来访问结构字段
fmt.Println("First Name:", emp8.firstName)
fmt.Println("Age:", emp8.age)
}
ex6
// 结构匿名字段
package main
import (
"fmt"
)
// 定义的结构, 包含有匿名字段
type Person struct {
string
int
}
func main() {
// 带匿名字段的结构的实例化
p1 := Person{"Naveen", 50}
fmt.Println(p1)
// 尽管匿名字段没有名字, 它的缺省名字是类型名字
p1.string = "naveen_new"
p1.int = 100
fmt.Println(p1)
}
ex7
// 结构嵌套
package main
import (
"fmt"
)
type Address struct {
city, state string
}
type Person struct {
name string
age int
address Address
}
func main() {
var p Person
p.name = "Naveen"
p.age = 50
p.address = Address {
city: "Chicago",
state: "Illinois",
}
fmt.Println("Name:", p.name)
fmt.Println("Age:",p.age)
fmt.Println("City:",p.address.city)
fmt.Println("State:",p.address.state)
}
ex8
// 结构提升字段
package main
import (
"fmt"
)
type Address struct {
city, state string
}
type Person struct {
name string
age int
Address // 当结构中, 存在一个匿名的结构型字段。 我们把这个字段叫提升字段
}
func main() {
var p Person
p.name = "Naveen"
p.age = 50
p.Address = Address{
city: "Chicago",
state: "Illinois",
}
fmt.Println("Name:", p.name)
fmt.Println("Age:", p.age)
fmt.Println("City:", p.city) //这个字段,直接提升到上一级,可以直接访问
fmt.Println("State:", p.state) //这个字段,直接提升到上一级,可以直接访问
fmt.Println("City:", p.Address.city)
fmt.Println("State:", p.Address.state)
}
ex9
// 结构导出<即外部可访问性>
package main
import (
"fmt"
)
// 当前结构首字母大写, 则外部包可以访问
type Address struct {
// 字段同理
City, state string
}
type Person struct {
name string
age int
Address // 当结构中, 存在一个匿名的结构型字段。 我们把这个字段叫提升字段
}
func main() {
var p Person
p.name = "Naveen"
p.age = 50
p.Address = Address{
City: "Chicago",
state: "Illinois",
}
fmt.Println(p)
}
ex10
// 结构相等
// 结构是值类型,可以直接比较(仅当他们字段可以比较时)
package main
import (
"fmt"
)
type name struct {
firstName string
lastName string
}
type image struct {
data map[int]int // 这个字段是不可比较的
}
func main() {
name1 := name{"Steve", "Jobs"}
name2 := name{"Steve", "Jobs"}
if name1 == name2 {
fmt.Println("name1 and name2 are equal")
} else {
fmt.Println("name1 and name2 are not equal")
}
name3 := name{firstName:"Steve", lastName:"Jobs"}
name4 := name{}
name4.firstName = "Steve"
if name3 == name4 {
fmt.Println("name3 and name4 are equal")
} else {
fmt.Println("name3 and name4 are not equal")
}
// 不可比较情况
//image1 := image{data: map[int]int{
// 0: 155,
//}}
//image2 := image{data: map[int]int{
// 0: 155,
//}}
//// 这里直接报错
//if image1 == image2 {
// fmt.Println("image1 and image2 are equal")
//}
}
golang struct的更多相关文章
- Golang Struct 声明和使用
Golang Struct 声明和使用 Go可以声明自定义的数据类型,组合一个或多个类型,可以包含内置类型和用户自定义的类型,可以像内置类型一样使用struct类型 Struct 声明 具体的语法 t ...
- golang struct扩展函数参数命名警告
今天在使用VSCode编写golang代码时,定义一个struct,扩展几个方法,如下: package storage import ( "fmt" "github.c ...
- golang struct tag
golang可以在struct中的每个字段,写上一个tag.这个tag可以通过反射的机制获取到,最常用的场景就是json序列化和反序列化 package main import ( "enc ...
- [Golang] struct Tag说明
在处理json格式字符串的时候,经常会看到声明struct结构的时候,属性的右侧还有小米点括起来的内容.形如 type User struct { UserId int `json:"use ...
- golang struct组合,转型问题请教
type Action interface { OnHurt2(other Action) GetDamage() int } type Base struct { atk, hp int } fun ...
- golang struct 转map 及 map[string]*Struct 初始化和遍历
package main import ( "encoding/json" "errors" "fmt" "reflect&quo ...
- 【GoLang】GoLang struct 使用
代码示例: package main import "fmt" type Human struct { name string age int weight int } type ...
- Golang struct结构
结构struct Go中的struct与C中的struct非常相似,并且Go没有class,代替了class的位置,但并没有代替class的功能 使用type struct{} 定义结构,名称遵循可见 ...
- golang struct 和 byte互转
相比于encoding, 使用unsafe性能更高 type MyStruct struct { A int B int } var sizeOfMyStruct = int(unsafe.Sizeo ...
随机推荐
- python中对文件和文件夹的操作
一.说明 python中主要通过os模块和shutil模块两个模块对文件进行相关操作,移动.复制.删除.重命名.比较大的文件通过命令操作可以节省时间,提高效率. 二.实例对文件夹中文件的拷贝 from ...
- Cognos无法解密来着内容库的用户名和密码凭证
1. 问题描述 启动Cognos失败,报错代码为QE-DEF-0368. 2. 问题分析 Frame Work和Cognos Server安装在不同的目录和/或不同的机器上. 3. 解决方案 需要把S ...
- bind与继承 待研究
class a { f() { console.log('a') } get f2() { console.log('f2') return (this['f'] = this.f.bind(this ...
- PROJ.4学习——地图投影
PROJ.4学习——地图投影(坐标系投影) 前言 PROJ是由大量的基础投影库构成.这里主要讨论学习PROJ库的相关参数. 这里大部分是讲如何将3D坐标系投影到2D平面上.投影时,涉及到基准线,单位, ...
- Spring Boot 小技巧
初始化数据 我们在做测试的时候经常需要初始化导入一些数据,如何来处理呢?会有两种选择,一种是使用 Jpa,另外一种是 Spring JDBC .两种方式各有区别下面来详细介绍. 使用 Jpa 在使用s ...
- echarts x和y去掉
解决方法 "axisLine": { "show": false },
- 共识机制:AngelToken技术的根基
共识机制是区块链技术的一个核心问题,它决定了区块链中区块的生成法则,保证了各节点的诚实性.账本的容错性和系统的稳健性. 常用的共识机制主要有 PoW.PoS.DPoS.Paxos.PBFT等. 基于区 ...
- 关于javascript中arguments的一个很好的例子
金克斯的迫击炮! 实现一个摧毁(destroyer)函数,第一个参数是待摧毁的数组,其余的参数是待摧毁的值 函数中的有隐式的不确定个数的参数,而我们在函数中将会用到它,很显然,这需要我们在 argum ...
- Event Loop
Event Loop 是 JavaScript 异步编程的核心思想,也是前端进阶必须跨越的一关.同时,它又是面试的必考点,特别是在 Promise 出现之后,各种各样的面试题层出不穷,花样百出.这篇文 ...
- python之路-----python操作 mysql
========================pymysql============================ 一.pymysql 基础 安装命令:pip3 install pymysql - ...