Golang中结构体初始化的理解与求助

Golang中结构体初始化的理解与求助 大家好,

我是Go语言的新手,我参考另一个文件中的函数和结构体编写了一个小脚本。我可以通过默认的结构体初始化来运行脚本。

主脚本

package main

import (
    "fmt"
    "local/find"
)

func main() {
    d := find.Sam{}

    for i := 0; i < 100; i++ {
        if find.Odd(i) {
            fmt.Println("even number", i)
        } else {
            fmt.Println("odd number", i)
        }
        fmt.Println("Finding the number", d.Add(i, 2))
    }
}

--------包

package find

type Sam struct {
    j int
}

func Odd(a int) bool {
    if a%2 == 0 {
        return true
    } else {
        return false
    }
}

func (d *Sam) Add(a, b int) int {
    d.j = a + b + d.j
    return d.j
}

我想将 j 初始化为 100,现在如果初始化为 10 会出错。


更多关于Golang中结构体初始化的理解与求助的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

找到了解决方案,问题出在声明上,应该使用大写字母。

package find

type Sam struct {
	J int
}

func Odd(a int) bool {
	if a%2 == 0 {
		return true
	} else {
		return false
	}
}

func (d *Sam) Add(a, b int) int {
	d.J = a + b + d.J
	return d.J
}

package main

import (
	"fmt"
	"local/find"
)

func main() {
	d := find.Sam{J: 300}
	for i := 0; i < 100; i++ {
		if find.Odd(i) {
			fmt.Println("even number", i)
		} else {
			fmt.Println("odd number", i)
		}
		fmt.Println("Finding the number", d.Add(i, 2))
	}
}

更多关于Golang中结构体初始化的理解与求助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go语言中,结构体字段默认初始化为零值。你的Sam结构体中的j字段是int类型,默认初始化为0。要将其初始化为特定值,有几种方法:

方法1:使用结构体字面量初始化

package main

import (
    "fmt"
    "local/find"
)

func main() {
    // 初始化j为100
    d := find.Sam{j: 100}
    
    for i := 0; i < 100; i++ {
        if find.Odd(i) {
            fmt.Println("even number", i)
        } else {
            fmt.Println("odd number", i)
        }
        fmt.Println("Finding the number", d.Add(i, 2))
    }
}

方法2:创建构造函数

find包中添加构造函数:

package find

type Sam struct {
    j int
}

// 构造函数,可以设置初始值
func NewSam(initialValue int) *Sam {
    return &Sam{j: initialValue}
}

func Odd(a int) bool {
    return a%2 == 0
}

func (d *Sam) Add(a, b int) int {
    d.j = a + b + d.j
    return d.j
}

然后在主程序中使用:

package main

import (
    "fmt"
    "local/find"
)

func main() {
    // 使用构造函数初始化j为100
    d := find.NewSam(100)
    
    for i := 0; i < 100; i++ {
        if find.Odd(i) {
            fmt.Println("even number", i)
        } else {
            fmt.Println("odd number", i)
        }
        fmt.Println("Finding the number", d.Add(i, 2))
    }
}

方法3:直接修改字段

如果j字段是导出的(首字母大写),可以直接设置:

package find

type Sam struct {
    J int  // 首字母大写,导出字段
}

func Odd(a int) bool {
    return a%2 == 0
}

func (d *Sam) Add(a, b int) int {
    d.J = a + b + d.J
    return d.J
}
package main

import (
    "fmt"
    "local/find"
)

func main() {
    d := &find.Sam{J: 100}  // 直接设置初始值
    
    for i := 0; i < 100; i++ {
        if find.Odd(i) {
            fmt.Println("even number", i)
        } else {
            fmt.Println("odd number", i)
        }
        fmt.Println("Finding the number", d.Add(i, 2))
    }
}

注意:你的Odd函数逻辑有误,判断偶数的函数返回true,但打印的是"even number",这会导致逻辑相反。正确的Odd函数应该是:

func Odd(a int) bool {
    return a%2 != 0  // 奇数返回true
}

或者重命名为IsEven

func IsEven(a int) bool {
    return a%2 == 0  // 偶数返回true
}
回到顶部