Only allow access to a table via a function, not directly via queries
You need to create the function as a user that has (select) access to the underlying table. Then define the function with the option security defined which means when the function is called, it operates with the privileges of the function owner, not the caller: 

create function list_t() returns setof t 
  security definer
as $$
    select * from t;
$$ language sql stable;




Another way of doing this is to create a view, then grant SELECT privileges to the view (not the table):

create view v_t
as
select *
from t;

grant select on v_t to my_user;




Note that a set returning function should be used in the FROM clause like a table:

select *
from list_t();