List inside struct

168 views
Skip to first unread message

Shyaka

unread,
Aug 29, 2020, 4:01:44 PM8/29/20
to golang-nuts
Hello, I need help, I have a struct Person wiith list inside, I add 5 string on list at the end I found that the list is nil, I don't know whre is the error, any help is appreciated.

package main

import (
    "container/list"
    "fmt"
)

type Persons struct {
    name  string
    Names list.List
}

func main() {

    p := &Persons{
        name:  "",
        Names: *list.New(),
    }
    p.setName("John Peter")
    p.add("one")
    p.add("two")
    p.add("three")
    p.add("four")
    p.add("five")
    p.display()

}

func (p *Persons) setName(name string) {
    p.name = name
}
func (p *Persons) add(name string) {
    p.Names.PushBack(name)
}
func (p *Persons) display() {
    fmt.Println(p.name)
    for e := p.Names.Front(); e != nil; e = e.Next() {
        fmt.Println(e.Value)
    }
}

Jan Mercl

unread,
Aug 29, 2020, 4:34:31 PM8/29/20
to Shyaka, golang-nuts
On Sat, Aug 29, 2020 at 10:01 PM Shyaka <rene...@gmail.com> wrote:
> Hello, I need help, I have a struct Person wiith list inside, I add 5 string on list at the end I found that the list is nil, I don't know whre is the error, any help is appreciated.

I don't know why you code doesn't work, but as a first thing I just
changed it mechanically in way I would write it - and it seems to work
now: https://play.golang.org/p/NKyOQuM-GWc

burak serdar

unread,
Aug 29, 2020, 5:01:48 PM8/29/20
to Shyaka, golang-nuts
On Sat, Aug 29, 2020 at 2:01 PM Shyaka <rene...@gmail.com> wrote:
>
> Hello, I need help, I have a struct Person wiith list inside, I add 5 string on list at the end I found that the list is nil, I don't know whre is the error, any help is appreciated.
>
> package main
>
> import (
> "container/list"
> "fmt"
> )
>
> type Persons struct {
> name string
> Names list.List
> }
>
> func main() {
>
> p := &Persons{
> name: "",
> Names: *list.New(),
> }

Your program doesn't work because of the above line. list.New()
creates a new list containing the head/tail pointers within an Element
instance, both pointing to the list created by list.New() by
reference. They do not point to p.Names. When you add elements, those
are added to the list returned by list.New(), not to Person.Names, but
the size of Person.Names is incremented with each addition.

Do not use list.New(), leave the Names uninitialized. It will
initialize correctly the first time you add an element to it.


> p.setName("John Peter")
> p.add("one")
> p.add("two")
> p.add("three")
> p.add("four")
> p.add("five")
> p.display()
>
> }
>
> func (p *Persons) setName(name string) {
> p.name = name
> }
> func (p *Persons) add(name string) {
> p.Names.PushBack(name)
> }
> func (p *Persons) display() {
> fmt.Println(p.name)
> for e := p.Names.Front(); e != nil; e = e.Next() {
> fmt.Println(e.Value)
> }
> }
>
> --
> You received this message because you are subscribed to the Google Groups "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts...@googlegroups.com.
> To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/e8975da6-9af2-4660-8dbb-1a7e7e9b67cfn%40googlegroups.com.

Siddhesh Divekar

unread,
Aug 29, 2020, 8:03:36 PM8/29/20
to burak serdar, Shyaka, golang-nuts
Shyaka,

The list package does all operation on list pointer.
In your case, I think you are passing list object instead of pointer.

You have defined your structure as:-

type Persons struct {
    name  string
    Names list.List <<<<<<<<<<<<< Its a list object and not a pointer to list object.
}

Then you assign a list object to it.
    p := &Persons{
        name:  "",
        Names: *list.New(),
    }

All your operations are on Names list object & due to that its not getting passed as reference to PushBack &
you don't see desired result.

The fix would be to make your list a pointer.

type Persons struct {
    name  string
    Names *list.List<--------------------- Make it a pointer.

}

func main() {

    p := &Persons{
        name:  "",
        Names: list.New(), <------------- Create a new list 
    }

With these two changes its working as expected.




--
-Siddhesh.

Bakul Shah

unread,
Aug 29, 2020, 9:00:21 PM8/29/20
to Shyaka, golang-nuts
Unless there is a very strong reason to use a doubly linked list, you should just use a slice:

type Persons struct { name string; Names []string }

I redid your program using the above here: https://play.golang.org/p/x5I1wYiCNGA 

Sounds like you are coming from some object oriented language background.
Suggest reading "Effective Go": https://golang.org/doc/effective_go.html

Shyaka Rene

unread,
Aug 30, 2020, 5:57:22 AM8/30/20
to Bakul Shah, golang-nuts
Thank you, it worked, everything is automatic in Go when you come from Rust and Java, Thank you again
Reply all
Reply to author
Forward
0 new messages