goland中结构体封装成json形式

golang将结构体进行排列,封装成json的形式

type Product struct {
	Name string
	ProductId int64
	Number int
	Price float64
	IsOnSale bool
}


func main()  {
	p := Product{}
	p.Name="apple"
	p.ProductId=1
	p.Number=100
	p.Price=3.45
	p.IsOnSale=false
	data, _ := json.Marshal(&p)
	fmt.Println(string(data))
}

另外一个例子

package main

import (
	"fmt"
	"net/http"
	"io"
	"github.com/tidwall/gjson"
	"strings"
)

type Maths struct {
	end string
	limit string
	math_chinese string
	math_id string
	math_link string
	math_start string
	math_value string
	math_zang string
	start string
}


func main() {


	//
	//fmt.Println("---------------",gjson.Get(jsonstr1,"richtext.data.items"))
	//
	//ParseJson(jsonstr3)

	resp, err := http.Get("")
	if err!=nil {
		fmt.Println(err)
	}

	defer resp.Body.Close()

	buf := make([]byte, 80)
	str:=""
	for ; ;  {
		n, err := resp.Body.Read(buf)
		if err==io.EOF {
			fmt.Println(err)
			break
		}
		str+=string(buf[:n])
	}

	//fmt.Println(str)
	mymath := gjson.Get(str, "data.maths.1.#.math_link").String()
	fmt.Println("---------------",mymath)
	fmt.Printf("%T\n",mymath)
	mymath=mymath[2:len(mymath)-2]
	split := strings.Split(mymath, `","`)
	//for _,v:=range split  {
	//	v=v[1:len(v)-1]
	//}
	for _,v:=range split  {
		fmt.Println(v)
	}

	//fmt.Println(split[0][2:len(split[0])-1])
	//response, err := http.Get(split[0][2:len(split[0])-1])
	//defer response.Body.Close()
	//file, err := os.Create("abc.png")
	//defer file.Close()
	//for ; ;  {
	//	n, err := response.Body.Read(buf)
	//	if err==io.EOF {
	//		fmt.Println(err)
	//		break
	//	}
	//	file.Write(buf[:n])
	//}


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Go ,如果在结构体方法的名称前带有 `*`,则表示这是一个指针方法;如果没有 `*`,则表示这是一个值方法。这是因为,方法的接收者可以是结构体的值或者是结构体的指针。 对于值方法,Go 会在调用方法时将结构体的值复制一份,传入方法内部,因此在方法内部修改结构体的值不会影响到外部的值。对于指针方法,Go 会将结构体的指针传入方法内部,因此在方法内部修改结构体的值会影响到外部的值。 因此,如果你希望在方法内部修改结构体的值,则应该使用指针方法;如果你希望方法内部的修改不影响外部的值,则应该使用值方法。 例如: ``` type Point struct { X int Y int } func (p Point) Distance() float64 { return math.Sqrt(float64(p.X*p.X + p.Y*p.Y)) } func (p *Point) Scale(factor int) { p.X *= factor p.Y *= factor } ``` 在上面的代码,`Distance` 是一个值方法,`Scale` 是一个指针方法。 ### 回答2: 在Go语言,定义结构体方法时,可以选择是否在方法的接收者类型前添加(*)。该(*)表示指针,它会影响方法的接收者是值类型还是指针类型。 如果在结构体方法的接收者类型前添加了(*),则表示该方法的接收者是结构体的指针类型。通过指针类型作为接收者,可以修改结构体员变量,并且修改的结果会影响到原始的结构体对象。这种方式常用于需要修改结构体内部数据的场景。例如: ```go type MyStruct struct { value int } func (m *MyStruct) SetValue(val int) { m.value = val } func main() { s := &MyStruct{value: 10} s.SetValue(20) fmt.Println(s.value) // 输出 20 } ``` 如果在结构体方法的接收者类型前没有添加(*),则表示该方法的接收者是结构体的值类型。通过值类型作为接收者,不会影响到原始的结构体对象,只会对该方法内部的副本进行操作。这种方式常用于不需要修改结构体内部数据,只是对结构体进行操作的场景。例如: ```go type MyStruct struct { value int } func (m MyStruct) GetValue() int { return m.value } func main() { s := MyStruct{value: 10} fmt.Println(s.GetValue()) // 输出 10 } ``` 综上所述,通过是否添加(*)可以灵活控制结构体方法的接收者类型,从而实现对结构体的不同操作。 ### 回答3: 在 Go 语言结构体是一种用户自定义的数据类型,它可以包含字段和方法。在使用 Goland 编写结构体方法时,带不带(*)有一些区别和影响。 首先,带(*)的方法是针对结构体的指针类型定义的方法,而不带(*)的方法是针对结构体值类型定义的方法。 1. 当我们使用带(*)的方法时,实际上是在传递结构体的指针给方法。这意味着我们可以在方法修改结构体的字段的值,并且这些修改将在调用方法后仍然保持。 2. 当我们使用不带(*)的方法时,实际上是在传递结构体的副本给方法。这意味着我们只能使用结构体字段的值进行操作,无法修改原始结构体的字段值。如果需要修改结构体字段的值,我们需要使用指针类型的结构体。 另外,需要注意的是,当我们使用结构体的指针类型定义方法时,对该类型的变量使用该方法时,编译器会自动将变量的指针转换为相应的结构体指针。 所以,带不带(*)的区别与影响主要在于是否能够修改结构体的字段值和操作的效率上。如果我们需要修改结构体的字段值,并且希望修改后的值在方法调用后仍然保持,那么应该使用带(*)的方法。而如果我们只需要对结构体的字段值进行操作,不需要修改原始结构体的字段值,那么可以使用不带(*)的方法,这样可以避免使用指针的额外开销。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值